- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我刚刚回答了一个关于在快速排序实现中选择分区的不同方法的问题,然后提出了一个老实说我不知道如何回答的问题。这有点数学重,而且这可能是问这个问题的错误站点,所以如果需要移动,请告诉我,我很乐意将它迁移到其他地方。
众所周知,随机统一选择其枢轴的快速排序实现将在预期的 O(n lg n) 时间内运行(有一个很好的证明 on Wikipedia )。然而,由于生成随机数的成本,许多快速排序实现不会随机选择主元,而是依赖于“三个中位数”方法,在该方法中确定性地选择三个元素,并选择其中的中位数作为枢。众所周知,在最坏的情况下,这会退化为 O(n2)(例如,有关如何生成那些最坏情况的输入,请参阅 this great paper)。
现在,假设我们通过从序列中选取三个随机元素并使用它们的中值作为基准选择来组合这两种方法。我知道这也保证了 O(n lg n) 平均情况运行时间,使用的证明与常规随机快速排序的证明略有不同。但是,我不知道在这个特定的快速排序实现中 n lg n 项前面的常数因子是什么。对于常规的随机快速排序,维基百科列出了随机快速排序的实际运行时间,最多需要 1.39 n lg n 次比较(使用 lg 作为二进制对数)。
我的问题是:有没有人知道使用“三中位数”随机快速排序得出比较次数常数因子的方法?如果我们走得更一般,是否有使用随机中值 k 方法的快速排序常数因子的表达式?我很好奇,因为我认为看看这种方法是否有一些比其他随机快速排序实现更少的比较的“最佳点”会很有趣。我的意思是,如果能够说随机快速排序和随机的 6 个中位数选择进行最少的比较,这不是很酷吗?或者能够得出结论,您应该随机选择一个枢轴元素?
最佳答案
这是常量的启发式推导。我认为它可以变得更严格,需要付出更多的努力。
设 P 是一个连续的随机变量,其值在 [0, 1] 中。直观上,P 是小于主元的值的分数。我们正在寻找常数 c 使得
c n lg n = E[n + c P n lg (P n) + c (1 - P) n lg ((1 - P) n)].
稍等一下代数,我们有
c = 1/E[-P lg P - (1 - P) lg (1 - P))].
换句话说,c 是伯努利分布的预期熵与均值 P 的倒数。直观地说,对于每个元素,我们需要以产生大约 lg n 位信息的方式将其与枢轴进行比较。
当P均匀时,P的pdf为1,常数为
In[1]:= -1/NIntegrate[x Log[2, x] + (1 - x) Log[2, 1 - x], {x, 0, 1}]
Out[1]= 1.38629
当pivot为中位数3时,P的pdf为6 x (1 - x)。常数是
In[2]:= -1/NIntegrate[6 x (1 - x) (x Log[2, x] + (1 - x) Log[2, 1 - x]), {x, 0, 1}]
Out[2]= 1.18825
关于algorithm - 使用随机三中位数的快速排序是否比随机快速排序明显更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5001602/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!