【C#】コレクションの内部実装

コレクションの内部実装csharptan.wordpress.com

配列リスト

個数不定のデータを持つための一番手っ取り早い方法は、事前に配列を確保しておいて、状況に応じて確保しなおす方法です。

List<T>Stack<T> で内部的にやってることはほぼこれだけ

https://csharptan.files.wordpress.com/2011/12/121211_2230_1.png?w=490

循環バッファー

循環バッファー(circular buffer)は、 Queue<T> の内部的な仕組み

https://csharptan.files.wordpress.com/2011/12/121211_2230_4.png?w=490

連結リスト (Linked List)

連結リスト(linked list)は、 LinkedList<T> の内部的な仕組みです。

https://csharptan.files.wordpress.com/2011/12/121211_2230_6.png?w=490

ハッシュ テーブル

Dictionary<TKey, TValue>HashSet<T> の内部ではハッシュ テーブル(hash table)を使っています。

キーに対応する何らかの整数値を作れれば、普通の配列を使って辞書を実現できます。その「何らかの整数値」というのがハッシュ値(hash value: 直訳だと「ごちゃまぜにした値」)です。

https://csharptan.files.wordpress.com/2011/12/121211_2230_7.png?w=490

二分探索ツリー

SortedDictionary<TKey, TValue>SortedSet<T> の内部では、二分探索ツリー(binary search tree)というものを使っています。

検索にかかる時間はおおむねツリーの高さに比例しますが、平均的には、要素数nに対して、ツリーの高さはlog2 nになります。つまり、 O(log n) での検索ができます。

https://csharptan.files.wordpress.com/2011/12/121211_2230_8.png?w=490

https://csharptan.files.wordpress.com/2012/01/col-binary-tree1_thumb.png?w=1000&h=572

整列済み配列(二分探索)

配列を整列済みに保っておけば、二分探索という高速な検索アルゴリズムが使えます。これを応用したのが SortedList<TKey, TValue> です。

この方法を使えば、最悪でも log2 n 回の繰り返しで検索できます。

https://csharptan.files.wordpress.com/2011/12/121211_2230_11.png?w=490