2016-05-02 8 views
0

私は、主に平面ツリー構造のアイテムのインデックスとして使用する特定のデータ構造で多くの作業を行ってきました。これは、配列内のインデックスに等しい「深さ」にあると見なされる正の整数(またはバイトまたはロングなど)の配列で構成されます。この配列ベースのデータ構造に名前がありますか?

ツリー内のインデックスと考えると、ツリーのルートはインデックスとして空の配列を持ち、インデックスが{a, b... c}のノードのN番目のサブノードはインデックス{a, b... c, N}です。

一般的な操作では、配列の最後の数字を増減したり、前面または背面からいくつかの要素を削除したり、いくつかの要素を前面または背面に追加したりします。ツリーインデックスコンテキストでは、これらは、兄弟ノードを通って前方/後方に進むこと、サブツリー内のインデックスを見つけること、または親ノードのインデックスを見つけること、ツリーのルートが別のツリーに張り付いているときにインデックスを見つけること、それぞれ子孫ノードである。

私は最初にそれらをインデックスとして使用しましたが、データのシリアライズの高速化からコードを読みやすくするための新しい方法を発見し続けています。これは私には不思議に思っています、このデータ構造やそれ以外の場所で一般に使用されているようなものですか?もしそうなら、それは名前を持っていますか?私はこれで他に何ができるか見ることに興味があります。

(読みやすいものを維持するために取り残さエラーチェックとC#でのサンプル実装、)

class TreeIndex 
{ 
    public readonly int depth 
    { 
     get 
     { 
      return widths.Length; 
     } 
    } 
    public readonly int[] widths; 

    public TreeIndex() 
    { 
     widths = new int[0]; 
    } 
    public TreeIndex(params int[] indices) 
    { 
     widths = indices; 
    } 
    public static implicit operator int(TagIndex ti) 
    { 
     return ti[ti.depth - 1]; 
    } 
    public static operator TagIndex +(TagIndex ti, int i) 
    { 
     int[] newwidths = ti.widths.Clone(); 
     newwidths[newwidths.Length - 1] += i; 
     return new TagIndex(newwidths); 
    } 
    public static operator TagIndex -(TagIndex ti, int i) { return ti + (-i); } 
    public static operator TagIndex <<(TagIndex ti, int i) 
    { 
     int[] newwidths = new int[ti.depth - i]; 
     Array.Copy(ti.widths, newwidths, ti.depth - i); 
     return new TagIndex(newwidths); 
    } 
    public static operator TagIndex >>(TagIndex ti, int i) 
    { 
     int newwidths = new int[ti.depth - i]; 
     Array.Copy(ti.widths, i, newwidths, 0, ti.depth - i); 
     return new TagIndex(newwidths); 
    } 
    public static operator TagIndex ^(TagIndex tia, TagIndex tib) 
    { 
     int newwidths = new int[tia.depth + tib.depth]; 
     Array.Copy(tia.widths, newwidths, tia.depth); 
     Array.Copy(tib.widths, 0, newwidths, tia.depth, tib.depth); 
     return new TagIndex(newwidths); 
    } 
} 
+1

データ構造としてオーバーロードされた演算子と特定のユースケースにもかかわらず、これは単なるリストです。 – user2357112

+0

そうですか?私が考えている別個のデータ構造を構成するものが本当に明確ではない。私はコンテンツだけではなくオペレーションの観点からそれらを定義するようないくつかの同様の質問を見ましたが、これは間違っていますか? –

答えて

0

コメントは正しいです:それはただのリストです。

List<T>クラスを検討してください。 Capacityプロパティを設定すると、容量を増減できます(-+の演算子に類似しています)。 AddRangeを呼び出すことで、リストの末尾に項目を追加できます。 InsertRangeを呼び出すと、リスト内の任意の場所に項目を挿入できます。アイテムを削除するには、RemoveRangeを呼び出してください。

あなた^オペレータは、単純な問題である:

list1.AddRange(list2); 

List<T>ないあなたのデータ構造は、共通のコレクションインタフェースのすべての実装を含め、よりほかにありませんし、すべて:それはだなど、IEnumerableICollectionIListすべての.NETプログラマーがよく知っている共通のデータ構造です。あなたのコードで作業している他の人たちを想像するなら、標準以外のセマンティクスと他の人にはあまり知られていないクレイジーなオーバーロードであなた自身のカスタムクラスを動かすのではなく、List<T>を使うことをお勧めします。

+0

ちょうど参照のために、私はこの構造で行う仕事のほとんどはC#ではありません。 C#の実装を選んだのは、Cの実装からメモリ管理を削除するよりも、C#のエラーチェックを削除する作業が少なくて済むからです。多くの人がコードを使用、管理、拡張する可能性があるケースでは、親しみやすさと明快さの利点は、マイナーなパフォーマンスヒットをはるかに凌駕します。 、パフォーマンスの集中的な使用私はカスタマイズされたソリューションを好む傾向があります。 –

+0

@P ...:理解しています。このようなデータ構造を持つ言語はC#だけではありません。 Javaの 'ArrayList'は、Python、Javascript、PHPと同様の機能を持っています。おそらく、現代の言語にはすべてアナログがあります。 –

+0

一般的に「データ構造」と呼ばれるものの例をもっと見ると、私は、何かを見分けるためにはっきりとしたものが必要であるかについてもっと明確にする必要があります。上で使用したものと同様の引数によって、intのリスト、intの配列、intの配列がすべて同じデータ構造になっていると言えます。 –

関連する問題