Java 大O-适合新手

Java 大O-适合新手,java,algorithm,big-o,Java,Algorithm,Big O,可能重复: 最近有人问我关于如何使用大O符号的知识,我被难倒了,因为我以前从未遇到过大O。我已经阅读了Stackoverflow中发布的一些问题,但我就是不明白 我的问题:是否有人能以最简单的形式解释Big O,并举例说明如何在以下Java方法中使用它: public int getScore(int[] dice) { int[][] dups; dups = possibleDups(dice); // Set catScore for (int[] i

可能重复:

最近有人问我关于如何使用大O符号的知识,我被难倒了,因为我以前从未遇到过大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);
}
public int getScore(int[]骰子)
{
int[][]重复序列;
dups=可能的dups(骰子);
//设置catScore
对于(int[]i:dups)
{
for(int k=0;k0)
{
开关(i[k]){
案例1:
catScore=类别1;
打破
案例2:
catScore=Category.TWOS;
打破
案例3:
catScore=类别3;
打破
案例4:
catScore=类别4;
打破
案例5:
catScore=类别5;
打破
案例6:
catScore=类别6;
打破
案例7:
catScore=类别7;
打破
案例8:
catScore=类别8;
打破
违约:
catScore=类别。无;
打破
}
}
}
}
返回sumAll(骰子);
}

大O是执行算法的最坏情况。您应该了解循环如何依赖于内部循环。样本:

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

对于(int i=0;i在计算机科学中,一个大的兴趣领域是“事情运行需要多长时间?”。很多时候的答案是“它取决于输入的大小(但可能不是)”。Big Oh是一个函数,具体描述了算法运行多长时间的上限。这里有一些数学细节(极限、渐近线等),但这是一个非常基本的观点

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


对于映射,查找是固定时间(假设是)。在这种情况下,映射查找的运行时间是O(c),与O(1)相同.

大O表示法详细说明了解决方案的时间与集合中的项数之间的比例差异。它实际上没有说明解决方案解决问题所需的时间,但它详细说明了当您知道固定点的时间和需要的其他项数时,解决方案的时间增长速度我们可能会补充

所以,如果煮一杯咖啡总是需要5分钟的时间,那么计算一个大的O解是不够的,但是如果煮一杯咖啡需要5分钟,煮十杯咖啡需要5分钟,煮一百万杯咖啡需要5分钟,那么它就是O(1),其中1表示一个时间单位

现在如果你有一个单杯咖啡机,大约需要两分钟来煮一杯咖啡,四分钟来煮两杯咖啡,二十分钟来煮十杯咖啡,那么煮咖啡的时间与杯子的数量成正比,用大的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)无论实际时间单位有多大或多小。

有很多资源可以解释大O,我认为重复它们不会有助于您理解它。因此,您能否具体说明您“不理解”的具体内容?至于方法的大O复杂性,这取决于possibleDups()和sumAll()的大O,因此您还必须提供这些方法的定义实际上,通过指出我需要提供在方法本身中调用的其他两个方法,可以帮助我理解计算所需的依赖关系。谢谢。@Curtis Ashby:请注意,您的示例中的开关案例非常愚蠢。整个开关可以在两三行代码中更干净地重写。见鬼,如果您在对于枚举和三元运算符,它可以在一行中重写。实际上,因为您硬编码了n,所以它是O(1)这只是一个如何计算O的想法@amit:所以如果我写int n=10000,然后写三个嵌套循环,在三个循环中有1万亿次代码执行,但仍然是O(1)事实上,我从来没有这样想过我的算法的复杂性,即使在我知道我的n的时候。你真的确定它是正确的吗?我不是说它不正确:它是j