Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么程序员更喜欢O(N^3)而不是O(N^2)_Algorithm_Time_Big O_Time Complexity - Fatal编程技术网

Algorithm 为什么程序员更喜欢O(N^3)而不是O(N^2)

Algorithm 为什么程序员更喜欢O(N^3)而不是O(N^2),algorithm,time,big-o,time-complexity,Algorithm,Time,Big O,Time Complexity,我在准备期末考试,档案中有一个问题我找不到答案: 一种算法运行时间的增长顺序为O(N^2);这个 第二个算法的运行时间的增长顺序是O(N^3)。列表 三个令人信服的(逻辑的,令人信服的)理由为什么程序员会 更喜欢使用O(N^3)算法而不是O(N^2)算法 我可以想到以下三个原因: 易于初始实施 便于将来的维护 O(N^3)算法可能比O(N^2)算法具有更低的空间复杂度(即,它使用更少的内存) 可能是#1原因:因为O(N2)算法有足够高的常数,对于预期任务的大小,O(N3)版本更快。另一件事是,

我在准备期末考试,档案中有一个问题我找不到答案:

一种算法运行时间的增长顺序为O(N^2);这个 第二个算法的运行时间的增长顺序是O(N^3)。列表 三个令人信服的(逻辑的,令人信服的)理由为什么程序员会 更喜欢使用O(N^3)算法而不是O(N^2)算法


我可以想到以下三个原因:

  • 易于初始实施
  • 便于将来的维护
  • O(N^3)算法可能比O(N^2)算法具有更低的空间复杂度(即,它使用更少的内存)

可能是#1原因:因为O(N2)算法有足够高的常数,对于预期任务的大小,O(N3)版本更快。

另一件事是,一些算法有一个大的常数因子。
a
O(N^2)
可能有一个很大的常数因子,这使得它无法实际使用(如果
N
足够小,正如托班所指出的)

以下是一些例子,让你相信O(N³)在某些情况下比O(N²)更好

  • O(N²)算法编码非常复杂,而如果输入大小为N≤ 100那么对于实际使用,O(N³)可以足够快

  • O(N²)有一个大常数乘以它,例如c=1000,因此N=100,c⋅N²=1000⋅100² = 10⁷ 如果c=1,则 O(N³)然后c⋅N³=10⁶

  • 与O(N³)算法相比,O(N²)算法具有非常高的空间复杂度


  • 除了已经发布的答案之外,我还想提到缓存行为。由于重复的缓存未命中,特定的内存访问模式可能会慢得多,因此理论上更慢的算法和更友好的缓存访问模式的性能要好得多。

    选择一种算法的唯一原因不是运行时间的增长顺序。您必须分析:

    • 这是多么容易实现啊
    • 所需的空间
    • 现实生活中的输入有多大(有时,只有在实际中从未出现过的输入大小时,才能观察到时间差)

    在最坏的情况下,Big-O是一个上限。快速排序是O(n^2)时间,合并排序是O(n lgn)时间。但人们使用快速排序是因为平均而言,它是O(nlgn),常数比MergseSort低。

    4。n很小(所以这并不重要)@DSM这只是一个很好的理由,如果大小足够小,常数占主导地位,因此由#4覆盖。@delnan:#4是一个先决条件(对于“小”的适当意义),但#4没有覆盖它。不过,这没关系,因为两个不同的答案现在达到了相同的点。如果输入n足够小,这不是一个例子。在你的头脑中划分
    100000/10
    。现在在纸上用长除法。哪个更快?在你的头脑中划分
    21714/66
    。现在在纸上用长除法。哪个更快?最快的方法取决于您的输入。第一个例子类似于
    O(n^3)
    。但它对好的数字很有效。第二个例子类似于
    O(n^2)
    。一般来说,它有更好的性能,但您不想将其用于简单的除法。