2010-10-25 19 views
5

Ho bisogno di una struttura di dati con le seguenti proprietà:Quale struttura dati usare?

  • Accesso componenti devono essere molto veloce
  • elementi, che non sono aggiunti, non devono assumere memoria (come ideale, dimensione della struttura vuota vicino zero)
  • Ciascun elemento ha due coordinate intere (x, y) (accesso a elementi solo da loro)
  • conteggio massimo di elementi noti al momento della creazione (oltre 10^3)
  • elemento contiene valori pochi galleggiante

Sarebbe bene se si dirigesse anche a un'implementazione di questa struttura in C o C++.

+1

Si tratta di un compito a casa? –

+1

Scegli la tua lingua. Non esiste una cosa come C/C++ e le implementazioni per queste 2 lingue sarebbero molto diverse. –

+2

@R .. il tuo punto è preso, ma quell'argomento è DAVVERO stanco. Mi riferisco a C/C++ tutto il tempo. Perché? Perché i nostri pacchetti di solito finiscono per essere wrapper C++ attorno ai pacchetti C. Non credo che qualcuno sia orribilmente offeso, tranne per i puristi di entrambi i campi che hanno il lusso di scegliere una lingua o l'altra. –

risposta

3

Verificare questo - è possibile modificare il tipo di elemento a float se questo fa tutto ciò che volete.

Concise Sparse Matrix Package in C

per C++ è possibile utilizzare Boost.uBLAS - dettagli sparse_matrix here.

7

Sei alla ricerca di un sparse matrix?

+1

Buon punto. Tranne che, se l'osservazione dell'OP "oltre 10^3" significa veramente "poche migliaia", raccomanderei un semplice array 2-d. –

1

Se X e Y sono relativamente piccoli, una serie bidimensionale di puntatori funzionerebbe. 10000 puntatori sarebbero 40K in codice a 32 bit.

+0

Anche in modalità 64 bit, può utilizzare indici a 32 bit. –

1

 

typdef ElementAccessor std::pair<int, int>; 

struct Element 
{ 
    float f1; 
    float f2; 
    //etc. 

}; 

std::map< ElementAccessor, Element > myElementMap; 

È ora possibile utilizzare questa mappa come matrice. ElementAccessor si riferisce a x, y. Assicurati solo di vedere se l'elemento esiste nella mappa prima di provare ad accedervi, o ne viene creato uno per impostazione predefinita.

http://www.cplusplus.com/reference/std/utility/pair/ http://www.cplusplus.com/reference/stl/map/find/

edit: le staffe di modello vengono visualizzati per la mappa. il tipo di chiave della mappa è ElementAccessor, il valore è Element. Inoltre, per la coppia, il template è int, int.

+0

L'accesso a questi elementi è il tempo logaritmico. Quindi se metti 1 milione di elementi nella mappa, non ci vorranno ancora molte operazioni per accedere ai tuoi dati. Non un dereferimento di array costante, ma un grande risparmio di spazio. –

+0

markup corretto. C'è (o una volta, non ho verificato) un bug irritante in SO che il rientro del codice non funziona sulla prima riga, da qui il nbsp. –

+0

@steve grazie! –