Самые большие значения в массиве - PullRequest
1 голос
/ 31 октября 2008

Кто-нибудь знает, как я могу получить два самых больших значения из третьего столбца в следующем массиве?

$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'));

Вывод должен быть:

15.90
18.90

Заранее спасибо

Ответы [ 5 ]

3 голосов
/ 01 ноября 2008

Более общее решение для n самых больших значений (псевдокод)

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

Все это займет ... O (m log n), где m - размер списка, а n - максимальное количество элементов, которое вы хотите. Это намного лучше, чем если вы сортируете список, который принимает O (n log n), для больших n.

Но это также излишне, если вы просто хотите получить максимум два элемента.

3 голосов
/ 01 ноября 2008

Сортировка - O (n log n), но вы можете сделать это за O (n) (то есть, быстрее , если массив большой). Псевдокод следует:

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
3 голосов
/ 31 октября 2008

Если вы уверены, что значение (два) никогда не изменится, просто переберите массив и отследите два самых больших числа. Если нет, сортируйте массивы, используя usort () и предоставляя соответствующий обратный вызов. Затем возьмите первые два значения:

function cmp($a, $b) {
    $a = $a[2];
    $b = $b[2];
    return $a == $b ? 0 : $a < $b ? 1 : -1;
}

usort($ar, 'cmp');
0 голосов
/ 01 ноября 2008

Откуда вы получаете данные массива? Как часто будут меняться данные? Можете ли вы получить массив, уже отсортированный по этому полю? Если имеется большое количество элементов данных, может быть стоит выполнить второй запрос?

0 голосов
/ 31 октября 2008

Один из самых простых способов сделать это - собрать все значения в один массив, отсортировать массив, а затем распечатать первые два значения.

Существуют более эффективные способы, которые не включают сортировку всего массива, но приведенное выше должно помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...