所以,在我的数据结构课上,我们最近学习了算法分析和 Big-O 分析。到目前为止,我们实际上只将其应用于排序算法,分析起来相对简单。我很好奇如何分析更复杂的算法。
例如,我为我正在编写的程序编写了这个 python 算法,用于从文件中读取所有字节,并使用分隔数据的 4 字节标签将它们分成块。每个标签都以“h”开头,我有一个单独的可能标签列表,用于确定 4 字节序列是否为标签。算法定义如下
data = file.read()
blocks = []
tagIndexes = []
i = data.index(b'h')
try:
while 1:
if data[i:i+4] in tags:
tagIndexes += [i]
i = data.index(b'h', i+1)
except ValueError:
pass
for j in range(len(tagIndexes) - 1):
index = tagIndexes[j]
nextIndex = tagIndexes[j+1]
blocks += [block(data[index:index+4], data[index+4:nextIndex])]
lastIndex = tagIndexes[len(tagIndexes) - 1]
blocks += [block(data[lastIndex:lastIndex+4], data[lastIndex+4:])]
return blocks
我不是在询问有关如何改进算法的评论。如果以后有必要,我可以自己做。我的问题是如何确定该算法的最坏情况或 Big-O 表示法。其中有几个子算法,对于大多数较小的算法,很容易看到最坏的情况。例如,python 的 list.index(val) 方法的最坏情况是如果列表中没有指定的值,在这种情况下,它只会循环整个事物并引发错误 O(n)。但是,围绕该方法循环的最坏情况是,如果每个字节都是“h”O(n)。但在这种情况下,对 data.index() 的每次调用都会非常快并立即返回 O(1) 值。然后第二个循环的最坏情况是如果每 4 个字节是一个标记 O(n/4)。
对于包含整个算法的最坏情况,我该如何分析,而不仅仅是部分?