我们知道找到最小数量的列表的简单方法只是n次比较,如果我们想要第二个最小数字,我们可以再次通过它或者只是在第一次迭代期间跟踪另一个变量。无论哪种方式,这将需要2n比较来找到两个数字。
假设我有一个n个不同元素的列表,我想找到最小的和第二个最小的元素。是的,最优算法最多需要n + ceiling(lg n) - 2次比较。 (虽然对最佳方式不感兴趣)
但是假设你被迫使用简单算法,即进行2n比较的算法。在最坏的情况下,它需要进行2n次比较。但平均值呢?使用简单的强力算法找到最小和第二小的平均比较数是多少?
编辑:它必须小于2n - (从下面的评论中复制和粘贴)我将我所处的索引与tmp2变量进行比较,保持第二小的跟踪。除非当前索引处的值小于tmp2,否则我不需要对tmp1变量进行另一次比较以保持跟踪最小值。因此,您可以减少2n的比较次数。它仍然需要超过n。是的,在最坏的情况下,这仍然需要进行2n次比较。但平均而言,如果一切都是随机的......
我猜它是n +比较的东西,但我无法弄清楚第二部分。我想可能会有某种方式让logn以某种方式参与,但是有关如何证明这一点的想法?
(Coworker在午餐时问我这个,我很难过。抱歉。)再一次,我对最佳算法不感兴趣,因为那是一种常识。
答案 0 :(得分:2)
正如您在评论中指出的那样,如果迭代中的当前元素大于到目前为止找到的第二个最小元素,则不需要进行第二次比较。如果我们看第k个元素,第二次比较的概率是多少?
我认为这可以改写如下:“第k个元素在包含前k个元素的2个最小元素的子集中的概率是多少?” 对于均匀分布的元素,这应该是2 / k,因为如果我们将前k个元素视为有序列表,则每个位置对于第k个元素具有相等的概率1 / k,但是仅具有两个,最小和第二最小位置,引起第二次比较。因此,第二次比较的数量应为sum_k = 1 ^ n(2 / k)= 2 H_n(第n次谐波数)。这实际上是第二次比较的期望值的计算,其中随机数表示必须进行第二次比较的事件,如果必须进行第二次比较则为1,如果只需要进行一次比较则为0 。
如果这是正确的,则在平均情况下的总比较数是C(n)= n + 2 H_n并且afaik H_n = theta(log(n)),C(n)= theta(n + log( n))= theta(n)