Τι Είναι το Run-Length Encoding (RLE);
Φαντάσου ότι έχεις μια μεγάλη σειρά από κουκκίδες που είναι όλες ίδιες, όπως μπλε κουκκίδες που επαναλαμβάνονται πολλές φορές. Αν πρέπει να γράψεις όλες αυτές τις κουκκίδες, θα καταλάβεις ότι μπορεί να γίνει κουραστικό και χρονοβόρο.
Το Run-Length Encoding (RLE) είναι σαν να έχεις έναν έξυπνο τρόπο να γράψεις λιγότερα πράγματα. Αντί να γράφεις κάθε κουκκίδα ξεχωριστά, απλά γράφεις πόσες κουκκίδες υπάρχουν σε μια σειρά και ποιο είναι το χρώμα τους.
Πώς Λειτουργεί;
- Μετράς Πόσες Ίδιες Κουκκίδες Έχεις:
- Κοιτάς μια σειρά από κουκκίδες και μετράς πόσες φορές επαναλαμβάνονται.
- Γράφεις Πόσες Κουκκίδες Υπάρχουν:
- Αν έχεις πολλές κουκκίδες με το ίδιο χρώμα, γράφεις πόσες είναι και ποιο χρώμα έχουν.
- Δημιουργείς ένα Κοντό Μήνυμα:
- Αντί να γράφεις όλες τις κουκκίδες, γράφεις κάτι πιο σύντομο που δείχνει πόσες υπάρχουν.
Παράδειγμα στην C#
Ας δούμε πώς να χρησιμοποιήσεις το RLE στην C# με ένα απλό παράδειγμα.
- Δημιουργία του Κώδικα RLE:
using System;
using System.Text;
class Program
{
// Μέθοδος για να κωδικοποιήσουμε το κείμενο με RLE
static string RunLengthEncode(string input)
{
if (string.IsNullOrEmpty(input))
return "";
StringBuilder encoded = new StringBuilder();
char currentChar = input[0];
int count = 1;
// Διατρέχουμε το κείμενο
for (int i = 1; i < input.Length; i++)
{
if (input[i] == currentChar)
{
count++;
}
else
{
// Προσθέτουμε τον τρέχοντα χαρακτήρα και την ποσότητα
encoded.Append(currentChar);
encoded.Append(count);
// Ενημερώνουμε για τον επόμενο χαρακτήρα
currentChar = input[i];
count = 1;
}
}
// Προσθέτουμε τον τελευταίο χαρακτήρα και την ποσότητα
encoded.Append(currentChar);
encoded.Append(count);
return encoded.ToString();
}
// Μέθοδος για να αποκωδικοποιήσουμε το κείμενο με RLE
static string RunLengthDecode(string encoded)
{
if (string.IsNullOrEmpty(encoded))
return "";
StringBuilder decoded = new StringBuilder();
for (int i = 0; i < encoded.Length; i++)
{
char currentChar = encoded[i];
i++;
// Διαβάζουμε τον αριθμό των επαναλήψεων
int count = 0;
while (i < encoded.Length && char.IsDigit(encoded[i]))
{
count = count * 10 + (encoded[i] - '0');
i++;
}
i--;
// Προσθέτουμε το χαρακτήρα την κατάλληλη ποσότητα φορές
decoded.Append(new string(currentChar, count));
}
return decoded.ToString();
}
static void Main(string[] args)
{
string text = "aaaabbbccdaa";
Console.WriteLine("Αρχικό κείμενο: " + text);
// Κωδικοποιούμε το κείμενο
string encodedText = RunLengthEncode(text);
Console.WriteLine("Κωδικοποιημένο κείμενο: " + encodedText);
// Αποκωδικοποιούμε το κωδικοποιημένο κείμενο
string decodedText = RunLengthDecode(encodedText);
Console.WriteLine("Αποκωδικοποιημένο κείμενο: " + decodedText);
}
}
Τι Κάνουμε Εδώ:
- Κωδικοποίηση με RLE:
RunLengthEncode
: Εξετάζουμε το κείμενο και μετράμε πόσες φορές επαναλαμβάνεται κάθε χαρακτήρας. Δημιουργούμε ένα νέο κείμενο που δείχνει πόσες φορές επαναλαμβάνεται κάθε χαρακτήρας.
- Αποκωδικοποίηση με RLE:
RunLengthDecode
: Διαβάζουμε το κωδικοποιημένο κείμενο και δημιουργούμε το αρχικό κείμενο ξανά, χρησιμοποιώντας τις πληροφορίες που έχουμε για τις επαναλήψεις.
Συνοπτικά
- RLE: Ένας τρόπος να μικρύνεις δεδομένα που έχουν πολλές επαναλαμβανόμενες τιμές, γράφοντας μόνο πόσες φορές επαναλαμβάνονται.
- C#: Χρησιμοποιούμε κώδικα C# για να κωδικοποιήσουμε και να αποκωδικοποιήσουμε κείμενα με τον τρόπο του RLE.