えびちゃんの日記

えびちゃん(競プロ)の日記です。

B-tree を書きました

rsk0315.hatenablog.com

B-tree が書けたらまた自慢しに来ます。

書けました。一旦は append*1/split と添字でのアクセスと bisect*2 ができる列としての B-tree です。セグ木のような区間 fold 演算ができた方がいいのかもという気持ちもあります。

一応実装を貼っておきますが、初めてなので改善の余地はよちよちという感じです。

rsk0315.github.io

alloc::collections::btree::node をある程度参考にしつつ書いていて、ある程度は std::collections::BTreeMap の内部についてもわかってきつつ、だいぶ設計が異なるのでまだまだお勉強の余地があるかなという感じです。

LeafNodeInternalNode では B-tree のノード数の下限の制約を無視していて、それは BTreeMap 側で担保しているみたいなのですが、そうした方がいいのかな〜という気持ちがあったりなどします。

列としての B-tree であれば、(BTree|Hash)Map にあるところの .entry()API は提供する必要がないんですよね。 と思いつつ、「bisect で見つけたあたりの場所が何らかの条件を満たすなら、その箇所に挿入する」のような操作はしたいことがしばしばあって、.entry() めいた I/F を使えたらいいのかもという気もします。

どうせそのうち $\circ\colon S\times S\to S$ とかを渡せるようにして書き直すだろうので、そのときにまた考えます。

参考文献

いつもの (CS166.1146/03) を見ました。

実装し終わった後、下記の記事を見つけました。これもよいと思います。

trap.jp

おわり

思ったより疲れているみたいで、あんまりまともに文章が書けませんでした。

また勉強したり休憩したりしたら、BTreeMap の設計や unsafe なコードのことや Stacked/Tree Borrows のことに関してまとめたい気持ちがあります。

一方、なんか、なんでこんなことやってんだろうなみたいな気持ちも湧いてくることがしばしばあり、危ないな〜というところですね。

簡潔データ構造についても何もまとめていなくてやば〜というところです。

*1:界隈では merge と言われがちですが、“merge” は抽象的すぎる感じがして避けています。列の末尾に連結させることを明示したいです。

*2:partition point と呼ばれている場合もあるかも。