大O符号是什么? 你用它吗?

这个问题在这里已经有了答案:

  • “大O”符号的简单英文解释是什么? 36个答案

  • 大多数人在谈论Big-O时都忘记了一件重要的事情,因此我觉得有必要提一下:

    您不能使用Big-O来比较两种算法的速度 。 Big-O只会说如果您处理的项目数增加了一倍,算法的速度会变慢(大约),或者如果您将数量减半,速度会快多少。

    然而,如果你有两种完全不同的算法,其中一个( A )是O(n^2) ,另一个( B )是O(log n) ,并不是说AB慢。 实际上,有100个项目, A可能比B快十倍。 它只是说有200个项目, A会增长慢因子n^2B会增长慢因子log n 。 所以,如果你对两者进行基准测试,并且知道A需要多少时间来处理100个物品,并且B需要多少时间才能完成相同的100个物品,并且AB快,那么可以计算出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次,而具有setCapacityStringBuilder将执行1000次操作来执行相同的操作。 这是粗略的估计,但O(n)符号是关于量级的顺序,而不是确切的运行时间。

    这不是我经常使用的东西。 然而,当我试图找出做某件事的最佳算法时,我一直在想。


    Big-O已经在八岁时问过一个类似的问题? 希望那里的答案能回答你的问题,尽管问题提问者确实有一些关于它的数学知识,如果你需要更全面的解释,你可能没有这么明确。

    链接地址: http://www.djcxy.com/p/6741.html

    上一篇: What is Big O notation? Do you use it?

    下一篇: O for Eight Year Olds?