2017-04-15 1 views
2

웹 사이트 용 웹 로그 분석을 구축하고 오늘 가장 인기있는 페이지를 N 개 표시하고 싶습니다. 알고리즘은 상수 메모리이동 카운터의 두 가지 요구 사항을 충족해야합니다.오늘 카운트가 가장 많은 N 개의 이벤트가 많습니다.

상수 메모리

페이지의 수십억가있을 수 있습니다, 우리는 그들 모두를 위해 수를 유지하고 싶지 않아요. 알고리즘은 상수 메모리를 사용하는 일종의 스마트 확률 카운터를 사용해야합니다. Count–min sketch이 있지만 모든 요소의 개수를 계산하려고 시도하는 것 같습니다. 모든 요소를 ​​신경 쓰지 않고 최상위 N 만 고려하면 더 간단하고 견적이 더 좋은가?

이동 카운터 탑 N 페이지

는 매일, 오늘 최고 2 페이지 /cats.html/dogs.html 될 수 있지만 내일이 /pizza.html/donuts.html 같은 완전히 다른 일 수 다릅니다. 가장 간단한 방법은 카운터를 매일 다시 시작하는 것이지만 괜찮 으면 좋겠지 만 이동 평균과 같은 더 똑똑한 방법이있을 수 있습니까? 이벤트 스트림의

예 : 만약 내가 올바르게 기억

[ 
{ page: '/cats.html', time: 'today, 12:00' }, 
{ page: '/cats.html', time: 'today, 11:00' }, 
{ page: '/dogs.html', time: 'today, 10:00' }, 
{ page: '/dogs.html', time: 'today, 09:00' }, 
{ page: '/donuts.html', time: 'today, 08:00' }, 
{ page: '/donuts.html', time: 'yesterday, 20:00' }, 
{ page: '/cats.html', time: 'yesterday, 19:00' }, 
... 
] 

답변

1

, 당신은 상수 메모리를 가장 많이 값을 얻을 수 있습니다,하지만 난 그것을 여러 값에 대해 작동합니다 생각하지 않습니다.

대략적인 답이 충분하다면 HyperLogLog 알고리즘을 살펴볼 수 있습니다. 고유 한 값의 수를 세는 것과 똑같은 문제는 아니지만, 거기에서 사용되는 기술은 문제를 해결하는 데 유용 할 수 있습니다.

This question도 관련이 있지만 상수 메모리 제약 조건이 없습니다.

관련 문제