在PHP中找到最大频率元素的最快方法

问题描述:

我有一个像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

$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

尝试 max

$max = max($array_ids); 
+0

我不认为这解决OP的问题 - 他们似乎是处理*频率*,因此我猜他们想要在数组中最经常出现的项目。 – Amber 2010-05-05 09:47:22

+0

@Dav:你说得对 – Bruce 2010-05-05 09:49:08

// 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

解决同频多个元素的问题:

$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组合更快一点...