- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我读到在实践中快速排序比归并排序快得多,原因是隐藏常量。
那么,随机快速排序复杂度的解是 2nlnn=1.39nlogn,这意味着快速排序中的常数是 1.39。
但是合并排序呢?归并排序中的常量是什么?
最佳答案
让我们看看能否解决这个问题!
在合并排序中,在递归的每个级别,我们执行以下操作:
那么每一步要进行多少次比较呢?好吧,除法步骤不做任何比较;它只是将数组分成两半。第 2 步不(直接)进行任何比较;所有比较都是通过递归调用完成的。在第 3 步中,我们有两个大小为 n/2 的数组,需要合并它们。这最多需要 n 次比较,因为合并算法的每一步都进行一次比较,然后消耗一些数组元素,所以我们不能进行超过 n 次比较。
将这些结合在一起,我们得到以下重复:
C(1) = 0
C(n) = 2C(n / 2) + n
(如评论中所述,线性项更准确地说是 (n - 1),尽管这不会改变总体结论。我们将使用上述递归作为上限。)
为了简化这个,让我们定义 n = 2k 并根据 k 重写这个循环:
C'(0) = 0
C'(k) = 2C'(k - 1) + 2^k
这里的前几项是 0, 2, 8, 24, ... 。这看起来有点像 k 2k,我们可以通过归纳来证明这一点。作为我们的基本情况,当 k = 0 时,第一项为 0,k 2k 的值也为 0。对于归纳步骤,假设声明对某些 k 成立并考虑 k + 1.那么值为2(k 2k) + 2k + 1 = k 2 k + 1 + 2k + 1 = (k + 1)2k + 1,所以对于 k + 1 的说法成立,完成归纳。因此 C'(k) 的值为 k 2k。由于 n = 2 k,这意味着,假设 n 是 2 的完美幂,我们有进行比较的次数是
C(n) = n lg n
令人印象深刻的是,这比快速排序更好!那么到底为什么快速排序比归并排序快呢?这与与比较次数无关的其他因素有关。首先,由于快速排序在适当的地方工作,而归并排序在不适当的地方工作,因此归并排序中的引用局部性不如在快速排序中那么好。这是一个如此巨大的因素,以至于在实践中快速排序最终比合并排序好得多,因为缓存未命中的成本非常高。此外,对数组进行排序所需的时间不仅仅考虑比较次数。其他因素(如每个数组元素移动的次数)也很重要。例如,在合并排序中,我们需要为缓冲的元素分配空间,移动元素以便它们可以合并,然后合并回数组。我们的分析中没有计算这些 Action ,但它们肯定加起来了。将此与快速排序的分区步骤进行比较,它只移动每个数组元素一次并保留在原始数组中。这些额外的因素,而不是进行比较的次数,决定了算法的运行时间。
此分析比最佳分析精确一些,但是 Wikipedia确认分析大致为 n lg n,这确实比快速排序的平均情况下的比较少。
希望这对您有所帮助!
关于algorithm - 归并排序究竟进行了多少次比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8535540/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!