Arrays als separater Typ

8

Einige Skriptsprachen wie Python und Javascript haben Arrays (auch Listen genannt) als separate Datentypen aus Hashtabellen (auch Wörterbücher, Karten, Objekte). In anderen Skriptsprachen wie PHP und Lua ist ein Array lediglich eine Hash-Tabelle, deren Schlüssel ganze Zahlen sind. (Die Implementierung kann für diesen speziellen Fall optimiert werden, wie es in der aktuellen Version von Lua der Fall ist, aber dies ist für die Sprachsemantik transparent.)

Was ist der bessere Ansatz?

  1. Der einheitliche Ansatz ist eleganter in dem Sinne, dass er eine Sache als zwei hat, obwohl der Gewinn nicht ganz so groß ist, wie es auf den ersten Blick scheinen mag, da Sie immer noch den Begriff der Iteration haben müssen speziell über die Zifferntasten.

  2. Der einheitliche Ansatz ist wohl flexibler. Sie können mit verschachtelten Arrays beginnen, feststellen, dass Sie sie mit anderen Dingen annotieren müssen, und einfach die Annotationen hinzufügen, ohne die Datenstrukturen zu überarbeiten, um die Arrays mit Hash-Tabellen zu verschachteln.

  3. Was die Effizienz anbelangt, scheint es sich um einen Waschvorgang zu handeln (vorausgesetzt, die Implementierung optimiert sich für den speziellen Fall, wie es Lua macht).

Was vermisse ich? Hat der separate Ansatz Vorteile?

    
rwallace 03.07.2011, 18:29
quelle

3 Antworten

3

Ein Array ist mehr als eine Tabelle, die absichtlich auf aufeinanderfolgende Integer-Schlüssel beschränkt ist. Es ist eine Sequenz , eine Sammlung von n Elementen (nicht Schlüssel-Wert-Paaren, nur die Werte) mit einer wohldefinierten Reihenfolge. Dies ist meiner Meinung nach eine Datenstruktur, die keinen Platz für zusätzliche Daten in Form von nicht ganzzahligen Schlüsseln hat. Es ist konzeptionell einfacher.

Auch die Implementierung der beiden kann einfacher sein, besonders wenn man das Hinzufügen einer Optimierung in Betracht zieht (was offensichtlich obskur genug ist, dass eine leistungsorientierte Sprache wie Lua es für viele nicht implementiert hat) Jahre), die Arrays gut funktionieren lassen.

Auch der Flexibilitätspunkt ist vertretbar. Wenn die Notwendigkeit für komplexere Annotation auftritt, ist es gut möglich, dass Sie bald auch Polymorphie benötigen, in diesem Fall sollten Sie nur zu Objekten mit einem Array unter anderen Attributen wechseln.

    
delnan 03.07.2011, 18:43
quelle
4

Wenn Sie getrennte Typen verwenden, können Sie Garantien für die Leistung geben, und Sie wissen, dass Sie eine "normale" Semantik für Dinge wie das Array-Slicing haben werden. Wenn Sie ein einheitliches System haben, müssen Sie herausfinden, was alle Vorgänge, wie z. B. Slicing, für Arrays mit geringem Datendurchsatz bedeuten.

    
Marcin 03.07.2011 18:36
quelle
0

Wie bereits erwähnt, gibt es zwei unterschiedliche Arten von Geschwindigkeits- und Komplexitätsproblemen. Eines der Dinge, die ich über zwei Typen wichtig finde, ist jedoch, dass es die Absicht des Datenspeichers zum Ausdruck bringt.

  • Eine Liste ist eine geordnete Liste von Elementen. Die Elemente und ihre Reihenfolge sind die Daten, die Schlüssel existieren nur in einer konzeptuellen Weise, um die Reihenfolge der Elemente zu beschreiben.
  • Eine Map ist eine Zuordnung von Schlüsseln zu Werten. Die Schlüssel und die Werte, die sie darstellen, sind die Daten.

Der Punkt, an dem zu beachten ist, dass die Schlüssel Teil der Daten für eine Karte sind, sie sind nicht für eine Liste ... konzeptionell. Wenn Sie einen Datentyp vor dem anderen auswählen, geben Sie Ihre Absicht an.

Ich füge als Nebensatz hinzu, dass jede Sprache, die einen Datentyp für Listen und Karten teilt, gewisse ... Ärger hat, die damit einhergehen. Es gibt immer bestimmte Zugeständnisse, die gemacht werden müssen, um die Kombination zu erlauben, und sie können dich manchmal beißen. Es ist im Allgemeinen keine große Sache, aber es kann lästig sein.

    
RHSeeger 07.07.2011 22:18
quelle