- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我今天正在阅读 CLRS,以更好地理解归并排序的复杂性。我看到一行内容是“其中常量 c 表示解决大小为 1 的问题所需的时间以及划分和组合步骤中每个数组元素的时间。”我知道作者所说的大小为 1 的问题是什么意思,但拆分和组合步骤的每个数组元素的时间究竟是多少,为什么是“cn”?
文字图片如下,供引用。
最佳答案
你是对的,它有点令人困惑,而且作者不是很精确。最好使用像这样的重复来计算比较等离散事件。但是随后您必须制定特定实现的细节,这会变得很繁琐。这个证明是一种估计,这已经足够好了,因为我们只是在寻找大的 Omega 行为。常数因素不会产生影响。
为了理解它,可以将 cn
(c
乘以 n
)视为执行一个操作所需的时间在总长度为 n
的列表上合并步骤。所以 c
是处理一个元素所需的常数时间的粗略表达式:执行合并的任何循环的一次迭代所需的时间。
他称此为“合并”,而不是合并。他还建议拆分列表以进行递归排序可能会产生每个元素的成本。在正常的数组实现中,没有这样的每个元素成本。不过,链表归并排序会有一个:将一个大列表分成两半的循环。然后 c
表示两个循环的一次迭代。
递归项 2T(n/2)
是对两个子列表进行排序所需时间的表达式。
你可以通过说
使这个表达式更精确一点T(n) = 2T(n/2) + cn + k
其中 k
是在合并(如果有的话则拆分)循环之外运行的代码的恒定时间:函数调用开销、子列表长度数学等。您可以尝试使用以下方法解决循环这个额外的学期作为一个练习来向你自己证明 Omega 的大结果不会改变。
关于algorithm - 归并排序计算复杂度时 "cn"到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32671914/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!