- 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/
我在使用 io-ts 时遇到一些问题。我发现它确实缺乏文档,我取得的大部分进展都是通过 GitHub issues 取得的。不,我不明白 HKT,所以没有帮助。 基本上,我在其他地方创建一个类型,ty
我必须创建一个正则表达式来搜索整个文件,以找到与 Java XML 解析器的第一部分(但不是第二部分)的匹配项。这将用于防止某些 XXE 攻击。不幸的是,它确实必须是单个正则表达式,并且它确实需要搜索
我有一些简单的 Shared/_Header.cshtml 文件中的内容。 My Shared/_Layout.cshtml 通过调用插入该代码 @Html.Partial("_Header") 目前
我有一个 if-else 语句,其中: 条件 1:ID 匹配并且自动填充某些字段。然后 if 语句只填充其余字段 条件 2:ID 不匹配,所有字段均为空白。 ELSE 语句将它们全部填充 当我使条件
我正在开发一个单页滚动网站。我正在尝试实现 ScrollMagic 并固定第一部分,以便网站的其余部分滚动到固定部分的顶部。我尝试创建一个 jsfiddle 来显示问题,但我似乎无法让 jsfiddl
这是我的情况: 我想使用 Google AdWords 的转换脚本,但出于某种原因,他们代码段的 javascript 部分在我的页面上添加了一些我似乎无法摆脱的不需要的空白。 所以我正在查看的选项纯
寻找一种优雅的方式在页面上添加一次脚本,就是这样。 我有一个需要 2 个 CSS 文件和 2 个 JS 文件的部分 View 。在大多数地方,只需要其中 1 个部分 View 。但在单个页面上,我需要
我想要一个网站,该网站始终具有相同的部分,具有相同的 id 以及我想要显示的所有内容。我对 javascript 不太了解,我想知道如何删除除特定部分之外的所有内容。 最好的方法是否是只执行一个循环来
SQL 语句教程 (11) Group By 我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_name)
我试图理解部分并认为我已经明白了。基本上,这是一种将部分应用程序应用于二元运算符的方法。所以我了解所有(2*) , (+1)等例子就好了。 但是在 O'Reilly Real World Haskel
有没有办法禁止在部分中覆盖给定的关键字参数?假设我要创建函数 bar总是有 a设置为 1 .在以下代码中: from functools import partial def foo(a, b):
我有这个使用节的 OpenMP 代码 #pragma omp parallel sections num_threads(8) { printf_s("Allo fro
我正在尝试重新创建 Apple 制作的有缺陷的 CNContactPickerViewController,因此我有一个数据数组 [CNContact],我需要将其整齐地显示在 UITableView
我有一个相对布局,其中包含一些 float 在 GridView 上的 TextView 。当我在网格中选择一个项目时,布局向下移动到屏幕的尽头,只有大约 1/5 的部分是可见的。这是使用简单的翻译动
我想在我的 tableView 中有两个部分。我希望将项目添加到第 0 节,然后能够选择一行以将其从第 0 节移动到第 1 节。到目前为止,我已将这些项目添加到第 0 节,但是当它关闭时数据不会加
我正在以自由职业者的身份开发支付控制软件,但我有一些关于 mysql 的问题。 。我有一个用作日志的表,名为“Bitacora”。在表中,我有一个名为 idCliente 的列,它是自己表中一个人的
我有一个 PFQueryTableViewController,我想向 tableview 添加部分,我这样尝试: - (PFQuery *)queryForTable { PFQuery *qu
我正在尝试编写一个查询,将部分匹配项与存储的名称值进行匹配。 我的数据库如下所示 Blockquote FirstName | Middle Name | Surname --------------
我正在开发一个语音备忘录应用程序,并且正在将文件保存到表格 View 中。我希望默认文件名显示为“新文件 1”,如果使用“新文件 1”,则它会显示为“新文件 2”,依此类推。 我正在尝试使用 do-w
我有以下简单的 HTML 布局 .section1 { background: red; } .section2 { background: green; } .section3 { ba
我是一名优秀的程序员,十分优秀!