大廈關閉和更早的問題:Computing stats on generators in single pass. Python如何用一次通過計算髮電機的百分位數和等級?
正如我前面提到的一樣,從一個生成器計算統計數據是非常快速和高效的。複雜的統計數據和排名屬性(如第90百分位數和第n位最小數)往往需要比標準偏差和平均數更復雜的工作(在上面解決)。這些方法在處理地圖/縮減作業和將數據放入列表或計算多次通過的大型數據集變得非常緩慢時變得非常重要。
以下是用於查找基於排名順序的數據的O(n)快速排序樣式算法。用於尋找中位數,百分位數,四分位數和十進制數。等同於數據已經排序後的數據[n]。但是需要列表中的所有數據可以拆分/旋轉。
如何用一次通過計算髮生器的中位數,百分位數,四分位數和十位數?
需要的完整列表
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
你是什麼意思的「與發電機」?你的意思是一個在線分位數選擇算法?你的記憶力有多大? P.S. 「Quicksort風格」算法被稱爲QuickSelect,因爲它選擇QuickSort風格的第k個元素。 –
生成器是python術語,用於收集您可以通過一次收集數據。是的,我的意思是一個在線分位數選擇算法。感謝您的QuickSelect。 –
您尚未回答內存限制問題。這是必不可少的,因爲你正在尋找的元素可能是第一個,所以你可能需要記住整個流(除非你知道流大小的界限,那就是) –