You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: index.html
+100Lines changed: 100 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -238,6 +238,7 @@ <h3>Complexity and proof</h3>
238
238
<h2>Problem 2</h2>
239
239
<divclass="panel">
240
240
<h3>Problem description</h3>
241
+
<<<<<<<HEAD
241
242
<p><!-- Problem 2 description goes here --></p>
242
243
243
244
<h3>Our interpretation</h3>
@@ -257,6 +258,105 @@ <h3>Tests</h3>
257
258
258
259
<h3>Complexity and proof</h3>
259
260
<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)
0 commit comments