Reihe-Datenstruktur

In der Informatik, einer Reihe-Datenstruktur oder ordnen einfach ist eine Datenstruktur, die aus einer Sammlung von Elementen (Werte oder Variablen), jeder besteht, der durch mindestens einen Reihe-Index oder Schlüssel identifiziert ist. Eine Reihe wird versorgt, so dass die Position jedes Elements von seinem Index-Tupel durch eine mathematische Formel geschätzt werden kann.

Zum Beispiel kann eine Reihe von 10 Variablen der ganzen Zahl, mit Indizes 0 bis 9, versorgt werden, weil 10 Wörter am Gedächtnis 2000, 2004, 2008, … 2036 richten, so dass das Element mit dem Index ich die Adresse 2000 + 4 × i habe.

Reihe ist den mathematischen Konzepten von Vektoren, matrices, und dem Tensor analog. Tatsächlich wird die Reihe mit einem oder zwei Indizes häufig Vektoren oder matrices beziehungsweise genannt. Reihe wird häufig verwendet, um Tische, besonders Nachschlagetabellen durchzuführen; der Worttisch wird manchmal als ein Synonym der Reihe verwendet.

Reihe ist unter den ältesten und wichtigsten Datenstrukturen, und wird durch fast jedes Programm verwendet. Sie werden auch verwendet, um viele andere Datenstrukturen, wie Listen und Schnuren durchzuführen. Sie nutzen effektiv die Wenden-Logik von Computern aus. In den meisten modernen Computern und vielen Außenspeichergeräten ist das Gedächtnis eine eindimensionale Reihe von Wörtern, deren Indizes ihre Adressen sind. Verarbeiter, besonders Vektor-Verarbeiter, werden häufig für Reihe-Operationen optimiert.

Reihe ist größtenteils nützlich, weil die Element-Indizes in der Durchlaufzeit geschätzt werden können. Unter anderem erlaubt diese Eigenschaft einer einzelnen wiederholenden Behauptung, willkürlich viele Elemente einer Reihe zu bearbeiten. Deshalb sind die Elemente einer Reihe-Datenstruktur erforderlich, dieselbe Größe zu haben, und sollten dieselbe Datendarstellung verwenden. Der Satz von gültigen Index-Tupeln und die Adressen der Elemente (und folglich die Element-Wenden-Formel) sind gewöhnlich, aber nicht immer, befestigt, während die Reihe im Gebrauch ist.

Der Begriff Reihe wird häufig gebraucht, um Reihe-Datentyp, eine Art durch die meisten Programmiersprachen auf höchster Ebene zur Verfügung gestellter Datentyp zu bedeuten, der aus einer Sammlung von Werten oder Variablen besteht, die durch einen oder mehr auf die Durchlaufzeit geschätzte Indizes ausgewählt werden können. Reihe-Typen werden häufig durch Reihe-Strukturen durchgeführt; jedoch auf einigen Sprachen können sie durch Hash-Tabellen durchgeführt werden, hat Listen verbunden, suchen Sie Bäume oder andere Datenstrukturen.

Der Begriff wird auch besonders in der Beschreibung von Algorithmen gebraucht, um assoziative Reihe oder "abstrakte Reihe" zu bedeuten, ein theoretisches Informatik-Modell (ein abstrakter Datentyp oder ADT) hat vorgehabt, die wesentlichen Eigenschaften der Reihe zu gewinnen.

Geschichte

Die ersten Digitalcomputer haben maschinensprachige Programmierung verwendet, um sich niederzulassen und auf Reihe-Strukturen für Datentische, Vektoren und Matrixberechnung, und zu vielen anderen Zwecken zuzugreifen. Von Neumann hat das erste Reihe-Sortierprogramm (Verflechtungssorte) 1945 während des Gebäudes des ersten speicherprogrammierten Computers geschrieben. Das Reihe-Indexieren wurde durch das Selbständern des Codes, und der späteren Verwenden-Index-Register und des indirekten Wendens ursprünglich getan. Einige Großrechner entworfen in den 1960er Jahren, wie der Burroughs B5000 und seine Nachfolger, hatten spezielle Instruktionen für die Reihe, die mit einem Inhaltsverzeichnis versieht, der Überprüfung der Index-Grenzen eingeschlossen hat..

Zusammenbau-Sprachen haben allgemein keine spezielle Unterstützung für die Reihe, außer, was die Maschine selbst zur Verfügung stellt. Die frühsten Programmiersprachen auf höchster Ebene, einschließlich FORTRAN (1957), COBOL (1960), und Algol 60 (1960), hatten Unterstützung für die mehrdimensionale Reihe, und so C (1972). In C ++ (1983) bestehen Klassenschablonen für die mehrdimensionale Reihe, deren Dimension an der Durchlaufzeit sowie für die laufzeitflexible Reihe befestigt wird.

Anwendungen

Reihe wird verwendet, um mathematische Vektoren und matrices, sowie andere Arten von rechteckigen Tischen durchzuführen. Viele Datenbanken, klein und groß, bestehen aus (oder schließen Sie ein), eindimensionale Reihe, deren Elemente Aufzeichnungen sind.

Reihe wird verwendet, um andere Datenstrukturen, wie Haufen, Hash-Tabellen, deques, Warteschlangen, Stapel, Schnuren und VLists durchzuführen.

Ein oder größere Reihe werden manchmal verwendet, um mit dynamischer Speicherzuteilung im Programm, besonders Speicherlache-Zuteilung wettzueifern. Historisch ist das manchmal die einzige Weise gewesen, "dynamisches Gedächtnis" tragbar zuzuteilen.

Reihe kann verwendet werden, um teilweisen oder ganzen Kontrollfluss in Programmen, als eine Kompaktalternative zu (sonst wiederholend), vielfache Behauptungen zu bestimmen. Sie sind in diesem Zusammenhang als Steuertabellen bekannt und werden in Verbindung mit einem Zweck gebaut Dolmetscher verwendet, dessen Kontrollfluss gemäß in der Reihe enthaltenen Werten verändert wird. Die Reihe kann Unterprogramm-Zeigestöcke enthalten (oder Verhältnisunterprogramm-Zahlen, die durch SCHALTER-Behauptungen gehandelt werden können) - die den Pfad der Ausführung leiten.

Reihe-Element-Bezeichner und Wenden-Formeln

Wenn Datengegenstände in einer Reihe versorgt werden, werden individuelle Gegenstände durch einen Index ausgewählt, der gewöhnlich eine nichtnegative ganze Skalarzahl ist. Indizes werden auch Subschriften genannt. Ein Index stellt den Reihe-Wert zu einem versorgten Gegenstand kartografisch dar.

Es gibt drei Wege, auf die die Elemente einer Reihe mit einem Inhaltsverzeichnis versehen werden können:

  • 0 (das Indexieren bei Nullpunkteinstellung): Das erste Element der Reihe wird durch die Subschrift 0 mit einem Inhaltsverzeichnis versehen.
  • 1 (das ein-basierte Indexieren): Das erste Element der Reihe wird durch die Subschrift 1 mit einem Inhaltsverzeichnis versehen.
  • n (das mit Sitz in n Indexieren): Der Grundindex einer Reihe kann frei gewählt werden. Gewöhnlich Programmiersprachen, die das mit Sitz in n Indexieren auch erlauben, erlauben negative Index-Werte und andere Skalardatentypen wie Enumerationen, oder Charaktere können als ein Reihe-Index verwendet werden.

Reihe kann vielfache Dimensionen haben, so ist es ziemlich üblich, auf eine Reihe mit vielfachen Indizes zuzugreifen. Zum Beispiel könnte eine zwei dimensionale Reihe mit drei Reihen und vier Säulen Zugang zum Element an der 2. Reihe und 4. Säule durch den Ausdruck zur Verfügung stellen: (hintereinander Hauptsprache) und (in einer Säule Hauptsprache) im Fall von einem Indexieren-System bei Nullpunkteinstellung. So werden zwei Indizes für eine zwei dimensionale Reihe, drei für eine dreidimensionale Reihe und n für eine n dimensionale Reihe verwendet.

Die Zahl von Indizes musste angeben, dass ein Element die Dimension, dimensionality, oder Reihe der Reihe genannt wird.

In der Standardreihe wird jeder Index auf eine bestimmte Reihe von aufeinander folgenden ganzen Zahlen (oder Konsekutivwerten eines aufgezählten Typs) eingeschränkt, und die Adresse eines Elements wird durch eine "geradlinige" Formel auf den Indizes geschätzt.

Eindimensionale Reihe

Eine eindimensionale Reihe (oder einzelne Dimensionsreihe) sind ein Typ der geradlinigen Reihe. Das Zugreifen auf seine Elemente ist mit einer einzelnen Subschrift verbunden, die entweder eine Reihe oder Säulenindex vertreten kann.

Als ein Beispiel denken die C Behauptung

Im angeführten Beispiel kann die Reihe 10 Elemente jedes für den Typ verfügbaren Werts enthalten. In C sind die Reihe-Element-Indizes 0-9 einschließliche in diesem Fall. Zum Beispiel sind die Ausdrücke, und vor allen Dingen Elemente beziehungsweise.

Für einen Vektoren mit dem geradlinigen Wenden, das Element mit dem Index werde ich an der Adresse B + c gelegen · ich, wo B eine feste Grundadresse und c eine feste Konstante, manchmal genannt die Adresserhöhung oder den Schritt ist.

Wenn die gültigen Element-Indizes an 0 beginnen, ist der unveränderliche B einfach die Adresse des ersten Elements der Reihe. Deshalb gibt die C Programmiersprache an, dass Reihe-Indizes immer an 0 beginnen; und viele Programmierer werden dieses Element "zeroth" aber nicht "zuerst" nennen.

Jedoch kann man den Index des ersten Elements durch eine passende Wahl der Grundadresse B wählen. Zum Beispiel, wenn die Reihe fünf Elemente, mit einem Inhaltsverzeichnis versehen 1 bis 5 hat, und die Grundadresse B durch B &minus ersetzt wird; 30c dann werden die Indizes jener derselben Elemente 31 bis 35 sein. Wenn das Numerieren an 0 nicht anfängt, kann der unveränderliche B die Adresse keines Elements sein.

Zweidimensionale Reihe

Für eine zweidimensionale Reihe würde das Element mit Indizes i, j Adresse B + c haben · ich + d · j, wo die Koeffizienten c und d die Reihe und Säulenadresserhöhungen beziehungsweise sind.

Mehr allgemein, in einer K-Dimensional-Reihe, der Adresse eines Elements mit Indizes i, ich, …, bin ich

:B + c · ich + c · ich + … + c · ich.

Diese Formel verlangt nur k Multiplikationen und k−1 Hinzufügungen für jede Reihe, die Gedächtnis einfügen kann. Außerdem, wenn ein Koeffizient eine feste Macht 2 ist, kann die Multiplikation durch die Bit-Verschiebung ersetzt werden.

Die Koeffizienten c müssen gewählt werden, so dass jedes gültige Index-Tupel zur Adresse eines verschiedenen Elements kartografisch darstellt.

Wenn der minimale gesetzliche Wert für jeden Index 0 ist, dann ist B die Adresse des Elements, dessen Indizes die ganze Null sind. Als im eindimensionalen Fall können die Element-Indizes durch das Ändern der Grundadresse B geändert werden. So, wenn eine zweidimensionale Reihe Reihen und Säulen von 1 bis 10 und 1 bis 20, beziehungsweise, dann mit einem Inhaltsverzeichnis versehen ließ, B durch B + c - &minus ersetzend; 3 c werden sie veranlassen, von 0 bis 9 und 4 bis 23, beziehungsweise umnummeriert zu werden. Das Ausnutzen dieser Eigenschaft, einige Sprachen (wie FORTRAN 77) geben an, dass Reihe-Indizes an 1, als in der mathematischen Tradition beginnen; während andere Sprachen (wie Fortran 90, Pascal und ALGOL) den Benutzer den minimalen Wert für jeden Index wählen lassen.

Schmiere-Vektoren

Die Wenden-Formel wird durch die Dimension d, die Grundadresse B und die Zunahme c, c, …, c völlig definiert. Es ist häufig nützlich sich verpacken zu lassen diese Rahmen in eine Aufzeichnung haben den Deskriptor der Reihe oder Schritt-Vektoren oder Schmiere-Vektoren genannt. Die Größe jedes Elements und die minimalen und maximalen Werte haben jeden Index berücksichtigt kann auch in den Schmiere-Vektoren eingeschlossen werden. Der Schmiere-Vektor ist ein ganzer Griff für die Reihe, und ist eine günstige Weise, Reihe als Argumente für Verfahren zu passieren. Viele nützliche Reihe-Schneiden-Operationen (wie das Auswählen einer Subreihe, Tauschen von Indizes oder Umkehren der Richtung der Indizes) können sehr effizient durch die Manipulierung des Schmiere-Vektoren durchgeführt werden.

Kompaktlay-Outs

Häufig werden die Koeffizienten gewählt, so dass die Elemente ein aneinander grenzendes Gebiet des Gedächtnisses besetzen. Jedoch ist das nicht notwendig. Selbst wenn Reihe immer mit aneinander grenzenden Elementen geschaffen wird, können einige Reihe-Schneiden-Operationen aneinander nichtgrenzende Subreihe von ihnen schaffen.

Es gibt zwei systematische Kompaktlay-Outs für eine zweidimensionale Reihe. Denken Sie zum Beispiel die Matrix

:

\begin {bmatrix }\

1 & 2 & 3 \\

4 & 5 & 6 \\

7 & 8 & 9

\end {bmatrix}.

</Mathematik>

Im mit der Reihe größeren Ordnungslay-Out (angenommen durch C für die statisch offen erklärte Reihe) werden die Elemente in jeder Reihe in Konsekutivpositionen versorgt, und alle Elemente einer Reihe haben eine niedrigere Adresse als einige der Elemente einer Konsekutivreihe:

In der Säulenhauptordnung (traditionell verwendet von Fortran) sind die Elemente in jeder Säule im Gedächtnis und allen Elementen aufeinander folgend Säulen haben eine niedrigere Adresse als einige der Elemente einer Konsekutivsäule:

Für die Reihe mit drei oder mehr Indizes "Reihe stellt Hauptordnung" in Konsekutivpositionen irgendwelche zwei Elemente, deren sich Index-Tupel nur durch eines im letzten Index unterscheiden. "Säule Hauptordnung" ist in Bezug auf den ersten Index analog.

In Systemen, die geheimes Verarbeiter-Lager oder virtuelles Gedächtnis verwenden, eine Reihe scannend, ist viel schneller, wenn aufeinander folgende Elemente in Konsekutivpositionen im Gedächtnis versorgt, aber nicht wenig gestreut werden. Viele Algorithmen, die mehrdimensionale Reihe verwenden, werden sie in einer voraussagbaren Ordnung scannen. Ein Programmierer (oder ein hoch entwickelter Bearbeiter) kann diese Information verwenden, um zwischen der Reihe - oder Säulenhauptlay-Out für jede Reihe zu wählen. Zum Beispiel, wenn man das Produkt A schätzt · B zwei matrices würde es am besten sein, Einen versorgten in der mit der Reihe größeren Ordnung und B in der Säulenhauptordnung zu haben.

In der Größe anpassende Reihe

Statische Reihe hat eine Größe, die befestigt wird, wenn sie geschaffen werden und folglich Elementen nicht erlauben, eingefügt oder entfernt zu werden. Jedoch, durch das Zuteilen einer neuen Reihe und das Kopieren des Inhalts der alten Reihe dazu, ist es möglich, eine dynamische Version einer Reihe effektiv durchzuführen; sieh dynamische Reihe. Wenn diese Operation selten getan wird, verlangen Einfügungen am Ende der Reihe nur amortisierte unveränderliche Zeit.

Einige Reihe-Datenstrukturen teilen Lagerung nicht neu zu, aber versorgen wirklich eine Zählung der Zahl der Elemente der Reihe im Gebrauch, genannt die Zählung oder Größe. Das macht effektiv die Reihe eine dynamische Reihe mit einer festen maximalen Größe oder Kapazität; Schnuren von Pascal sind Beispiele davon.

Nichtlineare Formeln

Mehr komplizierte (nichtlineare) Formeln werden gelegentlich verwendet. Für eine zweidimensionale Kompaktdreiecksreihe, zum Beispiel, ist die Wenden-Formel ein Polynom des Grads 2.

Leistungsfähigkeit

Beider Laden und ausgesucht nimmt (deterministischer Grenzfall) unveränderliche Zeit. Reihe nimmt geradlinig (O (n)) Raum in der Zahl der Elemente n, dass sie halten.

In einer Reihe mit der Element-Größe k und auf einer Maschine mit einer Liniengröße des geheimen Lagers von B Bytes, durch eine Reihe von n Elementen wiederholend, verlangt das Minimum der Decke (nk/B) geheimes Lager Fräulein, weil seine Elemente aneinander grenzende Speicherpositionen besetzen. Das ist grob ein Faktor von B/k besser als die Zahl des geheimen Lagers Fräulein mussten auf n Elemente aufs Geratewohl Speicherpositionen zugreifen. Demzufolge ist die folgende Wiederholung über eine Reihe in der Praxis merklich schneller als Wiederholung über viele andere Datenstrukturen, ein Eigentum genannt Gegend der Verweisung (das bedeutet jedoch, dieses Verwenden eines vollkommenen Kuddelmuddels oder trivialen Kuddelmuddels innerhalb derselben (lokalen) Reihe nicht, wird nicht noch schneller - und in der unveränderlichen Zeit erreichbar sein). Bibliotheken stellen auf niedriger Stufe optimierte Möglichkeiten zur Verfügung, um Reihen des Gedächtnisses zu kopieren (wie memcpy), der verwendet werden kann, um aneinander grenzende Blöcke von Reihe-Elementen bedeutsam schneller zu bewegen, als es durch den individuellen Element-Zugang erreicht werden kann. Die Beschleunigung solcher optimierten Routinen ändert sich durch die Reihe-Element-Größe, Architektur und Durchführung.

Speicherklug ist Reihe Kompaktdatenstrukturen ohne pro Element oben. Es kann einen oberirdischen pro Reihe geben, um z.B Index-Grenzen zu versorgen, aber das ist sprachabhängig. Es kann auch geschehen, dass in einer Reihe versorgte Elemente weniger Gedächtnis verlangen als dieselben in individuellen Variablen versorgten Elemente, weil mehrere Reihe-Elemente in einem einzelnen Wort versorgt werden können; solche Reihe wird häufig gepackte Reihe genannt. Ein Extrem (aber allgemein verwendet) Fall ist die Bit-Reihe, wo jedes Bit ein einzelnes Element vertritt. Ein einzelnes Oktett kann so bis zu 256 verschiedene Kombinationen von bis zu 8 verschiedenen Bedingungen in der kompaktesten Form halten.

Reihe-Zugänge mit statisch voraussagbaren Zugriffsmustern sind eine Hauptquelle des Datenparallelismus.

Leistungsfähigkeitsvergleich mit anderen Datenstrukturen

Reihe von Growable ist der Reihe ähnlich, aber fügt die Fähigkeit hinzu, Elemente einzufügen und zu löschen; das Hinzufügen und das Löschen am Ende sind besonders effizient. Jedoch bestellen sie geradlinig (Θ (n)) zusätzliche Lagerung vor, wohingegen Reihe zusätzliche Lagerung nicht vorbestellt.

Assoziative Reihe stellt einen Mechanismus für die einer Reihe ähnliche Funktionalität ohne riesige allgemeine Lagerungskosten zur Verfügung, wenn die Index-Werte spärlich sind. Zum Beispiel kann eine Reihe, die Werte nur an Indizes 1 und 2 Milliarden enthält, aus dem Verwenden solch einer Struktur einen Nutzen ziehen. Die assoziative Spezialreihe mit Schlüsseln der ganzen Zahl schließt Versuche von Patricia, Reihe von Judy und Bäume von van Emde Boas ein.

Erwogene Bäume verlangen O (loggen Sie n) Zeit für den mit einem Inhaltsverzeichnis versehenen Zugang, sondern auch erlauben, Elemente in O einzufügen oder zu löschen (loggen Sie n), Zeit, wohingegen Growable-Reihe geradlinig (Θ (n)) Zeit verlangt, Elemente an einer willkürlichen Position einzufügen oder zu löschen.

Verbundene Listen erlauben unveränderliche Zeiteliminierung und Einfügung in der Mitte, aber nehmen für den mit einem Inhaltsverzeichnis versehenen Zugang Zeit in Anspruch. Ihr Speichergebrauch ist normalerweise schlechter als Reihe, aber ist noch geradlinig.

Ein Iliffe Vektor ist eine Alternative zu einer mehrdimensionalen Reihe-Struktur. Es verwendet eine eindimensionale Reihe von Verweisungen auf die Reihe einer Dimension weniger. Für zwei Dimensionen, insbesondere würde diese alternative Struktur ein Vektor von Zeigestöcken zu Vektoren, ein für jede Reihe sein. So würde auf ein Element in der Reihe i und Spalte j einer Reihe A durch das doppelte Indexieren ([ich] [j] in der typischen Notation) zugegriffen. Diese alternative Struktur erlaubt zerlumpte oder zackige Reihe, wo jede Reihe eine verschiedene Größe — oder im Allgemeinen haben kann, wo die gültige Reihe jedes Index von den Werten aller vorhergehenden Indizes abhängt. Es spart auch eine Multiplikation (durch die Säulenadresserhöhung) das Ersetzen davon durch wenig Verschiebung (um den Vektoren von Reihe-Zeigestöcken mit einem Inhaltsverzeichnis zu versehen), und ein Extraspeicherzugang (die Reihe-Adresse herbeiholend), der in einigen Architekturen lohnend sein kann.

Bedeutung der Dimension

Die Dimension einer Reihe ist die Zahl von Indizes musste ein Element auswählen. So, wenn die Reihe als eine Funktion auf einer Reihe möglicher Index-Kombinationen gesehen wird, ist es die Dimension des Raums, dessen sein Gebiet eine getrennte Teilmenge ist. So ist eine eindimensionale Reihe eine Liste von Daten, eine zweidimensionale Reihe ein Rechteck von Daten, eine dreidimensionale Reihe ein Datenblock usw.

Das sollte mit der Dimension des Satzes des ganzen matrices mit einem gegebenen Gebiet, d. h. der Zahl der Elemente in der Reihe nicht verwirrt sein. Zum Beispiel ist eine Reihe mit 5 Reihen und 4 Säulen zweidimensional, aber solche matrices bilden einen 20-dimensionalen Raum. Ähnlich kann ein dreidimensionaler Vektor durch eine eindimensionale Reihe der Größe drei vertreten werden.

Siehe auch

  • Dynamische Reihe
  • Parallele Reihe
  • Reihe der variablen Länge
  • Bit-Reihe
  • Reihe, die Scheiben schneidet
  • Ausgleich (Informatik)
  • Mit der Reihe größere Ordnung
  • Schritt einer Reihe

Links


Alpha compositing / Bringen Sie australische Messe vor
Impressum & Datenschutz