Was ist der Unterschied zwischen Array und dynamischem Array?

...komplette Frage anzeigen

6 Antworten

Zweiter Versuch - diesmal mit Java (geht aber auch in anderen Sprachen).

Wenn man einen Array haben will, den man nachträglich größer oder kleiner machen möchte, muss man zwischen der logischen und der tatsächlichen Größe eines unterliegenden Containers unterscheiden.

Man definiert z.B. eine Klasse (oder Structur) mit 2 Instanzvariablen. Einem Array (sagen wir der Größe n) sowie einer Integer, die die logische Größe hält (sz).

Am Anfang ist sz = 0. Man definiert neben den get(idx) und set(idx, val) Methoden, zusätzlich eine add(val) Methode, die die logische Größe sz um eins erhöht, gegebenenfalls einen neuen unterliegenden Container alloziert, und die Elemente umkopiert, falls sz die tatsächliche Größe erreicht hat, und das neue Element an Position sz ablegt.

Typischerweise wird überalloziert, d.h. der Array wird 1,5 oder 2fach so groß alloziert, damit man nicht bei jedem einzelnen add() diesen relativ teurenVorgang durchführen muss. (Tpischerweise verdoppelt, womit man mit C*log(n) resize Operationen aus).

Antwort bewerten Vielen Dank für Deine Bewertung
sarahj 28.01.2016, 23:09

ok, auf Anfrage hier ein Stück Pseudocode (nicht aus einer Java IDE, sondern einfach so reingetippt - ist also möglicherweise syntaktisch nicht korrekt...):

class MyDynamicArray {
    private static INITIALSIZE = 10;
    private Object[] realArray = new Object[ INITIALSIZE ];
    public int length = 0;

    public Object get(int idx) {
        return realArray[idx];
    }

    public void set(int idx, Objet newVal) {
        realArray[idx] = newVal;
    }

    private void growArray() {
        Object[] newArray = new Object[ realArray.length * 2 ];
        System.arraycopy(realArray, 0, newArray, 0, realArray.length);
        realArray = newArray;
    }

    public void add(Object newElement) {
        if (length == realArray.length) {
            growArray();
        }
        realArray[ length++ ] = newElement;
    }
}

in etwa so könnte ein dynamischer Array implementiert sein...
braucht vielleicht noch mehr (remove(idx), toString() usw.) aber im Prinzip sollte es so tun.

0

Die Angabe einer Programmiersprache wäre nützlich - es gibt nämlich auch solche, bei denen alle Arrays dynamisch sind (Scheme, Java, Smalltalk)...
Und es gibt solche, bei denen es gar keine dynamischen gibt (Fortran)!

Vermutlich willst Du was über C/C++ wissen?

Da geht es um malloc/calloc vs. statische bzw. lokal auf dem Stack mit fester Größe allozierte Arrays.

Konkret (fixe Größe):

main() {
    char *charPtrArray[100];
    int integerArray[50];
    float floatArray[1000];
    ...
}

vs. (dynamische Größe)

main() {
    char **charPtrArray = (char **)malloc( sizeof(char *) * 100 );
    int *integerArray = (int *)malloc( sizeof(int) * 50 );
    float *floatArray = (float *)malloc( sizeof(float) * 1000);
    ...
}

auch:

int size = 1000; // berechnete Größe
float *floatArray = (float*)malloc( sizeof(float) * size );

In vielen Sprachen (Libraries) gibt es auch Datentypen, die sich nach dem Anlegen noch vergrößern/verkleinern lassen. Vielleicht meinst Du auch das. Das ist aber besonders abhängig von der verwendeten Sprache und eventuell auch der Bibliotheken (C++).

hilft das weiter?

Antwort bewerten Vielen Dank für Deine Bewertung
Omnivore08 28.01.2016, 14:26

Die Angabe einer Programmiersprache wäre nützlich -

In den Schlagworten steht Java. Aber so langsam hab ich mich auch dran gewöhnt Rätselraten um die Programmiersprache zu machen :D:D

1
sarahj 28.01.2016, 16:37
@Omnivore08

oh, das habe ich wohl übersehen (oder kam es später?).
Dann ist meine Antwort unnütz... ;-(

1

Ein Array heißt dynamisch, wenn man seine Länge (d.h. die Zahl der Speicherplätze, aus denen es besteht) auch während es im Gebrauch ist, noch vergrößeren oder verkleinern kann.

Für alle anderen Arrays - man nennt sie statische Arrays - liegt ihre Länge fest, noch bevor das Programm compiliert wird: Der Programmierer hat sie dann im Code fest vorgegeben.

Antwort bewerten Vielen Dank für Deine Bewertung

Array's sind von Anfang an mit ihrer Größe bestimmt.

dynamische Arrays an sich gibt es nicht. Nur Quasi-dynamisch. Listen zum Beispiel. Die haben im Hintergrund aber auch nur eine feste Größe und werden bei Bedarf vergrößert. Dabei wird die alte Größe z.B. mal 1,5 genommen und dann die alten Daten in das neue Array geschrieben. Von außen merkt man davon nichts.

Antwort bewerten Vielen Dank für Deine Bewertung

EIn Array hat normal eine Bestimmte anzahl an Elementn Ein Dynamisches Array hat eine Variable Anzahl an Elementen da die Genaue Anzahl zum Programmstart noch nicht bekannt ist und sich ändern kann. Genauere Infos kommen dann auf die Sprache an

Antwort bewerten Vielen Dank für Deine Bewertung

Ganz ehrlich? Darüber gibt es im Internet dutzende Erklärungen, Definitionen und Beispiele und sogar Übungsaufgaben. Du machst eine Informatik Ausbildung, Programmierer und oder Studium und kannst google nicht benutzen?  Tip die Größe ist flexible.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?