Algorithm 八岁孩子的大O?

Algorithm 八岁孩子的大O?,algorithm,theory,big-o,metrics,Algorithm,Theory,Big O,Metrics,我想了解更多关于这对我的代码意味着什么。我从数学上理解这些概念,只是很难理解它们在概念上的含义。例如,如果要对数据结构执行O(1)操作,我知道它必须执行的操作数量不会增加,因为有更多的项。O(n)操作意味着对每个元素执行一组操作。有人能在这里填一下吗 比如O(n^2)操作到底会做什么 如果一个操作是O(n log(n)),那它到底意味着什么呢 有人必须抽大麻才能写出O(x!) 许多非编程功能很容易演示,比如洗牌 对一副牌进行排序时,先遍历整副牌,找出黑桃的a,然后遍历整副牌,找出黑桃的2,以此

我想了解更多关于这对我的代码意味着什么。我从数学上理解这些概念,只是很难理解它们在概念上的含义。例如,如果要对数据结构执行O(1)操作,我知道它必须执行的操作数量不会增加,因为有更多的项。O(n)操作意味着对每个元素执行一组操作。有人能在这里填一下吗

  • 比如O(n^2)操作到底会做什么
  • 如果一个操作是O(n log(n)),那它到底意味着什么呢
  • 有人必须抽大麻才能写出O(x!)

许多非编程功能很容易演示,比如洗牌

对一副牌进行排序时,先遍历整副牌,找出黑桃的a,然后遍历整副牌,找出黑桃的2,以此类推,如果牌组已被向后排序,则最坏的情况是n^2。你看了52张卡片52次

一般来说,真正糟糕的算法并不一定是故意的,它们通常是对其他方法的误用,比如在线性重复同一集合的其他方法中调用线性方法。

不,O(n)算法并不意味着它将对每个元素执行操作。Big-O表示法为您提供了一种独立于实际机器讨论算法“速度”的方法


O(n)表示算法所用的时间随着输入的增加而线性增长。O(n^2)表示算法所用的时间随着输入的平方而增长。诸如此类。

思考这个问题的一种方式是:

O(N^2)意味着对于每个元素,你都在对其他元素做一些事情,比如比较它们。冒泡排序就是一个例子

O(logn)意味着对于每个元素,您正在做的事情只需要查看元素的logn。这通常是因为你知道一些让你做出有效选择的因素。最有效的排序就是一个例子,例如合并排序


O(N!)意味着对N个元素的所有可能排列做一些事情。旅行推销员就是一个例子,那里有N!访问节点的方法,暴力解决方案是查看每种可能排列的总成本,以找到最佳排列。

您可能会发现将其可视化非常有用:

此外,在logic/LogX缩放上,函数n1/2、n、n2都是类似的,而在logic/X缩放上,2n、en、10n是直线和n!是线性的(看起来像n对数n)。

log(n)表示对数增长。分治算法就是一个例子。如果在一个数组中有1000个已排序的数字(例如3、10、34、244、1203…),并且希望在列表中搜索一个数字(找到其位置),则可以从检查索引500处的数字值开始。如果它比你想要的低,跳到750。如果它比你想要的高,跳到250。然后重复这个过程,直到找到您的值(和键)。每次我们跳转一半的搜索空间时,我们可以剔除测试许多其他值,因为我们知道数字3004不能超过数字5000(记住,它是一个排序列表)

n log(n)则表示n*log(n)。

要理解O(n logn),请记住logn表示n中的log-base-2。然后看看每个部分:

当你对集合中的每个项目进行操作时,O(n)或多或少是

O(logn)是指操作数与指数相同时,为了得到项目数,将其提升为2。例如,二进制搜索必须将集合的长度减少一半logn次


O(n logn)是一个组合–您正在对集合中的每个项目进行二进制搜索。有效的排序通常通过对每个项目执行一个循环来进行操作,并在每个循环中进行良好的搜索,以找到正确的位置来放置有问题的项目或组。因此,n*log n.

大O符号对代码的意义在于,当它所操作的“事物”数量翻倍时,它将如何伸缩。下面是一个具体的例子:

Big-O | computations for 10 things | computations for 100 things ---------------------------------------------------------------------- O(1) | 1 | 1 O(log(n)) | 3 | 7 O(n) | 10 | 100 O(n log(n)) | 30 | 700 O(n^2) | 100 | 10000 大O |计算10件事|计算100件事 ---------------------------------------------------------------------- O(1)| 1 | 1 O(对数(n))| 3 | 7 O(n)10 | 100 O(n对数(n))| 30 | 700 O(n^2)| 100 | 10000 以快速排序为例,它是O(n log(n))与冒泡排序为O(n^2)。在对10件事情进行排序时,快速排序的速度是气泡排序的3倍。但是当分类100件东西时,它的速度要快14倍!显然,选择最快的算法很重要。当您访问具有百万行的数据库时,这可能意味着查询在0.2秒内执行与耗时数小时之间的差异

另一个要考虑的是,一个坏的算法是穆尔定律无法帮助的。例如,如果你有一些O(n^3)的科学计算,它一天可以计算100件事情,那么处理器速度翻倍一天只能得到125件事情。然而,如果把这个计算值降到O(n^2),你每天要做1000件事

澄清: 实际上,Big-O并没有提到不同算法在同一特定大小点上的比较性能,而是提到同一算法在不同大小点上的比较性能:

computations computations computations Big-O | for 10 things | for 100 things | for 1000 things ---------------------------------------------------------------------- O(1) | 1 | 1 | 1 O(log(n)) | 1 | 3 | 7 O(n) | 1 | 10 | 100 O(n log(n)) | 1 | 33 | 664 O(n^2) | 1 | 100 | 10000 计算 10件大O | 100件大O | 1000件大O | ---------------------------------------------------------------------- O(1)| 1 | 1 | 1 O(对数(n))| 1 | 3 | 7 O(n)1 | 10 | 100 O(n对数(n))