Ho letto Introduction To Algorithms 3rd Ed , e ho difficoltà a implementare alcuni aspetti pratici situazioni. Non è la teoria, o l'implementazione degli interni delle strutture di dati stessi, ma piuttosto come progettare una buona interfaccia che renda le strutture dati utili per la memorizzazione di dati reali (al contrario solo delle chiavi).
In particolare, mi viene detto che C ha una filosofia di tipo "fidati del programmatore". Solo non so quanta fiducia è troppa fiducia:
Ad esempio, molte strutture dati possono essere implementate come strutture collegate con nodi simili con chiave, dati satellitari e puntatori ad altri nodi nel ds, ad esempio:
typedef struct {
int key;
void *data;
node_t *prev;
node_t *next;
} node_t;
-
In che misura dovrei incapsulare le mie implementazioni? Per la maggior parte delle strutture, hai entrambi: (a) un tipo di struttura dati e (b) un tipo che può essere inserito / eliminato dalla struttura dati. Dovrebbero entrambi essere nascosti? Chiaramente se espongo un po 'di
node_t
con l'intenzione che qualcuno altera solokey
e*data
... c'è la possibilità cheprev
onext
sia alterato, distruggendo così la struttura dei dati. Un rischio simile esiste se espongo il tipo di struttura dei dati e qualcuno gira con la radice .. -
Come devono essere memorizzati / consultati / confrontati i tasti? Presumibilmente, i tasti dipendono dai dati del satellite, ma se si procede come sopra, la chiave è stata disaccoppiata dai dati stessi. Cosa accadrebbe se un utente aggiorna i dati ma si dimentica di aggiornare la chiave (o peggio, aggiorna la chiave, ma non la rimuove / reinserisce nel ds)? Per qualcosa come un albero binario che usa solo confronti, potrei progettare l'interfaccia per accettare comparatori che accettano puntatori ai dati satellitari? Ciò rende la struttura più generalizzata, ma tutte le defreferenze devono avere un impatto sulla velocità. In alternativa, (e sarebbe necessario per strutture come hash che richiedono una chiave concreta), potrei accettare un puntatore a una funzione
int toKey(void *data)
..
Non sono chiaro su come un buon software dovrebbe essere progettato per l'uso nel mondo reale.