プログラミング
Show HN: ChaosTree – 依存関係ゼロのJavaツリーライブラリ (AVL, RBT, B-Tree, B+Tree)
Show HN: ChaosTree – A zero-dependency Java tree library (AVL,RBT,B-Tree,B+Tree) (github.com)
要約
ChaosTreeは、複数のツリー実装を中心に構築された、依存関係ゼロのJavaソートセット/マップライブラリです。AVLツリー、赤黒木、Bツリー、B+ツリーの実装を提供し、NavigableSet/Map、SequencedSet/Mapインターフェースを実装しています。開発者は、データ構造の学習を深めるためにこのライブラリを開発し、APIデザイン、実装選択、ベンチマーク手法についてフィードバックを求めています。
全文翻訳
ChaosTreeとは?
ChaosTreeは、複数のツリー実装を中心に構築された、依存関係ゼロのJavaソートセット/マップライブラリです。
以下の実装を提供します:
- AVLツリー
- 赤黒木 (Red-Black Tree)
- Bツリー (B-Tree)
- B+ツリー (B+Tree)
カスタムAPIは、NavigableSet, NavigableMap, SequencedSet, SequencedMapを実装しているため、独自には作成していません。私のカスタムAPIは以下の通りです:
- buildFromSorted(Iterator<T> it, float factor)
- importFlatMatrix(Object[][] blast, float factor)
- Object[][] exportFlatMatrix()
ChaosTreeを始めたのは、データ構造の学習をどこまで深められるか探求したかったからです。最初はカスタムAPIを持つ7種類のツリーセットの最初のリリースとして始まりました。それに没頭するにつれてマップへと移行し、セットからマップへの移行段階で劇的な変化と知識のアップグレードがあり、ツリーの限界をjdk11+サポートからjdk21+へと押し上げ、依存関係のなさ、メモリレイアウト、アロケーション、JVMの動作、そして実世界のパフォーマンスに細心の注意を払いました。
実験したことの一部:
- 異なるノードレイアウトとメタデータフットプリント
- ツリー実装のためのCRTP/F-boundedポリモーフィズム
- 親ポインタ対親ポインタなしノード
- 配列ベースのN-aryツリーノード
- Bツリー/B+ツリーの次数選択
- JMHベンチマークとJFRプロファイリング
- java.util.TreeMap/TreeSetに対する差分/ランダムテスト
この困難な作業を経て、以下のテストもパスしました:
- Guava Testlib互換性テスト
- jqwikプロパティベーステスト
- リファレンスコレクションに対するランダム差分テスト
- ツリーノードのホワイトボックス構造検証
- Bツリー/B+ツリーの構造不変量の直接検証
- 例外およびイテレータ契約テスト
- シリアライゼーションおよびクローニングテスト
- N-aryツリーはAPI検証のためのカスタムjqwikテストも使用しています。
テールレイテンシの挙動は、単純なテキストに切り詰められてしまい、データの読み取りが不正確になったため、ここでは表示されていません: https://chaos-vy.github.io/ChaosTree/utils/JMH-Report.html
公式JDK TreeMapとのベンチマークも実行しました。N-aryツリーの更新も行いました。
GitHub:
https://github.com/Chaos-vy/ChaosTree
https://chaos-vy.github.io/ChaosTree/
特にAPIデザイン、実装選択、ベンチマーク手法についてフィードバックをいただけると幸いです。現在、パフォーマンスチューニングのために不要で複雑なブランチを切り捨てることを試みています。