Warum verwenden wir Arrays anstelle von anderen Datenstrukturen?
Als ich programmiert habe, ich habe nicht gesehen, ein Beispiel, wo ein array ist besser für die Speicherung von Informationen als eine andere form davon. Ich hatte in der Tat dachte, die zusätzliche "features", die in Programmiersprachen hatte, verbessert auf diese und durch diese ersetzt. Ich sehe jetzt, daß Sie nicht ersetzt, sondern neues Leben gegeben, so zu sprechen.
Also, im Grunde, was ist der Punkt, der mithilfe von arrays?
Dies ist nicht so sehr warum verwenden wir arrays, die von einem computer Standpunkt, sondern vielmehr, warum würden wir arrays verwenden, die aus Programmier-Sicht (ein feiner Unterschied). Was macht der Rechner mit dem array war nicht der Punkt der Frage.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zeit zu gehen zurück in Zeit für eine Lektion. Während wir denken nicht über diese Dinge zu viel in unserer Phantasie verwalteten Sprachen heute, Sie basieren auf der gleichen Grundlage, also schauen wir uns an, wie Speicher verwaltet wird, wird in C.
Bevor ich Tauchen Sie ein in, eine kurze Erklärung, was der Begriff "Zeiger" bezeichnet. Ein pointer ist einfach eine variable, die "Punkte" auf einen Speicherort im Speicher. Es enthält nicht den tatsächlichen Wert in diesem Bereich im Speicher, er enthält die Speicheradresse. Denken Sie an einen block von Speicher, wie ein Postfach. Der Zeiger wäre die Adresse für das Postfach.
In C ein array ist einfach ein Zeiger mit einem offset, der offset gibt an, wie weit im Arbeitsspeicher zu suchen. Dies bietet O(1) Zugriffszeit.
Alle anderen Datenstrukturen erstellen Sie entweder auf dieses, oder verwenden Sie keine angrenzenden Speicher für die Lagerung, was zu einer schlechten random-access-look-up-Zeit (Obwohl es gibt andere Vorteile, die nicht mit Hilfe von sequentiellen Speicher).
Zum Beispiel, sagen wir, wir haben ein array mit 6 zahlen (6,4,2,3,1,5), im Speicher würde es so Aussehen:
In einem array, wir wissen, dass jedes element neben jedem anderen in Erinnerung. Ein C-array Namens MyArray hier) ist einfach ein Zeiger auf das erste element:
Wenn wir wollten, zu sehen bis MyArray[4], intern wäre es, auf die zugegriffen, wie diese:
Denn wir können direkt auf jedes element im array durch addition mit dem offset des Zeigers, können wir schauen, bis jedes element in der gleichen Zeit, unabhängig von der Größe des Arrays. Dies bedeutet, dass immer MyArray[1000] würde die gleiche Zeit wie immer MyArray[5].
Einer alternativen Datenstruktur einer verknüpften Liste. Dies ist eine lineare Liste mit Zeigern, jeder verweist auf den nächsten Knoten
Beachten Sie, dass ich bei jedem "node" in seinen eigenen block. Dies ist, weil Sie nicht garantiert werden (und sehr wahrscheinlich nicht sein) benachbart im Speicher.
Wenn ich zugreifen will, P3, ich kann nicht direkt darauf zugreifen, weil ich nicht weiß, wo es im Speicher. Alles was ich weiß ist, wo die Wurzel (P1) ist, also habe ich anstatt der start auf P1, und Folgen Sie den einzelnen Zeiger auf den gewünschten Knoten.
Dies ist eine O(N) nachschlagen (look-up-Kosten erhöht, da jedes element wird Hinzugefügt). Es ist viel mehr teuer zu bekommen, um P1000 im Vergleich zu bekommen, um P4.
Höheren Ebene Datenstrukturen wie Hashtabellen, stacks und queues, alle können ein array (oder mehrere arrays) intern, während verketteten Listen und Binären Bäumen in der Regel die Verwendung von Knoten und Zeigern.
Fragen Sie sich vielleicht, warum jemand würde verwenden eine Datenstruktur, die erfordert linear-traversal zu suchen, bis ein Wert und nicht nur ein array verwenden, aber Sie haben Ihren nutzen.
Nehmen unser array wieder. Diese Zeit möchte ich finden das array-element enthält den Wert '5'.
In dieser situation, ich weiß nicht, was offset hinzufügen, um den Mauszeiger um es zu finden, also muss ich bei 0 beginnen, und arbeiten mein Weg, bis ich es finde. Dies bedeutet, ich muss zum durchführen 6 Prüfungen.
Weil dieses, die Suche nach einem Wert in einem array wird als O(N). Die Kosten der Suche erhöht, da das array immer größer wird.
Erinnern, bis oben, wo ich sagte, dass es manchmal mit einem nicht sequentiellen Datenstruktur kann auch Vorteile haben? Die Suche nach Daten ist einer dieser Vorteile und einer der besten Beispiele ist der Binäre Baum.
Einem Binären Baum ist eine Datenstruktur ähnlich einer Link-Liste, jedoch ist anstelle der Verlinkung zu einem einzelnen Knoten, jeder Knoten kann Verbindung zu zwei Kinder Knoten.
Daten werden beim einfügen in einen binären Baum, es verwendet mehrere Regeln, um zu entscheiden, wo der neue Knoten. Die Grundidee ist, dass, wenn der neue Wert größer ist als die Eltern, es fügt Sie auf der linken Seite, wenn er niedriger ist, es fügt Sie auf der rechten Seite.
Dies bedeutet, dass die Werte in einem Binär-Baum könnte so Aussehen:
Bei der Suche in einem binären Baum für den Wert von 75, brauchen wir nur zu Besuch 3 Knoten ( O(log N) ) aufgrund dieser Struktur:
Obwohl es 5 Knoten in unserem Baum, den wir nicht brauchen, zu betrachten, die restlichen zwei, denn wir wussten, dass Sie (und Ihre Kinder) war es nicht möglich, enthalten die Werte, die wir gesucht haben. Dies gibt uns eine Zeit der Suche, die im schlimmsten Fall bedeutet, dass wir jeden Knoten, aber im besten Fall haben wir nur zu besuchen, einen kleinen Teil der Knoten.
Das ist, wo arrays schlagen, Sie bieten eine Konstante O(N) Suche nach der Zeit, trotz O(1) Zugriffszeit.
Dies ist ein unglaublich hohes Maß überblick über die Datenstrukturen im Speicher, überspringt eine Menge details, aber ich hoffe es zeigt ein array ist Stärke und Schwäche im Vergleich zu anderen Datenstrukturen.
InformationsquelleAutor der Antwort
Für O(1) random access, die können nicht geschlagen werden.
InformationsquelleAutor der Antwort
Nicht alle Programme das gleiche tun, oder laufen auf der gleichen hardware.
Dies ist in der Regel die Antwort, warum die verschiedenen Funktionen der Sprache existieren. Arrays sind ein core-computer-science-Konzept. Ersetzen-arrays mit Listen/Matrizen/Vektoren/whatever erweiterte Datenstruktur würde sich stark auf die Leistung auswirken, und geradezu für undurchführbar in einer Reihe von Systemen. Es gibt eine Reihe von Fällen, in denen die Verwendung einer dieser "erweiterte" data collection-Objekte verwendet werden soll, weil von dem Programm in Frage.
In der business-Programmierung (die die meisten von uns tun), können wir die Ziel-hardware, die ist relativ stark. Mit Hilfe einer Liste in C# oder Vektor in Java ist die richtige Wahl, um in diesen Situationen, weil diese Strukturen ermöglichen es dem Entwickler zu erreichen, die Ziele schneller, was wiederum ermöglicht diese Art von software, um mehr zu sehen.
Beim schreiben von embedded-software oder ein Betriebssystem ein array kann oft die bessere Wahl sein. Während ein array bietet weniger Funktionen, es braucht weniger RAM, und der compiler kann optimieren von code noch effizienter für look-ups in arrays.
Ich bin sicher, ich bin verlassen eine Reihe der Vorteile, die für diese Fälle, aber ich hoffe, Sie bekommen den Punkt.
InformationsquelleAutor der Antwort
Betrachtungsweise der Vorteile von arrays ist zu sehen, wo ist der O(1) Zugriff auf die Fähigkeit des arrays benötigt wird und daher großgeschrieben:
In Look-up-Tabellen Ihrer Anwendung (ein statisches array für den Zugriff auf bestimmte kategorische Antworten)
Memoization (bereits berechnete komplexe Funktion führt, so dass Sie don ' T berechnen die Funktion Wert wieder sagen, log x)
High-Speed-computer-vision-Anwendungen, die Bildbearbeitung (https://en.wikipedia.org/wiki/Lookup_table#Lookup_tables_in_image_processing)
InformationsquelleAutor der Antwort