2010-05-05 90 views
1

我有一個像127415157,31323794 ......(範圍未知)的ID數組。在PHP中找到最大頻率ID的最快方法是什麼?在PHP中找到最大頻率元素的最快方法

$array_ids = array() 
+0

...歐拉項目? – medopal 2010-05-05 09:45:24

+0

@medopal:不,但我GOOGLE了它,它看起來很有趣..可能會嘗試一下:) – Bruce 2010-05-05 09:48:21

回答

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 log n時間。 – Amber 2010-05-05 10:03:08

+0

耶看起來不錯 – nik 2010-05-05 10:06:05

+0

@stereo:我們不應該使用array_keys而不是array_search? – Bruce 2010-05-05 10:08:08

0

嘗試 max

$max = max($array_ids); 
+0

我不認爲這解決OP的問題 - 他們似乎是處理*頻率*,因此我猜他們想要在數組中最經常出現的項目。 – Amber 2010-05-05 09:47:22

+0

@Dav:你說得對 – Bruce 2010-05-05 09:49:08

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 2010-05-05 09:59:41

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 "; 

這將輸出中

衆數/被5,3

也,它比使用array_search和max組合更快一點...

相關問題