내 댓글 출신이 밀접하게 학문적 생산성 평가에서 수량 유비쿼터스 관련되면, Hirsh 지수는 더 잘 알려진 -indexh . 간단히 말해서 이는 출판물의 수로서 정의된다 하나는 그들 각각 적어도 갖도록 보유 시간 서지 (최대 같은 시간 동안 ).hhh
당신의 문제가 다른 유일한 방법은 당신이 얼마나 많은 출판물이 기준을 만족시키는 지뿐만 아니라 그들의 인용 횟수가 무엇인지에 관심이 있다는 것입니다 . 그러나 그것은 사소한 수정입니다. 데이터가 이미 있으며 원래 알고리즘은 삭제합니다.
일반적으로 구현 된 계산 은 다소 간단하며 Karolis Juodelė의 답변에 동의합니다 .
업데이트 : 데이터의 크기와 특성에 따라 피봇 포인트 위와 아래에서 데이터를 필터링하여 배열을 부분적으로 정렬하는 방법을 탐색하는 것이 좋습니다 (quicksort가 떠 오릅니다). 그런 다음 너무 적거나 너무 많은지 여부에 따라 피벗을 포함하는 하위 집합에서 피벗 및 다시 실행을 조정합니다. 보다 높은 요소 사이에는 순서가 필요하지 않으며 확실히 그보다 낮은 요소 사이에는 필요하지 않습니다 . 예를 들어, 모든 요소가 h 1 보다 크거나 같은 것을 발견 하고 그 중 h 1 보다 작은 것이 발견되면 해당 하위 세트를 다시 만질 필요가 없습니다. 이는 퀵 정렬에 고유 한 재귀를 테일 재귀 로 변환 하므로 루프로 다시 쓸 수 있습니다.hh1h1
내 Haskell은 약간 녹슬지 만 위의 내용을 따라야 작동합니다. 어느 정도 이해할 수 있기를 바랍니다. 추가 설명을 드리겠습니다.
-- just a utility function
merge :: [a] -> [a] -> [a]
merge [] ys = ys
merge (x:xs) ys = x : merge xs ys
-- the actual implementation
topImpl :: [Int] -> [Int] -> [Int]
topImpl [] granted = granted
topImpl (x:xs) granted
| x == (1 + lGreater + lGranted) = x : merge greater granted
| x > (1 + lGreater + lGranted) = topImpl smaller (x : merge greater granted)
| otherwise = topImpl greater granted
where smaller = [y | y <- xs, y < x]
greater = [y | y <- xs, y >= x]
lGreater = length greater
lGranted = length granted
-- starting point is: top of whole array, granted is empty
top :: [Int] -> [Int]
top arr = topImpl arr []
아이디어는 granted
결과에 확실히 참여할 것으로 알고 있는 것을 수집하고 더 이상 정렬하지 않는 것입니다. fit greater
과 함께 사용 하면 x
운이 좋으며 그렇지 않은 경우 더 작은 하위 집합으로 시도해야합니다. (피벗은 x
현재 간주 하위 목록의 첫 번째 항목 우연히 어떤 간단하다.) 참고 하나 가장 큰 요소 중 하나를 복용에 대한 중요한 장점은 우리가 평균 크기의 블록에이 작업을 수행한다는 것을 더 정렬 할 필요가 없습니다.remaining/2
예:
당신의 세트를 보자 [1,3,4,1,3,6]
.
x = 1
, granted = []
, greater = [3,4,1,3,6]
. 우리 smaller
는 첫 번째 단계에서 피벗이 너무 작을 때 (실제로는 너무 작음) 병리학 적 사례를 맞았습니다 . 운 좋게도 우리 알고는 그 준비가되어 있습니다. 혼자 버리고 x
다시 시도합니다 greater
.
x = 3
, granted = []
, greater = [4,3,6]
. 함께, 그들은 길이 4의 배열을 형성하지만 우리는 아래에서 3으로 제한하기 때문에 너무 많습니다. greater
혼자 반복하십시오 .
x = 4
, granted = []
, greater = [6]
. 이것은 각각 ≥ 4의 2 요소 배열을 제공합니다. 이것을 유지하고에 반복하십시오 smaller = [3]
.
x = 3
, granted = [4,6]
, greater = []
. 이것은 함께 3 개 이상의 요소 3 개로 구성된 배열을 제공하므로 우리는 해 [3,4,6]
를 구할 수 있습니다. 순열은 입력 순서에 따라 다를 수 있지만 항상 [3,3,6]
또는 가능한 한 가장 높은 항을 포함합니다 [3,3,4]
.
(Btw. 재귀는 실제로 사이클로 축소되었습니다.) 복잡성이 저장된 비교가 많기 때문에 퀵 정렬보다 다소 낫습니다.
n−1
O(logn)O(n)
nO(n2)
위의 코드에는 불필요하게 비교할 smaller
수 있습니다. 필요한지 여부를 계산 하는 것과 같이 쉽게 제거 할 수 있습니다. (나는 게으른 평가가 그것을 처리 할 것이라고 생각합니다.)