빌딩 오프 및 이전 질문 : Computing stats on generators in single pass. Python어떻게 한 번에 발전기로 백분위 수와 랭크를 계산할 수 있습니까?
앞서 언급했듯이 생성기에서 통계를 계산하는 것은 단일 패스에서 매우 빠르고 메모리 효율적입니다. 90 번째 백분위 수와 같은 복잡한 통계 및 순위 속성과 n 번째 작은 것은 종종 표준 편차 및 평균보다 더 복잡한 작업이 필요합니다 (위에서 해결). 이러한 접근법은 데이터를 목록에 넣거나 여러 패스를 계산하는 것이 매우 느리게 진행되는지도/축소 작업 및 대규모 데이터 세트로 작업 할 때 매우 중요합니다.
다음은 순위 순서에 따라 데이터를 찾는 O (n) 퀵 소트 스타일 알고리즘입니다. 중간 값, 백분위 수, 사 분위수 및 십진수를 찾는 데 유용합니다. 데이터가 이미 정렬 될 때 data [n]과 같습니다. 그러나 분할/피벗 될 수있는 목록의 모든 데이터가 필요합니다.
어떻게 생성기로 한 번에 중간 값, 백분위 수, 4 분위수 및 십진수를 계산할 수 있습니까?
전체 목록
import random
def select(data, n):
"Find the nth rank ordered element (the least value has rank 0)."
data = list(data)
if not 0 <= n < len(data):
raise ValueError('not enough elements for the given rank')
while True:
pivot = random.choice(data)
pcount = 0
under, over = [], []
uappend, oappend = under.append, over.append
for elem in data:
if elem < pivot:
uappend(elem)
elif elem > pivot:
oappend(elem)
else:
pcount += 1
if n < len(under):
data = under
elif n < len(under) + pcount:
return pivot
else:
data = over
n -= len(under) + pcount
"발전기 사용"이란 무엇입니까? 온라인 Quantile 선택 알고리즘을 의미합니까? 기억의 제약은 무엇입니까? 오후 8시 30 분 P.S. "Quicksort 스타일"알고리즘은 QuickSelect 스타일로 k 번째 요소를 선택하기 때문에 QuickSelect로 알려져 있습니다. –
생성기는 데이터를 수집하기 위해 한 번 통과 할 수있는 컬렉션 용 파이썬 용어입니다. 네, 온라인 quantile selection 알고리즘을 의미합니다. QuickSelect에 감사드립니다. –
당신은 아직 메모리 제약 질문에 대답하지 않았습니다. 찾고자하는 요소가 첫 번째 요소 일 수 있기 때문에 이것은 필수적입니다. 따라서 스트림 크기에 대한 경계를 모르는 경우 전체 스트림을 암기해야 할 수도 있습니다. –