Najłatwiejszy algorytm kompresji. Poznajemy jak działa, jak go napisać. Zaczynajmy!
Cóż, tutaj nie ma co zgadywać, zobaczmy na funkcję:
const runLengthEncoding = (string) => {
let result = '';
let count = 1;
for (let i = 0; i < string.length; i++) {
let j = i + 1;
while (string[i] === string[j]) {
count++;
if (count === 9) {
j++;
break;
} else {
j++;
}
}
result = result.concat(`${count}${string[i]}`);
count = 1;
i = j - 1;
}
return result;
}
A także na jej działanie:
console.log(runLengthEncoding("AAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBCCCCCCCDDDDDDDDAABB"));
//9A9A7A9B3B7C8D2A2B
I teraz omówienie:
- Są dwa wskaźniki, i oraz j
- Wskaźnik i zaczyna od 0 i leci jak indeksy
- Wskaźnik j to 1 większy od i
- Tak długo jak litera pod j jest taka sama jak pod i j jest przesuwany i count zwiększany
- count nie może być większy od 9 bo kompresja polega na tym, że pierwszy znak to ilość od 1-9, drugi to litera/znak
- Niezależnie od tego czy count przekroczył 9 czy po prostu litera pod j się zmieniła, dodajemy count i literę do wyniku, resetujemy count, j już wskazuje na następną literę, ale jeszcze i musimy przestawić na indeks o jeden wcześniejszy niż j
Wytłumaczenie dlaczego nie można mieć więcej niż 9 kompresji. Cóż, dlatego:
109A
To jest jedno zero 9 A? A może 10 znaków 9? No generalnie cała kompresja się psuje od strony logicznej gdy burzymy założenie, że pierwsze to ilość, drugie to znak.
Nie mówiąc już o tym, że dwucyfrowe wydłużają kompresowany tekst. Ten algorytm też jest niespecjalnie wyszukany, zobaczmy na takie coś:
AAB --> 2A1B
Super kompresja po której tekst staje się dłuższy. Natomiast jest to swego rodzaju algorytm, który warto opanować zanim rzucimy się na trudniejsze, w celach edukacyjnych i lekkiego wprowadzenia zagadnień, o których nie mamy jeszcze pojęcia.