Frage zu 2D array Datenstruktur



  • Hallo,

    ich habe gerade einen code vor mir liegen der eine Tabelle so abspeichert:

    Ein array was alle Datenwerte trägt der Tabelle.
    Ein Array was nur aus pointern besteht von denen jeder pointer auf den anfang einer spalte der tabelle zeigt und damit jeder pointer auf das erste array zeigt, jeder halt wo anders hin. Zusätzlich noch ein array aus int-werten die die länge der einzelnene spalten anzeigen. Ist das so üblich?

    bsp:
    2 3 4
    9 8 2
    1 2 1

    arr1: 2, 9, 1, 3, 8, 2, 4, 2, 1,
    pointerarray: 0, 3, 6
    length-array: 3, 3, 3

    Performance-technisch evtl. schneller so? Evtl. wegen der anzahl der cache-misses die man hätte wenn man lauter einzelne kleine arrays anlegen würde pro spalte der tabelle?

    Es geht um geschwindigkeit....



  • Nja ob das wirklich so viel performanter ist als ein std::vector<std::vector<int>> ? Teste es ^^



  • Wenn die Größe des 2D-Arrays schon vorher feststeht, kannst du getrost eine Variable á la int arr[3][4]; verwenden, dann muss es nicht für jede Zeile/Spalte einen neuen Zeiger geben.
    Wenn die Größe während der Laufzeit ermittelt wird, musst du ja mit Zeigern arbeiten. Dabei hast du ein paar Möglichkeiten.. Entweder du nimmst (siehe (D)Evil) vector< vector<int> >, du kannst auch selber Pointer auf Zeilen/Spalten erstellen, die dann deren Werte enthalten int* arr*, oder du behandelst es als 1D-Array und berechnest entsprechend die Indizes um:

    int* arr = new int [ zeilen * spalten ];
    arr[ zeilen_nr * spalten + spalten_nr ] = 123;
    

    Gegebenenfalls, bei häufigen Zugriffen, kannst/solltest du dir bei letzterer Möglichkeit eine Klasse drumherum bauen.



  • testo schrieb:

    pointerarray: 0, 3, 6
    length-array: 3, 3, 3

    Ist zwar doppelt-gemoppelte Info. Es wuerde sowas wie 3, 6, 9 reichen, dann hast du sowohl die pointer (der erste ist ja immer 0) als auch die Laengen der unterarrays:
    pseudocode:

    length[i] = index[i] - i?0:index[i-1]
    

    allerdings ist das widerum eine Berechnung, die da durchgefuehrt wird. Wenn du den ganzen Kram aber eh hart codierst, sollte der Compiler im Zuge einfacher Optimierungen Ueberall die entsprechenden Zahlen direkt einsetzen...


Anmelden zum Antworten