【问题标题】:How to calculate time complexity O(n) of the algorithm?如何计算算法的时间复杂度 O(n)?
【发布时间】:2019-03-10 12:38:54
【问题描述】:

我做了什么: 我测量了处理 100、1000、10000、100000、1000000 个项目所花费的时间。 此处测量:https://github.com/DimaBond174/cache_single_thread .

然后我假设 O(n) 与 n 成比例增加,并计算了关于 O(n) 的剩余算法..

具有处理 100、1000、10000、100000、1000000 个项目的时间测量值,我们现在如何将算法归因于 O(1)、O(log n)、O(n)、O(n log n) 或O(n^2) ?

【问题讨论】:

  • 我在这里遗漏了什么吗?请显示有问题的算法。如果算法未知,那么您只能猜测,您将获得无限数量的候选者,这完全取决于您进行了多少次测量。
  • @RmbRT,我比较了5种算法并分析了它们的速度。这些算法占用了几个类中的几个文件 - 代码太多,无法在此处上传。我带来了源代码的链接:github.com/DimaBond174/cache_single_thread我在几个站点问了计算O(n)的问题,实际上似乎没有人能够计算。每个人只有一个主观的无理评价,没有考虑到所有因素。

标签: time-complexity


【解决方案1】:

让我们将 N 定义为可能的数据输入之一。根据您所指的输入,算法可以具有不同的大 O 值,但通常您只关心一个大输入。如果没有相关算法,您只能猜测。但是,有一些准则可以帮助您确定它是什么。

一般规则:

O(1) - 无论数据大小如何,程序的速度几乎没有变化。要做到这一点,程序根本不能对相关数据进行循环操作。

O(log N) - 当 N 急剧增加时,程序会稍微减速,呈对数曲线。要做到这一点,循环必须只遍历一小部分数据。 (例如,二分查找)。

O(N) - 程序的速度与输入数据的大小成正比。如果您对数据的每个单元执行操作,您就会得到这个。您不能有任何类型的嵌套循环(作用于数据)。

O(N log N)- 较大的输入会显着降低程序的速度。当您在循环中嵌套了 O(logN) 操作时会发生这种情况,否则该操作将是 O(N)。例如,您有一个循环对每个数据单元进行二分搜索。

O(N^2) - 程序会在输入较大时减速到爬行,并最终在数据足够大时停止。当您有 NESTED 循环时会发生这种情况。和上面一样,但是这次嵌套循环是 O(N) 而不是 O(log N)

因此,请尝试将循环操作视为 O(N) 或 O(log N)。然后,每当你有嵌套时,将它们相乘。如果循环没有嵌套,它们不会像这样相乘。所以两个相互分开的循环只是 O(2N) 而不是 O(N^2)。

还请记住,您可能在引擎盖下有循环,因此您也应该考虑它们。例如,如果您在 Java 中执行类似 Arrays.sort(X) 的操作,那将是 O(N logN) 操作。因此,如果您出于某种原因将其置于循环中,您的程序将比您想象的要慢得多。

希望能回答你的问题。

【讨论】:

  • 感谢您的回复。我正在尝试准确测量算法的行为更接近哪条曲线。在我看来,我找到了正确的测试方法。但是,有些人认为我的方法不准确:reddit.com/r/programming/comments/axh6x8/… 如果您有兴趣,这里是我计算时间复杂度 O(n) 的 Excel 文件:drive.google.com/open?id=1ZPpN-3KY_DuopkFFmDlrPPm-fViBAqZs
  • @Helsing 请注意,Big-O 表示法中的“O(n)”是一种特定的复杂度等级,而不是“算法复杂度等级”的通用术语。你在介绍中说得好像是这样。请澄清一下,我们正在确定的是算法的渐近时间复杂度类。
  • @RmbRT 好的,我澄清了
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 2015-05-25
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多