SortedSet
平方分割を利用した SortedSet です。PyPy で動きます。平衡二分木系より速いと思います。
ドキュメント
SortedSet
ソート済み列をいくつかのバケット (list
) に分割して管理します。このとき、(バケットの個数) : (バケット内の個数)${}= 1 : 50$ くらいにします。(list
の insert
/ pop
の定数倍が軽く、バケット再構築の定数倍が重いため)
あるバケットが空になったり、多すぎたりしたら、1 度まとめて、均等にバケットに分割します。
基本的に、全ての操作が (要素数を
SortedSet(a=[])
iterable から SortedSet を作ります。重複がなく、かつソートされていれば
s.a
SortedSet の中身です。list
の list
になっていて、中には要素が昇順に並んでいます。各バケットには要素が存在することが保証されます。
len(s)
x in s
/ x not in s
s.add(x)
x
が s
に含まれていなければ x
を追加し、True
を返します。償却
s.discard(x)
x
が s
に含まれていれば x
を削除し、True
を返します。償却
s.lt(x)
/ s.le(x)
/ s.gt(x)
/ s.ge(x)
x
より小さい / 以下 / より大きい / 以上 で 最小 / 最大 の要素を返します。存在しなければ None
を返します。
s[x]
下から x
番目 / 上から ~x
番目 の要素を返します。存在しない場合は IndexError
を返します。
s.index(x)
x
より小さい要素の数を返します。x
が s
に含まれている場合は list(s).index(x)
に相当します。
s.index_right(x)
x
以下の要素の数を返します。
SortedMultiset
SortedSet の多重集合版です。同じ要素を複数入れることができます。SortedSet からの変更点は以下の通りです。
s.add(x)
x
が s
に含まれているかどうかに関わらず x
を追加します。償却
s.discard(x)
x
が s
に含まれていれば x
を 1 個 削除し、True
を返します。償却 x
を全て削除してしまうという罠があります。)
s.count(x)
s に含まれる x の個数を返します。
links
コンセプトや中身の簡単な解説が書いてあります