2010-05-05 5 views
1

127415157,31323794 ... (범위를 알 수 없음)와 같은 ID 배열이 있습니다. PHP에서 최대 빈도 ID를 찾는 가장 빠른 방법은 무엇입니까?PHP에서 최대 주파수 요소를 찾는 가장 빠른 방법

$array_ids = array() 
+0

... 프로젝트 오일러? – medopal

+0

@medopal : 아니지만 나는 그것을 봤다. 흥미 롭다. 언젠가는 그것을 시도해 보라. :) – 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 log n'시간이 걸리는 정렬과는 반대로 선형 시간이 걸립니다. – Amber

+0

그래 멋지 네 – nik

+0

@stereo : array_search 대신 array_keys를 사용해야하지 않습니까? – 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); 

가 완전히 정렬 배열을 필요로하지 않기 때문에, 그러나 이것보다 더 빠를 수 있습니다 max()과 함께 array_search()을 사용하는 제안, 따라서 O(n log n) 대신 O(n) 시간이 실행됩니다.

+0

맞아요, PHP의 정렬이 제자리에서 그렇게되는 것을 잊었습니다. 결정된. – Amber

2

동일 주파수로 복수의 요소의 문제 해결 : 5,3

또한/

$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 것입니다되고 array_search와 max 콤보를 사용하는 것보다 조금 더 빠릅니다.

관련 문제