我一直在做Big-O的自学。我理解如何给算法提供以下符号的示例:
O(N):
for(int i = 0; i < n; i++)
sum++;
O(N ^ 2):
for(int i = 0; i < n; i++)
for( int j = 0; j < n; j++)
sum++;
O(N ^ 3):
for(int i = 0; i < n; i++)
for( int j = 0; j < n * n; j++)
sum++;
我遇到过这些我不太了解的符号。如何根据算法提供这些示例?
也许我应该这样说:写一个算法,它将运行时间按比例分配:
答案 0 :(得分:9)
我担心你误解了“Big-O”符号。
符号不作为算法“表达”。相反,Big-O表示法描述算法的属性。
所以它不是“O(N)可以表示为XXX”,而是“算法XXX具有O(N)的复杂性”。
也就是说,要求具有一定复杂度的算法示例是非常合理的; 你已经列出了一些。解决您的问题:
O(4 ^ n)与O(e ^ n)相同,通常写为O(exp(n))(试着理解为什么它是相同的)。 O( 4 ^ n)属于具有“指数复杂度”(EXPTIME)的算法类。数学/ CS中的许多重要问题具有指数复杂性(或几乎指数复杂性)。
具有指数复杂性的算法例如是discrete logarithm problem的天真解决方案。
对于其他复杂情况,我不能举一个例子,但你可能会通过谷歌搜索找到一个。
答案 1 :(得分:-1)
你给出的算法严格来说不是Big-O而是Theta。 Big-O是一个渐近上界,意味着在某些更糟糕的情况下输入运行时间将是给定的但不适用于所有输入,其中Theta是一个紧密限制意味着运行时间总是那样。例如,考虑给出已经排序的列表作为输入的排序算法,或者搜索算法,其中要找到的东西是列表中的第一个元素(在这种情况下,binarysearch如何与线性搜索比较)。