リンクされたリストのレベルを使用します。
message1
message2
message3
message4
message5
message6
message7
各ノードには、次へのポインターがあります。
- forward sibling (2->5, 3->4, 5->6, 1/4/6/7->NULL).
- backward sibling (4->3, 5->2, 6->5, 1/2/3/7->NULL).
- first child (1->2, 2->3, 6->7, 3/4/5/7->NULL).
- parent (2->1, 3->2, 4->2, 5->1, 6->1, 7->6, 1->NULL).
各レベル内で、メッセージは投票数 (または使用したいその他のスコア) によってリスト内で並べ替えられます。
message2
これにより、物事を移動するための最大の柔軟性が得られ、親とそのレベルでリンクを変更するだけで、サブツリー全体 (例: ) を移動できます。
たとえば、message6
が よりも人気のある票を獲得したとしますmessage5
。変更点は次のとおりです (次と前の兄弟ポインターの両方を調整します)。
message2 -> message6
message6 -> message5
message5 -> NULL
.
取得するため:
message1
message2
message3
message4
message6
message7
message5
よりも多くの票を獲得するまで続けるmessage2
と、次のことが起こります。
message6 -> message2
message2 -> message5
ANDの最初の子ポインターは(以前は) にmessage1
設定されていますが、それでも比較的簡単に取得できます。message6
message2
message1
message6
message7
message2
message3
message4
message5
並べ替えは、スコアの変更によってメッセージが上位の兄弟よりも大きくなった場合、または下位の兄弟よりも小さくなった場合にのみ発生する必要があります。スコアが変わるたびに再注文する必要はありません。