大家好,
相当基本的可扩展性符号问题。
我最近收到了对我的python有序列表实施的帖子的评论 “但要注意你的'有序集'实现是插入的O(N)”
很高兴知道,但我不确定这意味着什么。
我看过n(o)o(N),N(o-1)或N(o * o)等符号
上述符号是指什么?
答案 0 :(得分:49)
评论指的是Big-O符号。
简言之:
基本上任何'O'符号表示操作需要时间最多为k * f(N)
其中:
k是常数乘数
f()是一个依赖于N
的函数
答案 1 :(得分:21)
它被称为Big O Notation:http://en.wikipedia.org/wiki/Big_O_notation
所以说插入是O(n)
意味着您必须遍历整个列表(或其中一半 - 大O符号忽略常数因子)才能执行插入。
这看起来很不错:http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/
答案 2 :(得分:13)
O(n)是Big O Notation并且指的是给定算法的复杂性。 n表示输入的大小,在您的情况下,它是列表中的项目数。
O(n)表示您的算法将采用n次操作的顺序来插入项目。例如循环遍历列表一次(或循环一次,例如两次或仅循环一半)。
O(1)表示需要一个固定的时间,它不依赖于列表中的项目数。
O(n ^ 2)表示对于每个插入,它需要n * n次操作。即,1项的1次操作,2项的4次操作,3项的9次操作。如您所见,O(n ^ 2)算法在处理大量项目时效率低下。
对于列表,O(n)对于插入来说并不坏,但不是最快的。另请注意,O(n / 2)被认为与O(n)相同,因为它们都以与n相同的速率增长。
答案 3 :(得分:11)
具体来说,O(n)表示如果列表中的项目数量是2倍,则 不超过 两倍,如果有50倍很多, 不超过 50倍。有关详细信息,请参阅维基百科文章dreeves指出
编辑(上面用粗体显示):有人指出Big-O确实代表了上限,所以如果列表中的元素数量是原来的两倍,那么插入将花费 most 两倍的时间,如果有50倍的元素,那么大多数的时间是50倍。
如果它另外是Ω(n)(n的大欧米茄)那么对于一个两倍大的列表,它将花费至少两倍的时间。如果你的实现是O(n)和Ω(n),意味着它将同时采用至少和大多数两倍于列表的两倍大,那么它可以说是Θ(n)(n的大Theta),这意味着如果有两倍的元素,它将花费两倍的时间。
根据维基百科(以及个人经验,我自己犯了罪)Big-O经常用于Big-Theta的含义。调用你的函数O(n ^ n ^ n ^ n)在技术上是正确的,因为所有的Big-O都说你的函数并不慢于此,但没有人会说除了证明一个点之外的其他因为它是虽然它在技术上是准确的,但不是非常有用和误导性的信息。
答案 4 :(得分:5)
它指的是您的程序有多复杂,即实际解决问题需要多少操作。 O(n)表示每个操作采用与列表中的项目相同的步骤数,这些项目的插入速度非常慢。同样,如果你有O(n ^ 2)意味着任何操作都需要“n”平方步骤来完成,等等......“O”代表大小顺序,括号中的表达式是始终与过程中操作的项目数相关。
答案 5 :(得分:4)
简答:这意味着处理时间与输入的大小成线性关系。例如,如果输入的大小(列表长度)为三倍,则处理时间(大致)为三倍。如果它增加了千倍,处理时间也会增加相同的幅度。
答案很长:查看Ian P和dreeves提供的链接
答案 6 :(得分:3)
这可能有所帮助:
http://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions
祝你好运!O(n):查找未排序的项目 列表或格式错误的树(最坏的情况); 添加两个n位数字
答案 7 :(得分:2)
Wikipedia explains它远比我好,但是这意味着如果你的列表大小是N,那么插入一个项目需要最多N次循环/迭代。 (实际上,你必须遍历整个列表)
如果你想要更好的理解,有一本免费的书from Berkeley可以更深入地了解这个符号。