我目前正在从亚马逊购买的一本书中学习算法,但它是世界上最差的书,它显示了一些例子,但关键的是没有说明如何解决这些问题。
所以我的第一个问题是,
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计算算法的时间复杂度?
答案 0 :(得分:1)
该程序的输出是什么?T = [a,b,a,b,c,a,b]和P = [a,b,a] ???
初学者的方法是拿笔和纸张为每个变量创建一个插槽。然后像计算机一样遍历每个语句,并根据语句执行更改写入的变量值。
例如,如果你从上面的T和P开始,你首先要设置T,n,P和m的值,在{{1}的插槽中通过i := 1
写1
来设置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)
首先是一个问题:你在谈论什么书?如果这只是一个代码示例,那么它必须是可怕的......
现在回答:
while
循环),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算法或算法设计手册简介是我的最爱。