Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找N个数中的最大数和第二大数_Algorithm_Sorting_Comparison_Performance_Runtime - Fatal编程技术网

Algorithm 查找N个数中的最大数和第二大数

Algorithm 查找N个数中的最大数和第二大数,algorithm,sorting,comparison,performance,runtime,Algorithm,Sorting,Comparison,Performance,Runtime,给定n个数字,如何使用最多n+log(n)比较找到最大和第二大数字 请注意,这不是O(n+log(n)),而是真正的n+log(n)比较。pajton给出了一个评论 让我详细说明一下 正如pajton所说,这可以通过比赛选择来实现 把这看作是一场淘汰赛,选手的能力有一个严格的顺序,比赛的结果完全由这个顺序决定 在第一轮中,有一半人被淘汰。在下一轮中,另一半等(可能有一些是) 最后一轮即最后一轮决定胜负 这可以看作是一棵树 树的每个节点都将是该节点的子节点之间匹配的获胜者 树叶是球员。第一轮的获胜

给定n个数字,如何使用最多n+log(n)比较找到最大和第二大数字

请注意,这不是O(n+log(n)),而是真正的n+log(n)比较。

pajton给出了一个评论

让我详细说明一下

正如pajton所说,这可以通过比赛选择来实现

把这看作是一场淘汰赛,选手的能力有一个严格的顺序,比赛的结果完全由这个顺序决定

在第一轮中,有一半人被淘汰。在下一轮中,另一半等(可能有一些是)

最后一轮即最后一轮决定胜负

这可以看作是一棵树

树的每个节点都将是该节点的子节点之间匹配的获胜者

树叶是球员。第一轮的获胜者是树叶的父母等

这是n个节点上的完整二叉树

现在跟随获胜者的道路。获胜者进行了对数n的比赛。现在考虑那些log n匹配的失败。第二好的一定是最好的

胜利者在n-1场比赛中决定(你每场比赛淘汰一个),而logn中的胜利者在logn-1场比赛中决定

因此,您可以在n+logn-2比较中确定最大值和第二大值

事实上,可以证明这是最优的。在最坏情况下的任何比较方案中,获胜者必须进行logn比赛

为了证明这一点,假设一个积分系统,在比赛后胜利者得到失败者的分数。最初,所有人都以每人1分开始

最后的胜利者得了n分


现在给出任何算法,它都可以被安排成得分更多的玩家永远是赢家。由于在这种情况下,任何人的分数在任何比赛中最多翻倍,因此在最坏的情况下,您需要至少记录赢家进行的n场比赛。

这有问题吗?最多3次比较(不包括
i
比较)。如果你算一下,它是4n(或者在第二个例子中是5n)

double first=-1e300,second=-1e300;
对于(i=0;i第一个){
第二=第一;
第一个=a[i];
}
else if(a[i]>second&&a[i]
另一种编码方式:

for (i = 0; i < n; i++) if (a[i] > first) first = a[i];
for (i = 0; i < n; i++) if (a[i] < first && a[i] > second) second = a[i];
for(i=0;ifirst)first=a[i];
对于(i=0;isecond)second=a[i];

你想要实际的算法还是线索(例如,一些家庭作业帮助)?我想看看实际的算法。这不是家庭作业,而是我的一个同事提出的问题。这叫做比赛选择算法。你可以在这里读到更多的东西,比如:嘿,我没有回答,因为时间晚了,我要睡觉了:)。不过你做得很好@帕克:谢谢!我只是好奇,这是我承认你首先回答它的方式:-)我将删除该部分。是的,存在一个问题:你的解决方案平均使用了超过n+log(n)的比较+谢谢你的努力。@Philip:duh。我查看了
+
并看到
*
和&a[I]
这部分是不必要的,因为它的本质包含在first if中。@用户在那里是为了避免获得与
first
second
相同的值。对于重复最大元素的数组,如果没有
&&a[i]
将导致first和second具有相同的值
for (i = 0; i < n; i++) if (a[i] > first) first = a[i];
for (i = 0; i < n; i++) if (a[i] < first && a[i] > second) second = a[i];