大O符号是什么? 你用它吗?
这个问题在这里已经有了答案:
大多数人在谈论Big-O时都忘记了一件重要的事情,因此我觉得有必要提一下:
您不能使用Big-O来比较两种算法的速度 。 Big-O只会说如果您处理的项目数增加了一倍,算法的速度会变慢(大约),或者如果您将数量减半,速度会快多少。
然而,如果你有两种完全不同的算法,其中一个( A
)是O(n^2)
,另一个( B
)是O(log n)
,并不是说A
比B
慢。 实际上,有100个项目, A
可能比B
快十倍。 它只是说有200个项目, A
会增长慢因子n^2
和B
会增长慢因子log n
。 所以,如果你对两者进行基准测试,并且知道A
需要多少时间来处理100个物品,并且B
需要多少时间才能完成相同的100个物品,并且A
比B
快,那么可以计算出B
会超过A
的物品数量在速度(如速度B
降低比的一个慢得多的A
,将超车A
迟早-这是肯定的)。
大O符号表示算法的限制因素。 它是一个算法运行时间如何与输入相关的简化表达式。
例如(在Java中):
/** Takes an array of strings and concatenates them
* This is a silly way of doing things but it gets the
* point across hopefully
* @param strings the array of strings to concatenate
* @returns a string that is a result of the concatenation of all the strings
* in the array
*/
public static String badConcat(String[] Strings){
String totalString = "";
for(String s : strings) {
for(int i = 0; i < s.length(); i++){
totalString += s.charAt(i);
}
}
return totalString;
}
现在想想这实际上在做什么。 它正在经历输入的每个字符并将它们加在一起。 这似乎很简单。 问题在于String是不可变的 。 所以每次你在字符串中添加一个字母,你都必须创建一个新的字符串。 为此,您必须将旧字符串中的值复制到新字符串中并添加新字符。
这意味着您将复制第一个字母n次,其中n是输入中的字符数。 你会复制n-1
次的字符,所以总共会有(n-1)(n/2)
副本。
这是(n^2-n)/2
,对于Big O符号,我们只使用最高的幅度因子(通常),并丢弃与它相乘的所有常量,最后以O(n^2)
。
使用类似于StringBuilder
东西将沿着O(nLog(n))的方向行进。 如果你计算开始时的字符数并设置StringBuilder
的容量,你可以将其设置为O(n)
。
因此,如果我们有1000个字符的输入,第一个示例将执行大约一百万次操作, StringBuilder
将执行10,000次,而具有setCapacity
的StringBuilder
将执行1000次操作来执行相同的操作。 这是粗略的估计,但O(n)
符号是关于量级的顺序,而不是确切的运行时间。
这不是我经常使用的东西。 然而,当我试图找出做某件事的最佳算法时,我一直在想。
Big-O已经在八岁时问过一个类似的问题? 希望那里的答案能回答你的问题,尽管问题提问者确实有一些关于它的数学知识,如果你需要更全面的解释,你可能没有这么明确。
链接地址: http://www.djcxy.com/p/6741.html