私は注文統計量を増やした赤黒の木を持っています。
それはほとんどの場合機能します。しかし、ノードの場所をソート順に返す高速関数 (O(lg n)) を実装する必要があります。私の教科書のOSランク関数のように。ただし、1 つのひねりがあります。2 つのノードのスコアが同じ場合、戻り値は同じになるはずです。これが os-rank 関数です (ルートがツリーのルートである特定のノード x に対する疑似コードで)。
OS-Rank(x)
r=x.left.size+1
y=x
while y!=root
if y==y.p.right
r+=y.p.left.size+1
y=y.p
return r
しかし、私が必要としているのは、A がキー 1 を持ち、ノード B がキー 1 を持っている場合、関数は両方に対して 1 を返すものです。等々。私はこのようなもので自分自身を試しました。
rank(x)
start with value r=1
check that x.right is not Nil
case x.right has the same key as x
add x.right.#nodeswithkeyhigher(x.key) to r
other cases: add x.right.size to r
y=x
while y != root
if y.parent.left == y
case y.parent.right.key>x.key
add y.parent.right to r
other cases
add y.parent.right.#nodeswithkeyhigher(x.key) to r
y=y.parent
return r
何を推測しますか: テストケースが失敗しました。これが正しい方法であるかどうか、またはおそらく私が見ていない間違いを犯したかどうかを知りたいです (そうでなければ、間違いは Node.#nodeswithkeyhigher(key) 関数にあります)。