1. Αλγόριθμοι συμπίεσης χωρίς απώλειες (διατήρηση πρωτότυπου κειμένου): Αυτά είναι κατάλληλα όταν πρέπει να ανακατασκευάσετε τέλεια την αρχική συμβολοσειρά.
* κωδικοποίηση Huffman: Πρόκειται για ένα σχήμα κωδικοποίησης μεταβλητού μήκους. Εκχωρεί μικρότερους κωδικούς σε συχνότερους χαρακτήρες και μεγαλύτερους κωδικούς σε λιγότερο συχνές. Είναι πολύ αποτελεσματικό για κείμενο με ανομοιογενείς κατανομές χαρακτήρων. Οι εφαρμογές είναι άμεσα διαθέσιμες σε πολλές γλώσσες προγραμματισμού.
* Lempel-Ziv (LZ77, LZ78, LZW): Αυτοί οι αλγόριθμοι εκμεταλλεύονται τα επαναλαμβανόμενα πρότυπα και τις ακολουθίες μέσα στο κείμενο. Κατασκευάζουν ένα λεξικό προηγουμένως παρατηρημένων ακολουθιών και αντικαθιστούν επαναλαμβανόμενες περιστατικές με αναφορές στο λεξικό. Το LZ77 και τα παράγωγά του (όπως το DervaTe, που χρησιμοποιούνται σε φερμουάρ και GZIP) είναι εξαιρετικά κοινά και χρησιμοποιούνται ευρέως λόγω των καλών αναλογιών συμπίεσης και των σχετικά γρήγορων ταχύτητων. Είναι ιδιαίτερα καλά για κείμενο με πλεονασμό.
* bzip2: Αυτός ο αλγόριθμος συνδυάζει ένα μετασχηματισμό Burrows-Wheeler (BWT) με κωδικοποίηση Huffman. Το BWT αναδιατάζει τη συμβολοσειρά εισόδου για να βελτιώσει την αποτελεσματικότητα της κωδικοποίησης Huffman με συσσωρεύοντας παρόμοιους χαρακτήρες μαζί. Γενικά επιτυγχάνει υψηλότερες αναλογίες συμπίεσης από το GZIP, αλλά με το κόστος της βραδύτερης συμπίεσης και των ταχύτητων αποσυμπίεσης.
* zlib/gzip/zip: Αυτές είναι άμεσα διαθέσιμες βιβλιοθήκες και εργαλεία που εφαρμόζουν παραλλαγές αποπληθωρισμού, προσφέροντας μια καλή ισορροπία μεταξύ της αναλογίας συμπίεσης και της ταχύτητας. Είναι συχνά η επιλογή για τη συμπίεση κειμένου γενικής χρήσης.
2. Αλγόριθμοι συμπίεσης απώλειας (μην διατηρείτε το πρωτότυπο κείμενο): Αυτά δεν είναι * κατάλληλα αν χρειαστεί να ανακτήσετε το ακριβές αρχικό κείμενο, αλλά μπορούν να επιτύχουν πολύ υψηλότερους λόγους συμπίεσης. Σπάνια χρησιμοποιούνται για γενικό κείμενο, αλλά μπορεί να είναι κατάλληλοι σε σενάρια.
* προσεγγίσεις/αφαίρεσης: Εάν δεν χρειάζεστε την ακριβή διατύπωση, θα μπορούσατε να συνοψίσετε ή να αντιπροσωπεύσετε το κείμενο με λέξεις -κλειδιά ή ένα μικρότερο σύνολο δεδομένων. Αυτό εξαρτάται σε μεγάλο βαθμό από την εφαρμογή και απαιτεί προσαρμοσμένη λογική.
Επιλέγοντας τη σωστή μέθοδο:
* για τη συμπίεση κειμένου γενικής χρήσης: `gzip` (ή` zlib` στον κωδικό σας) είναι ένα φανταστικό σημείο εκκίνησης. Προσφέρει μια καλή ισορροπία αναλογίας συμπίεσης και ταχύτητας.
* για πολύ υψηλές αναλογίες συμπίεσης (αλλά βραδύτερη ταχύτητα): Το `bzip2` είναι μια καλή επιλογή.
* Εάν χρειάζεστε εξαιρετικά γρήγορη συμπίεση, ακόμη και με το κόστος ελαφρώς χαμηλότερων αναλογιών συμπίεσης: Εξετάστε έναν απλούστερο αλγόριθμο όπως η κωδικοποίηση Huffman, αν και το κέρδος μπορεί να είναι ελάχιστο με άμεσα διαθέσιμες βελτιστοποιημένες βιβλιοθήκες για το GZIP.
* Εάν έχετε προηγούμενη γνώση της δομής του κειμένου ή των στατιστικών ιδιοτήτων: Μπορεί να είστε σε θέση να προσαρμόσετε μια στρατηγική συμπίεσης. Για παράδειγμα, εάν γνωρίζετε ότι είναι κυρίως αγγλικό κείμενο, μπορείτε να χρησιμοποιήσετε έναν πίνακα συχνότητας χαρακτήρων ειδικά για τα αγγλικά.
Παράδειγμα χρησιμοποιώντας Python (GZIP):
`` `Python
Εισαγωγή GZIP
Εισαγωγή IO
Text ="Αυτή είναι μια συμβολοσειρά δείγματος. Αυτή η συμβολοσειρά επαναλαμβάνεται για να επιδείξει συμπίεση." * 100
compressed_data =gzip.compress (text.encode ('utf-8'))
decompressed_data =gzip.decompress (compressed_data) .decode ('utf-8')
Εκτύπωση (F "Πρωτότυπο μέγεθος:{len (text)} bytes")
εκτύπωση (F "συμπιεσμένο μέγεθος:{len (compressed_data)} bytes")
PRINT (F "Πρωτότυπο κείμενο:{κείμενο [:50]} ...") #Show μόνο ένα μέρος για να αποφευχθεί η τεράστια παραγωγή.
εκτύπωση (F "αποσυμπιεσμένο κείμενο:{decompressed_data [:50]} ...") #Show μόνο ένα μέρος για να αποφευχθεί η τεράστια παραγωγή.
#Handling αρχεία αντί για χορδές
με ανοιχτό ('myfile.txt', 'wb') ως f:
F.Write (text.encode ('UTF-8'))
με ανοιχτό ('myfile.txt.gz', 'wb') ως f_out:
με gzip.open (f_out, 'wb') ως f_in:
με ανοιχτό ('myfile.txt', 'rb') ως f:
f_in.writelines (f)
`` `
Θυμηθείτε να χειριστείτε πιθανές εξαιρέσεις (όπως το `ioerror ') όταν εργάζεστε με αρχεία. Αυτό το παράδειγμα δείχνει βασική χρήση. Μπορείτε να το προσαρμόσετε ώστε να ταιριάζει στις συγκεκριμένες ανάγκες σας και να την ενσωματώσετε σε μεγαλύτερα προγράμματα. Πάντα να εξετάζετε το χειρισμό σφαλμάτων και την αποτελεσματική διαχείριση της μνήμης όταν ασχολείστε με μεγάλες χορδές κειμένου.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα