协助一个简单的算法

时间:2012-02-08 23:07:49

标签: algorithm

我目前正在从亚马逊购买的一本书中学习算法,但它是世界上最差的书,它显示了一些例子,但关键的是没有说明如何解决这些问题。

所以我的第一个问题是,

Prefix-Match(T[1..n], P[1..m]) {
i := 1 // point to current position in T[]
while(i <= n) {
// find a match for first character of P
while( i <= n && T[i] != P[1]) i++
if (i > n) return; // quit
len := 1
// match as much as possible
while(len < m && i+len <= n && T[i+len] == P[1+len]) len++
output i, len
i++
}

如果T = [a,b,a,b,c,a,b]并且P = [a,b,a],该程序的输出是什么?

其次,我如何根据m和n计算算法的时间复杂度?

2 个答案:

答案 0 :(得分:1)

  

该程序的输出是什么?T = [a,b,a,b,c,a,b]和P   = [a,b,a] ???

初学者的方法是拿笔和纸张为每个变量创建一个插槽。然后像计算机一样遍历每个语句,并根据语句执行更改写入的变量值。

例如,如果你从上面的T和P开始,你首先要设置T,n,P和m的值,在{{1}的插槽中通过i := 11来设置i然后你会通过while(i <= n) {因为(1是&lt; n)等等......

当你这样做几次时,你将能够更快地做到这一点。

我目前正在从亚马逊购买的一本书中学习算法,但它是世界上最差的书,它显示了一些例子,但关键的是没有说明如何解决这些问题。

所以我的第一个问题是,

 Prefix-Match(T[1..n], P[1..m]) {
  i := 1 // point to current position in T[]
  while(i <= n) {
     // find a match for first character of P
     while( i <= n && T[i] != P[1]) i++
     if (i > n) return; // quit
     len := 1
     // match as much as possible
     while(len < m && i+len <= n && T[i+len] == P[1+len]) len++
     output i, len
     i++
 }

这个程序的输出是什么?T = [a,b,a,b,c,a,b]和P = [a,b,a] ???

  

其次,我如何计算算法的时间复杂度   m和n的条件?

我不相信你已经准备好锻炼时间的复杂性,但想想m和n如何影响算法所花费的最长时间(或者手动做多长时间):

  • 是否依赖于m
  • 是否依赖于n
  • 如果它取决于它是m+n上的函数还是更像m*n?也就是说,对于相同的T sizt和P的两倍,它需要两倍的时间?

答案 1 :(得分:0)

首先是一个问题:你在谈论什么书?如果这只是一个代码示例,那么它必须是可怕的......

现在回答:

  • 此函数遍历T的每个元素(这是第一个while循环),
  • 然后它找到P的第一个元素的第一个出现在从“i”到表T的末尾的范围内。在这种情况下i = 1,因为T[1] == P[1](如果T确实如此)不包含P的第一个元素,那么函数只返回),
  • 然后查看从i开始的T中有多少元素匹配P中的后续元素(意味着它将采用元素T[i+1]并检查它是否与P[2]匹配与T[i+2]P[3]),
  • 相同
  • 然后打印出找到的i以及找到的匹配数。

基本上这个函数找到匹配P的T的所有子集。确切的输出应该如下所示:

1, 3
3, 2
6, 2

Tldr:第一个数字是元素P[1]在表T中的索引,第二个数字是跟随它的元素数量等于表P中的元素。

但是我不知道作者的意图是什么 - 从我的理解中发现的子集不必与P集完全匹配,即如果我们采用:T = [a,c,a]P = [a,b,a]我们会仍然得到输出1,3。如果T中找到的子集的后续元素与P中的对应元素不同,则没有元素可以打破循环。

关于时间复杂性,网上有很多文章。如果你想要一本书,那么CLRS算法或算法设计手册简介是我的最爱。