2016-05-02 8 views
0

Ich habe viel mit einer bestimmten Datenstruktur gearbeitet, die ich hauptsächlich als Index für Elemente in einer Platanenstruktur verwende. Es besteht aus einem Array positiver Ganzzahlen (oder Bytes oder Longs oder was auch immer), von denen sich jede auf "Tiefe" befindet, die ihrem Index im Array entspricht.Hat diese Array-basierte Datenstruktur einen Namen?

Wenn Sie es als einen Index in einem Baum betrachten, hat der Stamm des Baumes ein leeres Array als Index, und der N-te Unterknoten eines bestimmten Knotens mit Index {a, b... c} hat den Index {a, b... c, N}.

Gemeinsame Operationen auf es die letzte Zahl im Array inkrementieren/dekrementieren, entfernen Sie eine Anzahl von Elementen von vorne oder von hinten, und fügen Sie eine Reihe von Elementen an der Vorder- oder Rückseite an. Im Baumindexkontext entsprechen diese dem Vorwärts-/Rückwärtsgehen durch Geschwisterknoten, finden den Index innerhalb eines Teilbaums oder finden den Index eines Elternknotens, finden den Index, wenn der Stamm des Baums an einem anderen Baum hängt, und finden den Index von einigen Nachkommenknoten jeweils.

Obwohl ich sie anfänglich nur als Indizes verwendet habe, entdecke ich immer neue Möglichkeiten, sie für Zwecke zu verwenden, die von der Beschleunigung der Datenserialisierung bis zur besseren Lesbarkeit des Codes reichen. Das hat mich dazu gebracht, mich zu fragen, ob diese Datenstruktur oder etwas ähnliches etwas ist, das sonst wo anders benutzt wird? Wenn ja, hat es einen Namen? Ich bin interessiert zu sehen, was ich sonst noch damit machen kann.

(Beispielimplementierung in C#, mit Fehlerprüfung weggelassen Dinge zu halten lesbar)

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

Trotz der überladenen Operatoren und dem spezifischen Anwendungsfall, als Datenstruktur, ist dies wirklich nur eine Liste. – user2357112

+0

Ist das so? Ich weiß nicht genau, was eine eindeutige Datenstruktur ausmacht. Ich habe eine Reihe ähnlicher Fragen gesehen, die sie eher operativ als ausschließlich inhaltlich zu definieren scheinen, ist das nicht korrekt? –

Antwort

0

Der Kommentar ist richtig: es ist nur eine Liste.

Betrachten Sie die List<T> Klasse. Sie können die Kapazität erhöhen oder verringern (analog zu Ihren Operatoren - und +), indem Sie die Eigenschaft Capacity festlegen. Sie können Elemente am Ende der Liste hinzufügen, indem Sie AddRange aufrufen. Sie können Elemente überall in der Liste einfügen, indem Sie InsertRange aufrufen. Das Entfernen von Elementen ist eine Frage des Aufrufs RemoveRange.

Ihr ^ Operator ist eine einfache Sache von:

list1.AddRange(list2); 

List<T> tut alles, um Ihre Datenstruktur der Fall ist, und noch mehr, darunter alle gängigen Sammlung Schnittstellen Implementierung: IList, ICollection, IEnumerable, etc. Es ist eine gemeinsame Datenstruktur, mit der jeder .NET-Programmierer vertraut ist. Wenn Sie sich jemals vorstellen, dass andere an Ihrem Code arbeiten, sollten Sie lieber List<T> verwenden, statt Ihre eigene benutzerdefinierte Klasse mit nicht standardmäßigen Semantiken und verrückten Überladungen zu starten, mit denen niemand sonst vertraut ist.

+0

Nur als Referenz, die meiste Arbeit, die ich mit dieser Struktur mache, ist nicht in C#. Ich habe für mein Beispiel eine C# -Implementierung gewählt, da die C# -Fehlerüberprüfung viel weniger Aufwand erfordert als das Entfernen der Speicherverwaltung aus meiner C-Implementierung. Was Listen/Interfaces angeht, so verstehe ich, dass in Fällen, in denen Code wahrscheinlich von vielen Leuten verwendet und verwaltet wird, der Nutzen von Vertrautheit und Klarheit den kleineren Leistungseinbruch bei weitem übertrifft, wenn ich Code für meinen eigenen Code schreibe , Leistungsintensive Nutzung Ich bevorzuge eine maßgeschneiderte Lösung. –

+0

@P ...: Verstanden.C# ist nicht die einzige Sprache mit einer solchen Datenstruktur. Javas 'ArrayList' hat ähnliche Fähigkeiten wie Python, Javascript und, ich denke, PHP. Wahrscheinlich hat jede moderne Sprache ein Analogon. –

+0

Wenn ich mehr Beispiele für Dinge anschaue, die allgemein als "Datenstrukturen" bezeichnet werden, muss ich nach mehr Klarheit fragen, wie deutlich etwas sein muss, um sich zu qualifizieren. Mit ähnlichen Argumenten wie oben können Sie sagen, dass eine Liste von Ints, ein Array von Ints und ein einzelnes int alle die gleiche Datenstruktur haben, nur mit immer weniger Funktionalität, während Sie fortschreiten. –

Verwandte Themen