给定n个元素[1,…, n]的数组的最大元素M,如何影响每个基于比较的排序算法的时间复杂度的下界Ω(nlogng)?我必须强调数组的最大元素M是给定的。
如果M
确实是数组元素绝对值的边界,并且元素是整数,您可以在O(n M)
时间内对数组进行排序,方法是保持单独的数组int出现[2M1];
初始化为0
,扫描原始数组并计算每个元素的出现次数,并使用出现
写入输出数组。
如果元素是浮点数(形式上是实数),那么对它们的大小有一个界限是没有影响的。
如果元素是整数并且可以是负的(形式上,任意大数量级的整数),那么数量级的上限没有影响。
编辑:在第一段中有O(n),
应该是O(n M)。
它不受影响。
请注意,有n!
可能的排列,并且每个比较OP有2个可能的结果-“左边更高”或“右边更高”。
对于任何基于比较的算法,每个“决定”都是根据一个比较的结果做出的。
因此,为了成功地确定任何排列的正确顺序,您将需要(在最坏的情况下)log2(n!)比较。然而,众所周知,log2(n!)在Theta中-你让自己回到欧米茄的下界,而不管手头的范围如何。
请注意,其他不使用(仅)比较的方法可以更有效地对整数进行排序。
下面是我写的一些伪代码,给定一个数组A和一个整数值k,如果与k之和中有两个不同的整数,则返回true,否则返回false。我正试图确定这个算法的时间复杂度。 我猜这个算法在最坏的情况下的复杂度是O(n^2)。这是因为第一个for循环运行n次,该循环内的for循环也运行n次。if语句进行一次比较,如果为true,则返回一个值,这两个操作都是常量时间操作。最后的return语句也是一个常数时间操作。
为什么选择排序的最佳案例时间复杂度为O(n^2),而插入排序和冒泡排序为O(n)?他们的平均时间是一样的。我不明白为什么最佳案例时间不同。如果你能帮忙,我将不胜感激。
算法的时间与空间复杂度 看到群里们小伙伴在讨论算法复杂度问题,之前在极客时间看了王争的《数据结构与算法之美》,看的我也晕呼呼的,跟上学时在学校老师的讲的有点不一样了,网上搜了下各种各样的,结合参考作一篇简单易懂的总结。 什么是算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 如何评价一个算法的好坏 一般我们会从以下维度来评估算法的优劣 正确性
以下代码的时间复杂度是多少?我用图和优先级队列的邻接矩阵表示来实现prim的算法。在我看来,时间复杂度是:当源连接到每个其他节点时,堆最多可以增长到(n-1)的大小,而在内部循环中,邻接矩阵的成本是O(n),因此,总的来说:它的O((n-1)*n)-
问题内容: 如果将一个值加到一个排序的集合(redis)上的每个值都是得分最高的值,那么时间复杂度是否适用于每个值? 或者,对于这种边缘情况,redis会执行优化(例如,例外情况是,该值高于集合中的最高值,只需将值添加到最高点)? 实际上,我之所以这样问,是因为我在应用中保留了一个全局排序集,其中值以自时代开始的时间作为分数。我想知道这是否仍然会还是会更快? 问题答案: 一旦排序集超过了配置指令设
做O(h)算法的时间复杂度是多少?当h是节点的高度,以BST n倍为单位(树中的元素数),我相信是O(n),而不是O(n*h),但我不知道如何证明它。 在O(h)中工作的特定算法是在BST中查找元素的顺序前体。