Tag:

Euclidalgorithm的时间复杂度

我很难判断Euclid的最大公分母algorithm的时间复杂度是多less。 这个伪码的algorithm是: function gcd(a, b) while b ≠ 0 t := b b := a mod b a := t return a 这似乎取决于a和b 。 我的想法是时间复杂度是O(a%b)。 那是对的吗? 有没有更好的方式来写这个?

algorithm确定数组是否包含n … n + m?

我在Reddit上看到了这个问题,并没有提出正面的解决scheme,我认为这是一个完美的问题。 这是关于面试问题的一个线索: 编写一个采用大小为m的int数组的方法,如果数组由数字n … n + m-1组成,则返回(True / False),该范围内的所有数字以及该范围内的数字。 数组不保证被sorting。 (例如,{2,3,4}将返回true。{1,3,1}将返回false,{1,2,4}将返回false。 我遇到的这个问题是我的面试官不断要求我优化(更快的O(n),更less的内存等),他声称你可以在一个arrays中使用恒定数量的记忆。 从来没有想过这一个。 随着你的解决scheme,请指出他们是否假设arrays包含独特的项目。 同时指出你的解决scheme是否假定序列从1开始(我已经稍微修改了这个问题,以允许它进入2,3,4的情况) 编辑:我现在认为,在处理重复的空间algorithm中不存在线性时间和常量。 任何人都可以validation此? 重复的问题归结为testing,以查看数组是否包含O(n)时间,O(1)空间中的重复项。 如果可以这样做,您可以先简单testing一下,如果没有重复,则运行发布的algorithm。 那么你能在O(n)时间O(1)空间中testingdupe吗?

为什么从大的O分析总是下降?

我试图在PC上运行程序的上下文中了解Big O分析的一个特定方面。 假设我有一个性能为O(n + 2)的algorithm。 在这里,如果n变得非常大,则2变得不重要。 在这种情况下,真正的性能是O(n)。 然而,说另一个algorithm的平均性能为O(n ^ 2/2)。 我看到这个例子的书说真实的performance是O(n ^ 2)。 我不知道为什么,我的意思是在这种情况下,2似乎不是完全无关紧要的。 所以我正在寻找这本书的一个很好的清晰的解释。 这本书解释了这一点: “考虑1/2是什么意思,检查每个值的实际时间高度依赖于代码转换的机器指令,然后取决于CPU可以执行指令的速度,因此1/2”这意味着非常多。“ 而我的反应是……呃??? 我从字面上不知道这个说法是什么,或者更确切地说,这个说法与他们的结论有什么关系。 有人可以为我拼出来,请。 感谢您的帮助。

哈希表的时间复杂度

我对散列表的时间复杂性感到困惑,许多文章指出它们是“平摊的O(1)”而不是真正的O(1)这在实际应用中意味着什么。 在哈希表中的操作的平均时间复杂度是多less,在实际实现中不是理论上的,为什么这些操作不是真的O(1)?

什么会导致algorithm有O(log log n)的复杂性?

这个较早的问题解决了一些可能导致algorithm具有O(log n)复杂度的因素。 什么会导致一个algorithm的时间复杂度O(log log n)?

哈希表真的可以O(1)?

哈希表可以达到O(1)似乎是常识,但是这对我来说是没有意义的。 有人可以解释吗? 这里有两个想到的情况: A. 值是一个比散列表的大小小的int。 因此,这个值是它自己的哈希,所以没有哈希表。 但是,如果有的话,这将是O(1),仍然是低效的。 B. 你必须计算一个哈希值。 在这种情况下,查找数据大小的顺序是O(n)。 在O(n)工作之后,查找可能是O(1),但是在我眼中仍然是O(n)。 除非你有一个完美的散列表或一个大的散列表,否则每个存储桶可能有几个项目。 所以,无论如何它都会在某个点上进入一个小的线性search。 我认为散列表很棒,但是除非它是理论上的,否则我不会得到O(1)的称号。 维基百科关于散列表的文章始终引用常量查找时间,并完全忽略散列函数的成本。 这真的是一个公平的措施? 编辑:总结我学到的东西: 这在技术上是正确的,因为散列函数不需要使用密钥中的所有信息,因此可以是恒定的时间,并且因为足够大的表可以将冲突降低到接近恒定的时间。 在实践中是这样的,因为随着时间的推移,只要散列函数和表大小被select为使冲突最小化,即使这通常意味着不使用恒定时间散列函数,也可以实现。

Java HashMap真的是O(1)吗?

我已经看到了一些关于Java的hashps和它们的O(1)查找时间的有趣声明。 有人能解释为什么这样吗? 除非这些哈希algorithm与我所购买的任何哈希algorithm有很大的不同,否则肯定会存在一个包含冲突的数据集。 在这种情况下,查找将是O(n)而不是O(1) 。 有人可以解释他们是否是 O(1),如果是的话,他们是如何实现的?

O(log n)是什么意思?

我目前正在学习Big O Notation运行时间和分期次数。 我理解O(n)线性时间的概念,这意味着input的大小会按比例影响algorithm的增长…例如二次时间O(n 2 )等也是如此。甚至algorithm,例如置换生成器,具有O(n!)次,以阶乘增长。 例如,下面的函数是O(n),因为该algorithm与其inputn成比例增长: f(int n) { int i; for (i = 0; i < n; ++i) printf("%d", i); } 同样,如果有一个嵌套循环,时间将是O(n 2 )。 但究竟是O(log n) ? 例如,说一个完整的二叉树的高度是O(log n)是什么意思? 我知道(也许不是很详细)什么对数,在这个意义上说:log 10 100 = 2,但我不明白如何识别对数时间的函数。

大O,你怎么计算/近似呢?

大多数拥有CS学位的人肯定知道Big O代表什么。 它可以帮助我们衡量一个algorithm的效率如何,如果你知道你想要解决的问题在哪个类别中,你可以找出是否仍然可以排除这个额外的性能。 1 但我很好奇, 你如何计算或近似algorithm的复杂性? 1 但是正如他们所说的那样,不要过头, 不成熟的优化是万恶之源 ,没有正当理由的优化也应该得到这个名称。

什么是“大O”符号的简单英文解释?

我宁愿尽可能less的正式定义和简单的math。