당신이있을 때 정말 큰 파일과 많은 그것의 요소를하지만, 가장 일반적인 요소는 매우 일반적이다 - 발생 시간의 비율을 - 당신은 공간과 선형 시간에서 찾을 수 있습니다 O ( K ) (단어 O ( ) 표기법 의 상수 는 매우 작습니다. 해시와 같은 보조 항목에 대한 저장소를 계산하지 않으면 기본적으로 2입니다. 또한 파일은 한 번에 한 요소 씩 순서대로 처리되고 알고리즘은 "돌아 보지"않기 때문에 외부 저장소와 함께 작동합니다. 이를 수행하는 한 가지 방법은 Misra와 Gries의 클래식 알고리즘을 사용하는 것입니다. 강의 노트를 참조하십시오.> 1 / kO ( k )O ( ). 이 문제는 이제 헤비 타자 문제로 알려져 있습니다 (빈번한 요소는 헤비 타자입니다).
가정 가장 빈번한 요소 나타 에 대한 시간의 비율 K 소수 강한 보일 수 있지만이 방법에 필요하다! 즉, 파일에 순차적으로 액세스 할 수 있고 (파일이 엄청나게 무작위로 액세스하는 경우 비용이 너무 많이 드는 경우) 항상 일정한 패스 수에서 가장 빈번한 요소를 찾는 알고리즘은 요소 수에서 공간을 선형으로 사용합니다 . 따라서 입력에 대해 가정하지 않으면 해시 테이블을 이길 수 없습니다. 가장 빈번한 요소가 매우 빈번하다는 가정은 아마도 부정적인 결과를 피하는 가장 자연스러운 방법 일 것입니다.> 1 / k케이
여기에 대한 스케치가 있습니다. 즉, 절반 이상의 시간에 단일 요소가있는 경우입니다. 이 특별한 경우는 과반수 투표 알고리즘으로 알려져 있으며 Boyer와 Moore에 의한 것입니다. 우리는 하나의 요소와 하나의 수를 유지합니다. 카운트를 1로 초기화하고 파일의 첫 번째 요소를 저장하십시오. 그런 다음 파일을 순서대로 처리하십시오.k = 2
- 파일의 현재 요소가 저장된 요소와 동일하면 개수를 1 씩 증가시킵니다.
- 파일의 현재 요소가 저장된 요소와 다른 경우 카운트를 1 씩 줄입니다.
- 업데이트 된 카운트가 0이면, 저장된 요소를 "차기"하고 파일의 현재 요소를 저장하고; 카운트를 1로 늘리십시오
- 파일의 다음 요소로 진행
이 절차에 대해 조금만 생각하면 "주요"요소가 존재하는 경우, 즉 절반 이상이 발생하는 경우 전체 파일이 처리 된 후 해당 요소가 저장된 요소가된다는 것을 확신 할 수 있습니다.
케이k - 1k - 1케이케이
k - 11 개 / kO ( k )
케이1 개 / kk - 1