大O - 适合新手

时间:2011-07-01 14:56:31

标签: java algorithm big-o

  

可能重复:
  Plain English explanation of Big O

最近我被问及关于如何使用Big O符号的知识,因为我之前从未遇到过Big O,所以我很难过。我已经阅读了Wikipedia page about Big O并查看了Stackoverflow中发布的一些问题,但我只是不明白。

我的问题:有人可以用最简单的形式提供Big O的解释,并提供一个如何在以下Java方法中使用它的示例:

public int getScore(int[] dice)
{
    int[][] dups;

    dups = possibleDups(dice);

    // Set catScore
    for (int[] i : dups)
    {
        for (int k = 0; k < i.length; k++)
        {
            if (i[k] > 0)
            {
                switch (i[k]) {
                case 1:
                    catScore = Category.ONES;
                    break;
                case 2:
                    catScore = Category.TWOS;
                    break;
                case 3:
                    catScore = Category.THREES;
                    break;
                case 4:
                    catScore = Category.FOURS;
                    break;
                case 5:
                    catScore = Category.FIVES;
                    break;
                case 6:
                    catScore = Category.SIXES;
                    break;
                case 7:
                    catScore = Category.SEVENS;
                    break;
                case 8:
                    catScore = Category.EIGHTS;
                    break;
                default:
                    catScore = Category.NONE;
                    break;
                }
            }
        }
    }

    return sumAll(dice);
}

3 个答案:

答案 0 :(得分:6)

Big O表示法详细说明了解决方案时间与集合中项目数量的比例差异。它实际上并没有说明解决方案解决问题所需的时间,但它详细说明了当您知道固定点的时间以及可能添加的其他项目时,解决方案的时间会有多快。

所以,如果咖啡一直需要5分钟,那么计算大O解决方案的信息不足,但如果需要5分钟才能制作咖啡,5分钟可以制作10杯咖啡,5分钟可以制作一百万份咖啡,然后是O(1),其中1表示一个时间单位。

现在,如果您有一个单杯咖啡机,大约需要两分钟来制作一杯咖啡,四分钟可以制作两杯咖啡,二十分钟可以制作十杯咖啡,那么就可以了一些咖啡与杯子的数量成正比,使得大O符号O(x),意味着你需要X(每个咖啡一个)的时间单位。

其他大O符号是常见的,O(x ^ 2)O(xlog(x))等。它们都根据所考虑的元素数量来描述时间增长的比例。

请注意,对于一些小的项目集合,O(1)可能比O(x)解决方案慢,因为我们讨论的是时间单位,而不是实际时间。因此,特定O(1)中的时间单位可能是一小时,而O(x)解决方案中的特定时间单位可能是十分钟。在这种情况下,O(x)解决方案可能会更快,直到您需要处理六个或更多项目。从长远来看,无论实际时间单位有多大或多小,具有较低权力的大O项(如O(1))总是优于具有较高权力O(x)的项。

答案 1 :(得分:2)

Big O是算法执行的最糟糕情况。你应该看看你如何循环取决于内循环。样品:

public void doSomething(int n){
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
}

最坏情况是100次迭代。将 n 更改为20,然后将最差情况更改为400次。

这是O(n ^ 2)。

答案 2 :(得分:0)

在计算机科学领域,人们感兴趣的是“运行需要多长时间?”。很多时候答案是“这取决于输入的大小(但可能不是)”。 Big-Oh特别是一个描述上限的函数,用于算法运行多长时间。那里有一些数学细节(限制,渐近线等),但这是一个非常基本的观点。

在您的示例中,您循环遍历列表,然后对于该列表中的所有内容,您循环遍历另一个列表。因此,算法运行所需的时间与列表的大小成正比。如果你认为列表中有'n'个东西,而你的第二个列表中有m个东西,你的算法的运行时间是O(m * n)。如果m~n,那么也可以准确地说O(n ^ 2)。

对于地图,查找是恒定时间(假设它们是)。在这种情况下,Map查找的运行时间就是O(c),它与O(1)相同。

相关问题