Dizisinde büyük değerler

4 Cevap php

Herkes nasıl takip dizisinde üçüncü sütunu İKİ en büyük değerlerini alabilir biliyor?

$ar = array(array(1, 1,   7.50,   'Hello'),
              array(1, 2,  18.90,   'Hello'),
              array(3, 5,  11.50,   'Hello'),
              array(2, 4,  15.90,  'Hello'));

Çıktı olmalıdır:

15.90
18.90

Şimdiden teşekkürler

4 Cevap

Sıralama O (n log n) 'dir, ama aslında (dizi büyük eğer, faster olan) O (n) bu gerçekleştirebilirsiniz. Pseudocode şöyle:

first  = array[0][2]
second = array[1][2]
if second > first
   first, second = second, first
for tuple in array[2:n]
   if tuple[2] > second
      second = tuple[2]
   if second > first
      first, second = second, first

N büyük değerler için daha genel bir çözüm (pseudo-code)

def maxN(list, n):
    result = []
    curmin = 0
    for number in list:
        if number > curmin:
            binary insert number into result.    #O(log n)
            if len(result) > n:  
                truncate last element            #O(1)
            curmin = new minimum in result list  #O(1) since list is sorted

    return result

M listesinin boyutu ve n istediğiniz maksimum elemanların sayısı olduğu her şey, O ... (m log n) alacaktır. Bu büyük n için, O (n log n) alır listesini sıralamak eğer daha iyidir.

Sadece maksimum iki unsur istiyorsanız ama aynı zamanda overkill.

Bunu yapmanın en basit yollarından biri, ilk iki değerleri yazdırmak, sonra, tek bir diziye tüm değerleri toplamak dizi sıralamak için.

Orada tüm dizi sıralama içermeyen daha verimli yolu vardır, ama yukarıdaki başlamak gerekir.