Questions tagged «big-o»

Big-O表示法用于表示渐近上限。它描述了算法的相关时间或空间复杂度。Big-O分析提供了问题难度的粗略且简化的估计。


11
从无限列表中获得100个最高数字
我的一位朋友被问到这个面试问题- “从一些无限的数字列表中不断涌入数字,您需要维护其中的数据结构以在任何给定的时间点返回前100个最高数字。假定所有数字都是整数。” 这很简单,您需要按降序排列已排序的列表,并跟踪该列表中的最低编号。如果获得的新号码大于该最低号码,则必须删除该最低号码,然后根据需要在排序列表中插入新号码。 然后问题扩大了- “您可以确保插入顺序为O(1)吗?可以吗?” 据我所知,即使您添加一个新数字到列表中并使用任何排序算法对其进行再次排序,对于quicksort(我认为),最好也应该是O(logn)。所以我的朋友告诉那是不可能的。但是他没有被说服,他要求维护任何其他数据结构而不是列表。 我想到了平衡二叉树,但即使在那儿,您也不会得到顺序为1的插入。因此,我现在也遇到了同样的问题。想知道是否有任何这样的数据结构可以针对上述问题以1的顺序进行插入,或者根本不可能。
53 numbers  big-o  puzzles 

7
为什么此函数O(n ^ 2)最坏的情况?
我正在尝试教自己如何为任意函数计算BigO表示法。我在教科书中找到了此功能。该书断言该函数为O(n 2)。它解释了为什么这样做,但是我一直在努力遵循。我想知道是否有人能够向我展示为什么会这样。从根本上讲,我知道它小于O(n 3),但我无法独立降落在O(n 2)上 假设给定了三个数字序列,A,B和C。我们将假定没有单个序列包含重复值,但是在两个或三个序列中可能存在一些数字。三向不相交问题是确定三个序列的交点是否为空,即是否不存在元素x使得x∈A,x∈B和x∈C。 顺便说一句,这对我来说不是一个作业问题,因为这艘船几年前已经航行过:),只是我想变得更聪明。 def disjoint(A, B, C): """Return True if there is no element common to all three lists.""" for a in A: for b in B: if a == b: # only check C if we found match from A and B for c in C: …
44 python  big-o 

20
是否存在在以下类中性能大大优于实际的算法?[关闭]
昨晚我正在与另一位程序员讨论,即使O(1)可能是O(1),如果O(1)算法中存在一个较大的常数,则O(n)的运算也可能会胜过它。他不同意,所以我把它带到了这里。 是否有一些算法示例大大优于其下面的类?例如,O(n)比O(n)快或O(n 2)比O(n)快。 在数学上,当您忽略常数因子时,可以针对具有渐近上限的函数证明这一点,但是这样的算法在野外是否存在?在哪里可以找到它们的示例?它们用于什么类型的情况?
39 algorithms  big-o 

4
试图理解P vs NP vs NP Complete vs NP Hard
我试图理解这些分类以及它们为什么存在。我的理解正确吗?如果没有,那怎么办? P是多项式复杂度,或对于某些非负实数(例如)等。如果问题属于P,则至少存在一种可以在多项式时间内从头解决的算法。例如,我总是可以通过遍历并检查每一步是否除以整数来确定某个整数是否为质数。O(nk)kO(1), O(n1/2), O(n2), O(n3)n2 <= k <= sqrt(n)kn NP是不确定的多项式复杂度。我真的不知道不确定性意味着什么。我认为这意味着在多项式时间内进行验证很容易,但是如果我们不知道答案,那么从头开始求解可能不是多项式时间。由于它可以在多项式时间内求解,因此所有P问题也是NP问题。引用整数分解作为NP的示例,但我个人不理解为什么它不是P,因为试验分解需要O(sqrt(n))时间。 NP完全我完全不了解,但是引用了旅行商问题。但是在我看来,TSP问题可能只是NP,因为它需要采取某种措施来验证您是否已预先确定路径。O(2n n2) time to solve, but O(n) 我认为NP-Hard充满未知数。难以验证,难以解决。

2
什么是O(…),如何计算?
救命!我有一个问题需要分析算法或某些代码的Big-O。 我不确定究竟是什么Big-O或Big-O与Big-Theta或与其他分析算法复杂性的方式之间的关系。 我不确定Big-O是指运行代码的时间,还是所需的内存量(空间/时间折衷)。 我有计算机科学作业,需要做一些循环,也许是递归算法,并为此设计出Big-O。 我正在开发一个程序,我可以在两个数据结构或算法之间选择一个已知的Big-O,并且不确定要选择哪个。 我如何了解如何计算Big-O并将其应用到我的程序,作业或计算机科学常识中? 注意:此问题是社区确定的其他Big-O问题的规范重复目标。能够包含许多Big-O问题的大量有用信息的意图是广泛的。请不要使用如此广泛的事实来表示可以接受类似的问题。

5
这是否是识别算法的“大O”符号的正确“规则”?
我一直在学习有关大O表示法的更多信息,以及如何根据算法编写方式对其进行计算。我遇到了一组有趣的“规则”,用于计算算法“大O”表示法,我想看看自己是在正确的轨道上还是在正确的道路上。 大O表示法:N function(n) { For(var a = 0; i <= n; i++) { // It's N because it's just a single loop // Do stuff } } 大O表示法:N 2 function(n, b) { For(var a = 0; a <= n; a++) { For(var c = 0; i <= b; c++) { …
29 algorithms  big-o 

5
为什么mergesort O(log n)?
Mergesort是分治法,是O(log n),因为输入被反复减半。但是它不应该是O(n),因为即使每个循环的输入减半,每个输入项也需要迭代以在每个减半的数组中进行交换?在我看来,这本质上是渐近O(n)。如果可能,请提供示例并说明如何正确计算操作!我还没有编码任何东西,但是我一直在网上寻找算法。我还附上了Wikipedia用来直观地显示mergesort如何工作的gif图像。
27 algorithms  big-o 

5
确定算法是否为O(log n)
我正在刷新我的CS理论,我想知道如何识别算法O(log n)的复杂性。具体来说,有一种简单的方法可以识别它吗? 我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?

2
合并具有最少比较数的两个排序数组的算法
给定两个大小为n和m的类型为T的排序数组a,b。我正在寻找一种将两个数组合并为一个新数组(最大大小为n + m)的算法。 如果比较便宜的话,这很简单。只需从具有最低第一个元素的数组中取出,直到完全遍历一个或两个数组,然后添加其余元素即可。像这样的东西/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array 但是,当比较两个元素时,情况的改变要比将元素从源数组复制到目标数组要贵得多。例如,您可能具有大的任意精度整数或字符串组成的数组,其中比较可能会非常昂贵。只需假设创建数组和复制元素是免费的,而唯一花​​费的就是比较元素。 在这种情况下,您希望使用最少数量的元素比较合并两个数组。这里有一些示例,您应该可以比简单的合并算法做得更好: a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] 要么 a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] 在某些情况下,简单合并算法将是最佳选择,例如 a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] 因此,理想情况下,算法应该适当地降级并在阵列交错或至少不会明显恶化的情况下执行最多n + m-1个比较。 对于大小差异较大的列表,应该做得很好的一件事是使用二进制搜索将较小数组的元素插入较大数组。但是,如果两个列表的大小相同且交织在一起,则不会优雅地降低性能。 元素唯一可用的是(总计)排序功能,因此任何使比较便宜的方案都是不可能的。 有任何想法吗? 我在Scala中提出了这一点。我认为比较次数是最佳的,但是我无法证明这一点。至少它比我在文献中发现的要简单得多。 而且自原始帖子以来,我写了一篇有关其工作原理的博客文章。

7
大O中的O是什么?
Big O符号中的Big和O是什么?我已经阅读了定义,但并没有说出O的发音是“哦”。例如-我知道O(n)是线性算法的复杂度,其中n可以是操作数。但是什么是O?
23 complexity  big-o 


5
算法:如何将O(n)和O(nlog(n))求和?
我有以下算法,该算法查找重复项并将其删除: public static int numDuplicatesB(int[] arr) { Sort.mergesort(arr); int numDups = 0; for (int i = 1; i < arr.length; i++) { if (arr[i] == arr[i - 1]) { numDups++; } } return numDups; } 我试图找到这种情况下最坏的情况。我知道mergesort是nlog(n),在我的for循环中,我正在遍历整个数据集,因此算作n。我不确定该如何处理这些数字。我应该把它们加在一起吗?如果要这样做,我将如何做?

2
为什么要教Big O而不是Big Theta?
大O表示法为函数提供了上限,而大Theta提供了严格的约束。但是,我发现Big O符号在真正意义上是Big Theta时通常被(非正式地)教授和使用。 例如,“ Quicksort是O(N ^ 2)”可以变成更强大的陈述“ Quicksort是Θ(N ^ 2)” 尽管从技术上讲Big O的使用是正确的,但是更普遍地使用Big Theta不会更具表达性,并且可以减少混乱吗?有什么历史原因可导致这种大O的使用更为普遍? 维基百科注释: 非正式地,尤其是在计算机科学中,通常允许在某些情况下使用Big O表示法来描述渐近紧边界,在这种情况下,使用Big ThetaΘ表示法实际上可能更合适。

6
当您更改函数的Big O执行时间时,该怎么称呼?
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 去年关闭。 假设我有一个可以O(n^2)及时对数据库进行排序的函数。我想对其进行重构,以使其能够O(n log(n))及时运行,并且这样做,我将更改操作的基本运行方式,同时保持返回值和输入相等。 我怎么称呼这种重构活动? “加速优化”似乎不太正确,因为您可以在不改变算法执行速度的情况下使算法运行得更快。 “简化”似乎也不对。 我怎么称呼这项活动? 更新资料 我能找到的最佳答案是减少渐近时间的复杂度。
19 complexity  big-o 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.