鑒于以下問題:“存儲數(shù)字流中最大的5000個數(shù)字”想到的解決方案是一個二叉搜索樹,該樹維護(hù)該樹中節(jié)點數(shù)的計數(shù),并在計數(shù)達(dá)到5000時引用最小節(jié)點。當(dāng)計數(shù)達(dá)到5000時,可以將要添加的每個新數(shù)字進(jìn)行比較。樹上最小的項目。如果更大,則可以添加新的數(shù)字,然后刪除最小的數(shù)字,并計算出新的最小數(shù)字(這很簡單,因為已經(jīng)具有先前的最小數(shù)字)。我對此解決方案的擔(dān)心是,二叉樹自然會偏斜(因為我只是在一側(cè)刪除)。有沒有一種方法可以解決這個問題,而又不會造成嚴(yán)重歪斜的樹?如果有人需要,到目前為止,我為我的解決方案提供了偽代碼:process(number){ if (count == 5000 && number > smallest.Value) { addNode( root, number) smallest = deleteNodeAndGetNewSmallest ( root, smallest) }}deleteNodeAndGetNewSmallest( lastSmallest){ if ( lastSmallest has parent) { if ( lastSmallest has right child) { smallest = getMin(lastSmallest.right) lastSmallest.parent.right = lastSmallest.right } else { smallest = lastSmallest.parent } } else { smallest = getMin(lastSmallest.right) root = lastSmallest.right } count-- return smallest}getMin( node){ if (node has left) return getMin(node.left) else return node}add(number){ //standard implementation of add for BST count++}
存儲數(shù)字流中最大的5000個數(shù)字
當(dāng)年話下
2019-11-18 18:37:16