Po ‘ Array in C++

Quando si lavora con Progetto Eulero problemi che ho spesso bisogno di grandi (> 10**7) matrice di bit s.

Mio approccio è quello di:

bool* sieve = new bool[N];

bool sieve[N];

Quando N = 1.000.000 di il mio programma si avvale di 1 MegaByte (8 * 1.000.000 di bit).

C’è un modo più efficiente per uso archivio po ‘ array di bool in c++?

  • implementare il setaccio dell’algoritmo utilizzando vettori.. si può ritenere che molti numeri.
  • Possibile duplicato di C/C++ efficiente matrice di bit
InformationsquelleAutor Seth | 2010-09-27

 

10 Replies
  1. 21

    Utilizzare std::bitset (se N è una costante), altrimenti uso std::vector<bool> come altri hanno detto (ma non dimenticate di lettura questo ottimo articolo Herb Sutter)

    Un bitset è uno speciale contenitore di classe che è stato progettato per memorizzare i bit (elementi con solo due possibili valori: 0 o 1, vero o falso, …).

    La classe è molto simile ad un normale array, ma l’ottimizzazione per l’allocazione dello spazio: ogni elemento occupa solo un po ‘ (che è otto volte di meno che il più piccolo tipo elementare in C++: char).

    MODIFICA:

    Herb Sutter (in tale articolo si afferma che il

    Il motivo std::vector< bool > è anticonformista è che si tira trucchi sotto le coperte nel tentativo di ottimizzare lo spazio: Invece di memorizzare un intero char e int per ogni bool[1] (fino almeno 8 volte lo spazio, sulle piattaforme a 8-bit caratteri), imballa le bools e li memorizza come singoli bit(all’interno, diciamo, caratteri) nella sua rappresentazione interna.

    std::vector < bool > forze una specifica ottimizzazione di tutti gli utenti dandogli standard. Che non è una buona idea; diversi utenti hanno esigenze diverse, e ora tutti gli utenti del vettore deve pagare la pena di prestazioni anche se non si desidera o necessità il risparmio di spazio.

    EDIT 2:

    E se avete usato il Boost è possibile utilizzare boost::dynamic_bitset(se N è noto a runtime)

  2. 12

    Per il meglio o per il peggio, std::vector<bool> di usare bit invece di bool, per risparmiare spazio. Quindi, basta usare std::vector come si dovrebbe essere in primo luogo.

    Se N è una costante, è possibile utilizzare std::bitset.

  3. 4

    Un ‘bool’ tipo non è memorizzato utilizzando solo 1 bit. Dal tuo commento circa le dimensioni, sembra di usare 1 intero byte per ogni bool.

    Un C come modo per farlo sarebbe:

    uint8_t sieve[N/8]; //array of N/8 bytes

    e quindi logico O di byte insieme per ottenere tutti i tuoi bit:

    sieve[0] = 0x01 | 0x02; //this would turn on the first two bits

    In questo esempio, 0x02 0x01 e sono numeri esadecimali che rappresentano byte.

    • con voto positivo, buona idea, può essere, è N/8+1, è un po ‘ imballato array.
  4. 4

    Si potrebbe cercare std::bitset e std::vector<bool>. Quest’ultimo è spesso sconsigliato, perché nonostante il vector nel nome, non è davvero agire come un vettore di qualsiasi altro tipo di oggetto, e infatti non soddisfa i requisiti per un contenitore in generale. Tuttavia, può essere molto utile.

    OTOH, non succede niente (almeno affidabile) archivio di 1 milione di bool valori in meno di 1 milione di bit. È semplicemente non può essere fatto con qualsiasi certezza. Se il bit set contengono un certo grado di ridondanza, ci sono vari schemi di compressione che potrebbe essere efficace (ad esempio, LZ*, Huffman, aritmetica) ma senza alcuna conoscenza dei contenuti, è impossibile dire che sarebbe per certo. Uno di questi, tuttavia, normalmente memorizzare ogni bool/bit in un solo bit di archiviazione (più un poco overhead per la contabilità-ma che di solito è una costante, e in ordine di byte di decine di byte in più).

  5. 3

    Sì, è possibile utilizzare un bitset.

    • Mentre questo link può rispondere alla domanda, è meglio includere le parti essenziali di qui la risposta e fornire il link di riferimento. Link-solo le risposte possono essere inutili se la pagina collegata modifiche.
  6. 2

    Si potrebbe essere interessati a provare il BITSCAN biblioteca come alternativa. Di recente un’estensione è stata proposta per la frammentarietà, di cui non sono sicuro è il tuo caso, ma potrebbe essere.

  7. 0

    È possibile utilizzare un array di byte e indice nell’. Indice n sarebbe in byte indice n/8, bit # n%8. (In caso std::bitset non è disponibile per qualche motivo).

  8. 0

    Un ‘bool’ tipo non è memorizzato utilizzando solo 1 bit. Dal tuo commento circa le dimensioni, sembra di usare 1 intero byte per ogni bool.

    Un C come modo per farlo sarebbe:

    uint8_t sieve[N/8]; //array of N/8 bytes

    elemento della matrice è:

    result = sieve[index / 8] || (1 << (index % 8)); 

    o

    result = sieve[index >> 3] || (1 << (index & 7));

    1 nella matrice:

    sieve[index >> 3] |= 1 << (index & 7);

Lascia un commento