Arrays 寻找数组中的第二小元素

Arrays 寻找数组中的第二小元素,arrays,algorithm,Arrays,Algorithm,我试图在n个元素的数组中只使用n+ceil(lgn)-2比较来找到第二个最小的元素。CLRS中的提示是查找最小的元素 这需要进行n-1比较,因此我只需要进行cel(lg n)-1比较,以找到第二个最小的,一旦我知道了最大的 有什么想法吗 谢谢 b外行这里是JavaScript的一个基本实现,但不确定它是否在所有情况下都完全符合您的O()要求。初始数组也会影响比较计数 var元素=[12,1,3,4,65,7,-43,8,3,8,45,2]; var nCompare=0; var最小=元素[0

我试图在n个元素的数组中只使用
n+ceil(lgn)-2
比较来找到第二个最小的元素。CLRS中的提示是查找最小的元素

这需要进行
n-1
比较,因此我只需要进行
cel(lg n)-1
比较,以找到第二个最小的,一旦我知道了最大的

有什么想法吗

谢谢


b外行

这里是JavaScript的一个基本实现,但不确定它是否在所有情况下都完全符合您的O()要求。初始数组也会影响比较计数

var元素=[12,1,3,4,65,7,-43,8,3,8,45,2];
var nCompare=0;
var最小=元素[0],较小=元素[0];
对于(变量i=1;ipublic class MainClass {
    public static void main(String[] args) {
        int[] a = { 4, 2, 8, -2, 56, 0 };
        c(a);
    }

    private static void c(int[] a) {
        int s = Integer.MAX_VALUE;
        int ss = Integer.MAX_VALUE;
        for (int i : a) {
            if (i < s) {
                ss = s;
                s = i;
            } else if (i < ss) {
                ss = i;
            }
        }
        System.out.println("smallest : " + s + " second smallest : " + ss);
    }
}
'Elements:['+Elements.join(',')+']\n'+ “#元素:”+elements.length+“\n”+ “\n”+ '最小值:'+最小值+'\n'+ “第二个最小值:”+较小值+“\n”+ “#比较:”+n比较+
'';假设我们有一个列表a1…an,
n
是2的幂

首先将元素配对,比如a1和a2,a3和a4等等,并相互比较。这将为您提供
n/2
比较

将所有获胜者提前到下一轮,该轮现在只有
n/2
元素,并重复相同的过程。这需要更多的比较

重复以上步骤,直到你只剩下1个元素,最终的赢家。要到达那里,你必须做
n/2+n/4+…+1=n-1
比较

那很好,但是哪一个可以是第二小的呢?好吧,这一定是你的赢家在登上榜首的过程中击败的因素之一。有
lg n
这样的失败者,所以你需要相互比较,找出最小的(需要进一步的
lg n-1
比较)

失败者中最小的是第二小的


很容易证明为什么上面的方法总是找到第二个最小的:因为它比每一个元素都小,但最终的赢家,它将赢得每一轮,除了对冠军的那一轮

如果
n
不是2的幂,则过程几乎完全相同,只是输家的列表将与下一个2的幂相同长,这就是为什么您最终得到
ceil(lg n)

以下是一个在Java中具有O(n)复杂性的解决方案:

for(i,0,no_of_elem-1)
{
 if(min>elem[i])
 {
   second_smallest=min;
   min=elem[i];
 }
}
public类MainClass{
公共静态void main(字符串[]args){
int[]a={4,2,8,-2,56,0};
c(a);
}
私有静态void c(int[]a){
int s=整数最大值;
int ss=整数的最大值;
对于(int i:a){
如果(i

输出:最小值:-2秒最小值:0

我认为他们不需要进行cel(logn)-1额外比较,因为它只能在O(n)中完成,即在一次扫描中,借助一个额外变量,如下所示:-


您只需将上一个最小值存储在变量中,因为扫描所有元素后,这将是您的答案。

如果允许使用两个内存位置,则有两个变量
最小值
次最小值
;将它们都设置为远高于数组中任何值的值。然后在数组中循环,根据当前正在查看的数组元素调整两个变量的值。@JonathanM-在降序排序数组中不是2n个比较吗?(问题不是关于O()…)lg的
lg
术语似乎暗示了某种分而治之的方法。请再次阅读问题(如果您愿意,请阅读注释)->错误的答案。但是如何在特定的语言(例如Java)中实现这一点?如何在不进行任何额外比较/搜索的情况下查找/记录lgn失败者?@感伤的我可能会使用一个
Round
类,该类包含两个被比较的元素,并分别引用它们来自的
Round
对象。然后,从获胜者那里,你可以沿着路线返回到获胜者参加的第一轮比赛。当然,这是一个额外的
2n
内存插槽,但问题只是比较的数量。