Skip to content

Commit 1fa8c39

Browse files
committed
dodanie dokumentacji problemu2, dodanie potencjalnej zamiany poli na boli w problemie2
1 parent 6ddf5df commit 1fa8c39

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

index.html

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ <h3>Complexity and proof</h3>
238238
<h2>Problem 2</h2>
239239
<div class="panel">
240240
<h3>Problem description</h3>
241+
<<<<<<< HEAD
241242
<p><!-- Problem 2 description goes here --></p>
242243

243244
<h3>Our interpretation</h3>
@@ -257,6 +258,105 @@ <h3>Tests</h3>
257258

258259
<h3>Complexity and proof</h3>
259260
<p><!-- Complexity and proof for problem 2 goes here --></p>
261+
=======
262+
<p>Problem. Zapisać opowieść-melodię w maszynie Informatyka, zamieniając wcześniej „poli” na
263+
„boli” oraz próbując oszczędzić wykorzystane miejsce. Znaleźć rozwiązanie problemu ewentualnej
264+
zamiany innych fragmentów opowieści-melodii, który niepokoi Heretyka oraz Informatyka.
265+
</p>
266+
267+
<h3>Our interpretation</h3>
268+
<p>
269+
Musimy wyszkiwać wzorzec, podmienić go, a następnie całą pieść poddać kompresji.
270+
W tym celu wykorzystamy algorytm Knutha-Morissa-Pratta oraz algorytm Huffmana.
271+
</p>
272+
273+
<h3>Files</h3>
274+
<p>
275+
plik główny: problem2.cpp
276+
plik pomocniczy z funkcjami niezwiązanymi z algorytmem KMP/Huffmana: filtering.h
277+
wyszukiwanie wzorca: KMP.h
278+
kompresja: huffman.h
279+
</p>
280+
281+
<h3>Input data</h3>
282+
<p>wejście: nasza pieśń która będzie plikiem tekstowym (z przerobionymi wyrazami), oraz plik z parami wyrazów pierwszy niepoprawny (ten w piosence) a drugi poprawny (heretyk przy użyciu swoich kontaktów z siłami nadprzyrodzonymi wie które są przerobione), wyrazy są ustawione w następujący sposób
283+
poprawny zły
284+
poprawny zły
285+
itd
286+
</p>
287+
288+
<h3>Output data</h3>
289+
<p>wyjście: plik z pieśnią do której mają dostęp informatyk oraz heretyk, która została poddana obróbce zgodnie z tym co należy przerobić według heretyka oraz zakodowana i skompresowana zgodnie z algorytmem Huffmana </p>
290+
291+
<h3>Tests</h3>
292+
<p>
293+
Łatwo idzie zauważyć, że program ten działa. Wystarczy wpisać dowolny tekst z podmienionymi paroma wyrazami, oraz uzupełnić plik tekstowy na słowa i otrzymamy naszą pieśń skompresowaną zgodnie z algorytmem Huffmana. Zastępowanie liter/wyrazów funkcjonuje bez najmniejszych problemów pragnę więc skupić się na specyficznych przypadkach:
294+
295+
1. wejście puste:
296+
W przypadku gdy jedno z wejść jest puste program nas poinformuje o zakończeniu działania.
297+
2. nasz wyraz będzie dłuższy od tekstu/równy lub wzorzec == wyraz do podmiany
298+
W takim przypadku funkcja errorChecking w KMP.h zajmie się sprawdzeniem tych przypadków i odpowiednią reakcją na nie
299+
3. wejście to pojedynczy znak
300+
Program ten jest przystosowany do takiej ewentualności jednakże będzie również przyjmował znak nowej linii.
301+
302+
</p>
303+
304+
<h3>Complexity and proof</h3>
305+
<p>
306+
Przed próbą dowiedzenia poprawności pragnę zauważyć, że istnieje szansa na powstanie konfliktu w kolejności podmiany np:
307+
308+
rower podmieniamy na kajak
309+
kaj podmieniamy na maj
310+
311+
wynikiem końcowym powinien być wyraz majak jednakże rozważmy następującą sytuację:
312+
313+
kaj -> maj
314+
rower -> kajak
315+
316+
Łatwo idzie zauważyć, że bez odpowiedniej reakcji wynikiem końcowym będzie wyraz kajak, albowiem nie znajdziemy na początku dopasowania dla kaj. W związku z czym musimy nasz zbiór wyrazów posortować względem liczby znaków, a dokładniej rzecz ujmując malejąco.
317+
318+
319+
Pomimo posortowania malejąco dalej możemy natrafić na konflikt, weźmy pod uwagę następującą sytuację:
320+
a -> b
321+
c -> d
322+
b -> c
323+
324+
Posortowane pod względem rozmiaru ewidentnie to jest, jednakże nadal występuje konflikt, albowiem dla wejścia:
325+
aaa
326+
otrzymamy:
327+
ccc
328+
329+
Powodem tego jest to, iż nie posortowaliśmy naszego wejścia (wyrazów do podmiany) leksykograficznie, po takim działaniu będziemy mieli następującą kolejność:
330+
a -> b
331+
b -> c
332+
c -> d
333+
334+
Czyli dla naszego wejścia aaa wyjściem będzie ddd.
335+
336+
Możemy starać się z całego serca zredukować konflikt jednakże to jeszcze nie jest koniec, bo co w sytuacji gdy:
337+
338+
a -> z
339+
c -> a
340+
z -> b
341+
342+
Długość wyrazów ta sama? Jest. Wyraz do podmiany posortowany leksykograficznie? Również jest. To dlaczego dalej mamy konflikt?
343+
W celu otrzymania pełnej poprawność musimy jeszcze wyrazy zastępujące również posortować leksykograficznie.
344+
Przykład we/wy może być analogiczny do poprzedniego więc pozostawię go wyobraźni.
345+
346+
Reszta kodu to jest algorytm Knutha Morrisa Pratta oraz algorytm Huffamana które zostały już dawno dowiedzione przez ludzi z znacznie większą wiedza ode mnie więc zaufam im na słowo.
347+
348+
Ogólna złożoność czasowa:
349+
Złożoność KMP: O(k⋅(n+m), gdzie k to liczba wywołań pattern, n to długość tekstu, a m to długość wzorca.
350+
Złożoność Huffmana: O(n logn) dla tworzenia drzewa, O(n) dla kompresji i dekompresji.
351+
Ogólna uproszczona złożoność: O(k * (n + m) + n * log n)
352+
353+
Złożoność przestrzenna:
354+
Odczyt plików: O(n), gdzie n to liczba znaków w pliku.
355+
Algorytm KMP: O(n) dla przechowywania wzorców i tekstu.
356+
Algorytm Huffmana: O(n) dla przechowywania drzewa i skompresowanego tekstu.
357+
358+
</p>
359+
>>>>>>> 1f6d3e6 (dodanie dokumentacji problemu2, dodanie potencjalnej zamiany poli na boli w problemie2)
260360
</div>
261361

262362
<h2>Problem 3</h2>

src/src/problem2.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ int main(int argc, char* argv[]) {
4343
KMP kmp = *new KMP();
4444
int i;
4545
Filtering::sortByLength(words);
46+
47+
kmp.pattern(song, poli, boli);
48+
4649
for(i = 0; i < n; i++){
4750
kmp.pattern(song, words[i].first, words[i].second);
4851
}

0 commit comments

Comments
 (0)