2010-05-05 2 views
1

У меня есть массив идентификаторов вроде 127415157,31323794 ... (диапазон неизвестен). Каков самый быстрый способ найти максимальный идентификатор частоты в PHP?Самый быстрый способ найти максимальный частотный элемент в PHP

$array_ids = array() 
+0

... Project Euler? – medopal

+0

@medopal: Нет, но я искал ее в googled, и это выглядит интересно. Можете попробовать это когда-нибудь :) – Bruce

ответ

6
$a = array(1, 2, 3, 4, 3, 3, 4, 4, 1, 3); 
$r = array_count_values($a); 
$k = array_search(max($r), $r); 
echo "most frequent value is $k"; 
+0

+1, так как это, скорее всего, быстрее, чем исходное решение, которое я предложил, учитывая, что поиск max занимает линейное время, а не сортировку, которая занимает время n nnnn. – Amber

+0

Да выглядит отлично – nik

+0

@stereo: Разве мы не должны использовать array_keys вместо array_search? – Bruce

0

Попробуйте max

$max = max($array_ids); 
+0

Я не думаю, что это касается вопроса OP - они, похоже, имеют дело с * частотами *, и поэтому я предполагаю, что они хотите элемент, который чаще всего встречается в массиве. – Amber

+0

@Dav: вы правы – Bruce

7
// Gives us an associative array of id=>count mappings, 
$counts = array_count_values($array_ids); 
// and sorts it from largest to smallest count 
arsort($counts); 

// Gets the first key after sorting, which is the id with the largest count 
$max_freq_id = key($counts); 

Предложение использования array_search() в сочетании с max() может быть быстрее, чем это, однако, так как это не нужно полностью сортировки массива, и, таким образом, будет работать в O(n) времени вместо O(n log n).

+0

Право, забыл, что виды PHP делают это на месте. Исправлена. – Amber

2

Решение проблемы нескольких элементов с той же частотой:

$values = array(1, 1, 3, 3, 3, 3, 4, 5, 5, 5, 5, 6); 
$freq = array_count_values($values); 
arsort($freq); 
$max = $val = key($freq); 
while(next($freq) && current($freq) == $freq[$max]){ 
    $val .= ','.key($freq); 
} 

echo " most frequent value is/are $val "; 

это Ouput

наиболее частое значение является/являются 5,3

также, это немного быстрее, чем использование array_search и max combo ...

Смежные вопросы