Ciao, mi permetto di farti notare delle cose, poi vedo se riesco ad aiutarti.
1) non esistono byte simili, esistono byte identici o diversi
2) parli di byte e poi parli di caratteri: sappi che fino a un alfabeto di 256 simboli puoi continuare a trattarli nel medesimo modo, per albafeti con più simboli non puoi più ragionare per byte=char
3) Se hai un insieme A di N elementi, in cui ogni n appartenente a A può essere un {s1, s2, s3, ... sm}, quindi M diversi simboli, sono valide le seguenti regole:
- per conoscere ogni n di A, devi leggere ogni elemento, quindi almeno N letture.
- le possibili combinazioni sono NxM
passiamo all'algoritmo.
sinceramente non ho capito bene come funziona e non ho voglia di andare a cercarmi la spiegazione, cmq posso darti alcuni hint
parli di finestre: è corretto, un algoritmo di compressione per essere performante deve lavorare su sottogruppi di elementi, quindi finestre di dati
per leggere N byte in memoria, basta allorare un array di N byte (o char): lavorerai su quell'array. Leggere N byte è la parte più "pesante" del lavoro.
per come hai spiegato l'algoritmo, è ovvio che ad ogni passaggio esamini un carattere, carattere che hai già in memoria, quindi le operazioni di confronto sono da considerare quasi istantanee
non capisco perchè poi chiedi algoritmi che ottimizzare il find di sottostringhe in stringhe (se non puoi fare nessuna assunzione sul contenuto della stringa, non ci sono alternative a esaminare ogni singolo elemento): esistono dei metodi che confrontano array di caratteri, sfruttando la rappresentazione a bit di ogni carattere, ma credo sia al di fuori della tua portata per lo scopo.
poi visto che chiedevi come farlo in C++, ecco un help, poi continui tu
Code:
std::ifstream file
int windowSize = 100;
size_t fileSize;
size_t deltaSize = 0;
file.open("mycert.cer", ios_base::binary);
if(!file.is_open())
return;
file.seekg(0, ios::end);
fileSize = file.tellg();
deltaSize = fileSize;
file.seekg(0, ios::beg);
std::vector<byte> data(windowSize, 0);
do {
if(deltaSize < windowSize) {
file.read(reinterpret_cast<char*>(&data[0]), deltaSize );
} else {
file.read(reinterpret_cast<char*>(&data[0]), windowSize);
}
deltaSize -= windowSize;
// do something with data
} while (deltaSize == 0);
file.close();