- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
谁能指导我解决以下问题的数学部分。
证明不存在运行时间至少有一半是线性的比较排序的!长度为 n 的输入。长度为 n 的输入的 1/n 的一小部分呢?分数 (1/(2)^n) 呢?
解决方法:
如果对于 m 个输入排列排序以线性时间运行,则排序的高度 h决策树的一部分,由 m 个对应的叶子及其对应的叶子组成祖先是线性的。使用与定理 8.1 证明中相同的论证来证明这是不可能的对于 m = n!/2、n!/n 或 n!/2n。我们有 2^h ≥ m,这给了我们 h ≥ lgm。对于此处给出的所有可能的毫秒数,lgm = Ω(n lg n),因此 h = Ω(n lg n)。特别是,
lgn!/2= lg n! − 1 ≥ n lg n − n lg e − 1
lgn!/n= lg n! − lg n ≥ n lg n − n lg e − lg n
lgn!/2^n= lg n! − n ≥ n lg n − n lg e − n
最佳答案
这些证明中的每一个都是对更一般证明的直接修改,你不能有比 Ω(n log n) 排序更快的比较排序(你可以看到这个证明 in this earlier answer )。直觉上,论证如下。为了使排序算法正常工作,它必须能够确定元素的初始顺序。否则,它无法对值重新排序以将它们按升序排列。给定 n 个元素,有 n!这些元素的不同排列,意味着有 n!排序算法的不同输入。
最初,算法对输入序列一无所知,也无法区分 n!不同的排列。每次算法进行比较时,它都会获得更多有关元素排序方式的信息。具体来说,它可以判断输入排列是在比较结果为真的排列组中,还是在比较结果为假的排列组中。您可以将算法的工作方式可视化为二叉树,其中每个节点对应于算法的某个状态,并且特定节点的(最多)两个子节点表示如果比较结果为真将进入的算法状态或错误。
为了使排序算法能够正确排序,它必须能够为每个可能的输入输入一个唯一的状态,否则算法将无法区分两个不同的输入序列,因此至少会排序其中一个不正确。这意味着如果考虑树中叶节点的数量(算法完成比较并准备排序的部分),每个输入排列必须至少有一个叶节点。在一般证明中,有 n!排列,所以必须至少有 n!叶节点。在二叉树中,拥有 k 个叶节点的唯一方法是高度至少为 Ω(log k),这意味着您必须至少进行 Ω(log k) 比较。因此,根据斯特林近似,一般排序下界为 Ω(log n!) = Ω(n log n)。
在您考虑的情况下,我们将自己限制在这些可能排列的一个子集中。例如,假设我们希望能够对 n!/2 个排列。这意味着我们的树的高度必须至少为 lg (n!/2) = lg n! - 1 = Ω(n log n)。因此。你不能及时排序 O(n),因为没有线性函数以 Ω(n log n) 的速率增长。第二部分,看你能不能拿到n!/n 以线性时间排序,决策树的高度必须是 lg (n!/n) = lg n! - lg n = Ω(n log n),所以你不能在 O(n) 比较中排序。对于最后一个,我们有 lg n!/2n = lg n! - n = Ω(n log n) 同样,所以它也无法在 O(n) 时间内排序。
但是,您可以在线性时间内对 2n 个排列进行排序,因为 lg 2n = n = O(n)。
希望这对您有所帮助!
关于algorithm - 一小部分输入的比较排序下限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304171/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我想编写一个 sql 查询,返回所有大于或等于 x 的值以及不大于 x 的第一个值。 例如,如果我们有一个包含值 1、2、3、4、5 且 x 为 3 的表,我需要返回 2、3、4、5。 我的示例包含均
假设一个斐波那契算法: 我们被要求证明这个算法的上限/下限。 我该如何继续? 更新 因此,我将解释我自己所做的事情并展示我遇到的问题。 我不知道为什么,但我决定在这里使用递推关系,看看在哪里可以得到我
我需要知道是否有东西在两个限制之间,但我在 Playground 上不断遇到相同的 2 个错误,而且我似乎无法在网上找到解决方案。知道如何在 Swift 中做到这一点吗? var upperLimit
给定一个值列表: >>> from scipy import stats >>> import numpy as np >>> x = list(range(100)) 使用学生 t 检验,我可以找到
lower_bound 是什么意思。如果我不得不猜测,我会回答这个函数在小于请求值的最后一个元素处返回迭代器。但我看到lower_bound 几乎和upper_bound 一样。唯一的区别是在 upp
所以 Pyqtgraph 会自动计算轴并在缩放时重新缩放,这很好。但是我有两个轴,频率和小时。频率可以采用 0-100 之间的任何值,小时可以采用 0-39 之间的任何值。如何将轴限制在这些上限/下限
如果用户输入的值超出范围,我需要显示错误消息并且不更改微调器的值。 如果使用微调按钮,则没有问题。但是,如果用户键入低于下界的数字,微调器会自动将其设置为下界值。这可能很好,但我需要确保用户知道。 S
我有以下谓词条件 predicate = cb.like(root.get(Product_.prodName),prod.getProductName()); 如何在上面的starement
任何人都可以建议一种使用 SSE4.1 之前的 SIMD 计算 float 下限/上限的快速方法吗?我需要正确处理所有极端情况,例如当我有一个 float 值时,它不能用 32 位 int 表示。 目
这个问题在这里已经有了答案: What is PECS (Producer Extends Consumer Super)? (16 个答案) 关闭 5 年前。 我正在尝试了解下限和上限通配符的行为
我想用误差线绘制一些数据点。其中一些数据点只有上限或下限,没有误差线。 所以我尝试使用索引来区分带有误差线的点和带有上限/下限的点。但是,当我尝试这样的事情时: errorbar(x[i], y[i]
在 Ruby 或 Rails 中,是否有一种内置方式或更优雅的方式将数字 num 限制为上限/下限? 例如像这样的东西: def number_bounded (num, lower_bound, u
我必须检查一个包含平方根的不等式。为了避免由于 float 不准确和舍入导致的不正确结果,我使用 std::nextafter() 来获取上限/下限: #include // DBL_MAX #in
我正在尝试根据可以是任意长度的数字数组来计算四分位数范围,例如 1, 1, 5, 6, 7, 8, 2, 4, 7, 9, 9, 9, 9 我需要从这个四分位数范围中计算出的值
我想使用 quantreg 从分位数回归中提取系数和上下限包裹。这是帮助文件中的示例。 data(engel) attach(engel) taus <- c(.05,.1,.25,.75,.9,.9
我有一个非常大的产品表。我需要选择几个偏移量非常高的产品(下面的示例)。 Postgresql 索引和性能手册建议在 ORDER BY + 最终条件使用的列上创建索引。一切都是桃色的,没有使用任何种类
我有一个产品表和两个 DATETIME 列,一个用于开始日期,一个用于结束日期。 如何检查特定产品 ID 是否在开始日期和结束日期之间?但是,如果其中一个或两个为 NULL(默认值),则接受此下限/上
我看到 Why is -1/2 evaluated to 0 in C++, but -1 in Python?表示在 Python 中整数除法向无穷大舍入,即 floor 应用于结果。 我认为 in
我正在使用 lower_bound() 在 weak_ptr 的排序 vector 中搜索 vector >::iterator findA( const string & id ) const {
我是一名优秀的程序员,十分优秀!