-
Notifications
You must be signed in to change notification settings - Fork 0
Implementation
Keihō Sakapon edited this page Mar 18, 2022
·
26 revisions
Node<T> は、WBList<T> と WBTreeBase<T> で共通とする。
次の実装方法がある:
- Set と MultiSet、Map と MultiMap を分離する
-
IsDistinctを抽象プロパティとする
-
- Set と MultiSet、Map と MultiMap を分離しない
- コンストラクターで
IsDistinctを指定する - Map と MultiMap を共通化するのが難しい
- コンストラクターで
前者を採用。
次の実装方法がある:
-
T型- 合致するノードが存在しない場合の処理が複雑
-
GetItemOrDefault, TryGetItemなどを個別に実装
-
Node<T>型- 合致するノードが存在しない場合、
nullを返す -
GetItemOrDefault, TryGetItemなどをサポートするため、NodeHelperクラスにより拡張メソッドを提供する
- 合致するノードが存在しない場合、
後者を採用。
次の実装方法がある:
- 葉のアイテムと入れ替えて、葉を削除する
- 簡易的な実装
- 指定されたノードのインスタンスが木から削除されるとは限らない
- 葉のノードと入れ替えて、葉を削除する
- 少し複雑な実装
- 指定されたノードのインスタンスが木から削除されるため、副作用が少ない
後者を採用。
また、削除後のリバランスはしない。
CreateSubtree メソッドを呼び出す前に、次が保証されなければならない:
- ソート済み
-
Initializeメソッド内で加工が可能
-
- キーの一意性 (
IsDistinctの場合)- 重複する値が存在するときにどれを採用するか確定しないため、
Initializeメソッド内で加工が不可能
- 重複する値が存在するときにどれを採用するか確定しないため、
重複する値が存在する場合、例外を発生させる。
-
useRawItemsがtrueのとき (一意かつソート済みであることが保証されるとき)、- そのまま
CreateSubtreeメソッドを呼び出す (最速)
- そのまま
-
useRawItemsがfalseのとき (一意かつソート済みであることが保証されないとき)、- ソート (安定である必要はない)、重複チェックをしてから
CreateSubtreeメソッドを呼び出す (高速のため採用) - または、
AddOrGetNodeメソッドを呼び出しながら重複チェック (低速)
- ソート (安定である必要はない)、重複チェックをしてから
ignoreDuplicates パラメーターの導入を検討していたが、AddItems メソッドを呼び出すだけになるため実装せず。
重複を無視するには、Initialize メソッドの代わりに AddItems メソッドを呼び出す。
ただし低速のため、なるべく一意かつソート済みに加工してから Initialize メソッドを呼び出すのが望ましい。
重複についての制約がないため、ソート済みかどうかだけで分岐する。
-
useRawItemsがtrueのとき (ソート済みであることが保証されるとき)、- そのまま
CreateSubtreeメソッドを呼び出す (最速)
- そのまま
-
useRawItemsがfalseのとき (ソート済みであることが保証されないとき)、- 安定ソートをしてから
CreateSubtreeメソッドを呼び出す (高速のため採用) - または、
AddItemsメソッドを呼び出す (低速)
- 安定ソートをしてから
IsDistinct が true かつ指定されたアイテムが既に存在する場合、ノードを追加しない。
IsDistinct が false かつ指定されたアイテムが既に存在する場合、同じ順位のアイテムの末尾に追加する (安定ソート)。
ComparerHelper<T> クラスに型引数 T を指定することで、Create メソッドを呼び出すときに型引数 <T, Tkey> の指定を省略できる。
About
Classes
Development