找到数组中第二大元素,并进行最少的比较

nab*_*aba 67 arrays algorithm search

对于大小为N的数组,所需的比较数是多少?

sdc*_*vvc 115

最优算法使用n + log n-2比较.将元素视为竞争对手,锦标赛将对其进行排名.

首先,比较元素,如在树中

   |
  / \
 |   |
/ \ / \
x x x x
Run Code Online (Sandbox Code Playgroud)

这需要进行n-1次比较,每个元素在最多log n次时进行比较.你会发现最大的元素是胜利者.

第二大元素必须与胜利者失去一场比赛(他不能失去与另一个元素的比赛),所以他是胜利者对阵的对手之一.您可以使用log n-1比较找到它们中的哪一个.

通过对手论证证明了最优性.请参阅https://math.stackexchange.com/questions/1601http://compgeom.cs.uiuc.edu/~jeffe/teaching/497/02-selection.pdfhttp://www.imada.sdu. dk/~jbj/DM19/lb06.pdfhttps://www.utdallas.edu/~chandra/documents/6363/lbd.pdf

  • Jatin:创建一个二叉树,然后从底部开始填充它.叶子是数组的元素.每个内部顶点都是其两个子节点中的最大值.您需要的比较数是内部顶点的数量,即n-1.然后,看看最大元素的"对手",那些是log N元素. (4认同)
  • @Hengameh说实话我没看到8的原因.它需要(n + log n - 2)比较来找到最大和第二大的元素,称它们为L_1和L_2; 接下来,我们发现,失去了L_1最大的元素,这是不L_2,还有数n-1个候选人,这就意味着日志N-2的比较,接下来,我们发现,失去了L_2最大的元素,有日志N-2的候选,所以记录的n-3比较,取这两个的最大值,这给出n +登录的n-2 +日志N - 2 +日志N - 3 + 1 = N + 3个对数的n-6.我可能会遗漏一些东西,对数应该在天花板等之下. (3认同)
  • @Jatin:不,它总共需要N + log N-2:N-1比较找到最大值,并记录N-1比较以找到丢失到最大元素的log N中的最大元素. (2认同)

Gum*_*mbo 12

您可以找到第二大值,最多2·(N -1)个比较,以及两个包含最大和第二大值的变量:

largest := numbers[0];
secondLargest := null
for i=1 to numbers.length-1 do
    number := numbers[i];
    if number > largest then
        secondLargest := largest;
        largest := number;
    else
        if number > secondLargest then
            secondLargest := number;
        end;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 您的算法不适用于{1,3,2}.它将返回1而不是2. (3认同)
  • 那不仅仅是N-1. (2认同)
  • @Iceman它适用于你给出的数组 (2认同)

小智 10

使用冒泡排序或选择排序算法,按降序对数组进行排序.不要完全排序数组.只需两次通过.第一遍给出最大元素,第二遍给你第二大元素.

第一次通过的比较次数:n-1

第一次通过的比较次数:n-2

总数没有.寻找第二大的比较:2n-3

也许你可以推广这个算法.如果您需要第3大,那么您将获得3次通过.

通过上面的策略,您不需要任何临时变量,因为冒泡排序和选择排序就位排序算法.

  • 这真的是一个聪明的解决方案 (2认同)