Find the 2nd largest element in an array with minimum number of comparisons

后端 未结 24 1128
清酒与你
清酒与你 2020-11-28 01:03

For an array of size N, what is the number of comparisons required?

相关标签:
24条回答
  • 2020-11-28 01:27

    Assuming space is irrelevant, this is the smallest I could get it. It requires 2*n comparisons in worst case, and n comparisons in best case:

    arr = [ 0, 12, 13, 4, 5, 32, 8 ]
    max = [ -1, -1 ]
    
    for i in range(len(arr)):
         if( arr[i] > max[0] ):
            max.insert(0,arr[i])
         elif( arr[i] > max[1] ):
            max.insert(1,arr[i])
    
    print max[1]
    
    0 讨论(0)
  • 2020-11-28 01:27

    try this.

    max1 = a[0].
    max2.
    for i = 0, until length:
      if a[i] > max:
         max2 = max1.
         max1 = a[i].
         #end IF
      #end FOR
    return min2.
    

    it should work like a charm. low in complexity.

    here is a java code.

    int secondlLargestValue(int[] secondMax){
    int max1 = secondMax[0]; // assign the first element of the array, no matter what, sorted or not.
    int max2 = 0; // anything really work, but zero is just fundamental.
       for(int n = 0; n < secondMax.length; n++){ // start at zero, end when larger than length, grow by 1. 
            if(secondMax[n] > max1){ // nth element of the array is larger than max1, if so.
               max2 = max1; // largest in now second largest,
               max1 = secondMax[n]; // and this nth element is now max.
            }//end IF
        }//end FOR
        return max2;
    }//end secondLargestValue()
    
    0 讨论(0)
  • 2020-11-28 01:28

    A good way with O(1) time complexity would be to use a max-heap. Call the heapify twice and you have the answer.

    0 讨论(0)
  • 2020-11-28 01:29
    function findSecondLargeNumber(arr){
    
        var fLargeNum = 0;
        var sLargeNum = 0;
    
        for(var i=0; i<arr.length; i++){
            if(fLargeNum < arr[i]){
                sLargeNum = fLargeNum;
                fLargeNum = arr[i];         
            }else if(sLargeNum < arr[i]){
                sLargeNum = arr[i];
            }
        }
    
        return sLargeNum;
    
    }
    var myArray = [799, -85, 8, -1, 6, 4, 3, -2, -15, 0, 207, 75, 785, 122, 17];
    

    Ref: http://www.ajaybadgujar.com/finding-second-largest-number-from-array-in-javascript/

    0 讨论(0)
  • 2020-11-28 01:30

    The following solution would take 2(N-1) comparisons:

    arr  #array with 'n' elements
    first=arr[0]
    second=-999999  #large negative no
    i=1
    while i is less than length(arr):
        if arr[i] greater than first:
            second=first
            first=arr[i]
        else:
            if arr[i] is greater than second and arr[i] less than first:
                second=arr[i]
        i=i+1
    print second
    
    0 讨论(0)
  • 2020-11-28 01:33

    The optimal algorithm uses n+log n-2 comparisons. Think of elements as competitors, and a tournament is going to rank them.

    First, compare the elements, as in the tree

       |
      / \
     |   |
    / \ / \
    x x x x
    

    this takes n-1 comparisons and each element is involved in comparison at most log n times. You will find the largest element as the winner.

    The second largest element must have lost a match to the winner (he can't lose a match to a different element), so he's one of the log n elements the winner has played against. You can find which of them using log n - 1 comparisons.

    The optimality is proved via adversary argument. See https://math.stackexchange.com/questions/1601 or http://compgeom.cs.uiuc.edu/~jeffe/teaching/497/02-selection.pdf or http://www.imada.sdu.dk/~jbj/DM19/lb06.pdf or https://www.utdallas.edu/~chandra/documents/6363/lbd.pdf

    0 讨论(0)
提交回复
热议问题