2010-03-29 24 views
7

Voglio implementare un Set in C. È corretto usare un elenco collegato, quando si crea il SET, o dovrei usare un altro approccio?Come implementare un set?

Come di solito implementare il proprio set (se necessario).

NOTA: Se io uso l'approccio lista concatenata, io probabilmente hanno le seguenti complessità per impostare il mio operazioni:

  • init: O (1);
  • destroy: O (n);
  • inserire: O (n);
  • rimuovere: O (n);
  • unione: O (n * m);
  • intersezione: O (n * m);
  • differenza: O (n * m);
  • nome: O (n);
  • issubset: O (n * m);
  • setisequal: O (n * m);

O (n * m) sembra essere un po 'troppo grande soprattutto per i dati enormi ... C'è un modo per implementare il mio set più efficiente?

+0

Senza sapere cosa si vuole ottenere è difficile aiutare. Se vuoi solo avere una matrice come struttura allora Vector è probabilmente la tua strada da percorrere.Ho assunto che stai effettivamente usando C++. L'STL ha un sacco di cose che è destinato ad aiutarti. – thecoshman

+2

C++ implementa la sua classe impostata come un albero binario bilanciato, probabilmente è una buona scelta. –

+4

@thecoshman Poiché la sua domanda è stata contrassegnata come C, penso che possiamo supporre che non stia utilizzando C++. –

risposta

4

Ho usato alberi rosso-nero in passato per creare serie.

Ecco le complessità temporali dall'articolo di Wikipedia.

Spazio O (n)
Ricerca O (log n)
Inserire O (log n)
Delete O (log n)

+0

Puoi darmi qualche suggerimento sulla complessità di O (n)? –

+0

pubblicato nella modifica –

3

Ci sono molti modi per impostare l'implementazione. Here sono alcuni di loro. Oltre allo MSDN c'è un ottimo articolo su di esso.

+0

Grazie per aver menzionato l'articolo di MSDN, articolo molto interessante. –

2

Dal momento che si dispone già di una lista concatenata implementato, il più semplice è a skip list. Se si desidera utilizzare alberi bilanciati, il più semplice a mio parere è un treap. Si tratta di strutture dati randomizzate, ma generalmente sono altrettanto efficienti delle loro controparti deterministiche, se non di più (e una lista skip può essere resa deterministica).

+0

Grazie per aver menzionato l'elenco dei salti (non lo sapevo). Probabilmente lo userò in un altro contesto. (Multumesc!) –

8

Gli insiemi vengono in genere implementati come alberi red-black (che richiede che gli elementi abbiano un ordine totale) o come un hashtable che ridimensiona automaticamente (che richiede una funzione hash).

Quest'ultimo viene in genere implementato avendo la dimensione doppia di hash e reinserendo tutti gli elementi quando viene superata una determinata soglia di capacità (il 75% funziona bene). Ciò significa che le operazioni di inserimento inidividuali possono essere O (n), ma quando sono ammortizzate su molte operazioni, in realtà è O (1).