-
Notifications
You must be signed in to change notification settings - Fork 12
Zajecia
Poznamy dziś nową strukturę danych nazywaną kopcem lub stogiem (są to tłumaczenia angielskiego terminu heap). Kopiec służy do przechowywania liczb. Pozwala na
-
Szybkie wstawianie dodatkowych liczb.
-
Szybkie odnajdywanie liczby najmniejszej.
-
Szybkie usuwanie wybranej liczby (np. tej najmniejszej).
Co to znaczy szybkie? Koszt każdej z powyższych operacji jest proporcjonalny do logarytmu rozmiaru kopca. Logarytm (dwójkowy) to (w przybliżeniu) liczba cyfr liczby w zapisie dwójkowym. Przykładowo logarytm dwójkowy z liczby 4 to 2, z liczby 8 to 3 a z liczby 1024 to 10.
Ćwiczenie. Oblicz logarytm dwójkowy z liczb 537 i 65536.
Logarytm z miliona równy jest około 20. Wstawienie, usunięcie elementu do kopca o milionie elementów zajmuje tylko 20 operacji. Znalezienie najmniejszego elementu to tylko jedna operacja. Gdyby nasze dane nie były w żaden sposób uporządkowane musielibyśmy przeszukać całą tablicę, wykonując 1000000 operacji. To istotna różnica!
Budowę kopca omówimy na tablicy. Tu tylko dla utrwalenia zapisuję niezmiennik kopca:
t[i] < t[2*i] && t[i] < t[2*i+1]
Elementy kopca numerujemy od '1'. Lewy i prawy syn elementu 'i' ma numer '2i' i '2i+1', zaś ojciec elementu o numerze 'i' ma numer 'i/2' (dzielenie całkowite, z zaokrągleniem w dół).
Zadanie. Zaimplementuj kopiec. Napisz program wczytujący liczbę 'n' a następnie n liczb i wyświetlający najmniejszą z nich. Program powinien do tego wykorzystać strukturę kopca.
Zadanie. Jak wyżej, ale program powinien wypisać liczby od najmniejszej do największej.
Zmierz czas działania tak napisanego programu sortującego i porównaj go z czasem działania sortowania bąbelkowego i przez wybór.
W najbliższy wtorek zaczynają się potyczki algorytmiczne. Z regulaminu:
Uczniowie szkół ponadgimnazjalnych, gimnazjów i szkół podstawowych mogą przystąpić do konkursu w dwu- lub >trzyosobowej drużynie. Przepisy dotyczące uczestników konkursu odnoszą się do wszystkich członków drużyn.
Zachęcam do rejestracji i zmierzenia się z zadaniami. Dziś omówimy dwa zadania z potyczek z zeszłych lat
i spróbujemy zaimplementować rozwiązania.
Zapraszam też na jutrzejsze "Warsztaty myślenia problemowego", które odbędą się na Wydziale Matematyki, Informatyki i Mechaniki UW o godz. 10 w sali 3180.
Kto nie napisał sortowania bąbelkowego lub przez wybieranie zgłasza się! (Poza Biedronkami.)
-
Zapoznaj się z artykułem o losowaniu liczb i wykonaj ćwiczenia.
-
W katalogu
podstawy/losowanie
znajdziesz programgenerator.cpp
. Służy on do generowania długich ciągów liczb losowych. Przykład użycia:
$ cd podstawy/losowanie
$ g++ generator.cpp -o generator
$ ./generator 1000
Ostatnie polecenie generuje ciąg 1000 liczb z przedziału od zera do miliarda.
-
Zmodyfikuj swoje algorytmy sortowania tak, by sortowały
n
liczb, gdzien
jest liczbą podaną jako pierwsza na wejściu. -
Za pomocą generatora ciągów losowych będziesz mógł przetestować swoje algorytmy sortowania. Przejdź do swojego podkatalogu w katalogu
zajecia
, skompiluj sortowanie bąbelkowe
$ g++ bubble_sort.cpp -o bubble_sort
i wykonaj polecenie
$ time ../../podstawy/losowanie/generator 10 | ./bubble_sort
Po wykonaniu tego polecenia powinien zostać wyświetlony ciąg dziesięciu posortowanych liczb a następnie czas wykonania programu.
Sprawdź działanie instrukcji
$ time ../../podstawy/losowanie/generator 100 | ./bubble_sort
$ time ../../podstawy/losowanie/generator 1000 | ./bubble_sort
$ time ../../podstawy/losowanie/generator 10000 | ./bubble_sort
Przy coraz większych danych wyjściowych istotny stanie się czas wypisywania wyniku na terminalu. Wyświetlanie można wyłączyć wpisując
$ time ../../podstawy/losowanie/generator 100 | ./bubble_sort > /dev/null
$ time ../../podstawy/losowanie/generator 1000 | ./bubble_sort > /dev/null
$ time ../../podstawy/losowanie/generator 10000 | ./bubble_sort > /dev/null
Jakie są Twoje czasy? Jakie czasy osiąga selection_sort? Sprawdź!
Algorytm omówimy na zajęciach. Do jego testowania i porównania z np. sortowaniem bąbelkowym użyjesz ciągu generowanego poleceniem
$ ../../podstawy/losowanie/generator 100000 1000000
Ciąg ten zawiera 100000 liczb z przedziału od 0 do 999999.
Dzisiaj waszym celem będzie zaprojektowanie witrażu i napisanie programu, który go wyświetla. Dwie inspiracje:
Zacznijcie od aktualizacji repozytorium
$ cd kinf/
$ git pull
Sprawdzenia, czy ustawiony jest prawidłowy adres email
$ git config user.email
Przejścia do katalogu allegro5/primitives
$ cd allegro5/primitives
Skompilowania przykładowego programu
$ make
I uruchomienia go
$ ./primitives
(wychodzi się klawiszem Escape). Następnie skopiujcie ten program do swojego katalogu.
$ cd ../../zajecia/nazwatwojegokatalogu
$ cp ../../allegro5/primitives/primitves.cpp .
(klawisz Tab może być przydatny. Dlaczego?)
I zacznijcie czytać kod.
$ gedit primitives.cpp &
Po zrozumieniu kodu (omówimy go też wspólnie) zaprojektujcie własny witraż i napiszcie program, który go wyświetla. Opis wszystkich dostępnych funkcji znajdziecie tutaj. Powodzenia!
Krótki przegląd tabeli wyników pokazuje, że dziś i przez najbliższy tydzień zajmować się będziemy uzupełnianiem zaległości.
Tytułowe sortowanie kubełkowe i sortowanie napisów przeniesione niniejszym zostaje o x kółek, gdzie x to liczba tygodni, które spędzimy łatając dziury w wykonanych zadaniach.
Dziś zaczniemy od zaliczeń - każdy robi dokładny przegląd swoich programów i zaznacza długopisem w tabeli zadania rozwiązane bądź zgłoszone do oceny.
Proszę zerknąć do listy tematów, które trzeba zgłębić, by zostać początkującym adeptem informatyki!
Biedronki zaczynają od ćwiczeń z git-a, potem zmienne i wyrażenia.
Niedokońcapoważne prezentacje:
Sortowanie bąbelkowe (bubble sort)
Sortowanie przez wybieranie (selection sort)
Sortowanie bąbelkowe vs sortowanie szybkie (quick sort)
Dziś na zajęciach postaramy się wykonać ćwiczenia z sortowania. Przypominam o zaległych zadaniach z zeszłych zajęć.
Napisz program, który wypisuje na ekranie kolejne wiersze trójkąta Pascala oraz zrób pozostałe ćwiczenia z sortowania.
Przykładowy wynik działania programu:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
Temat pętle, do zrobienia są wszystkie ćwiczenia.
-
Omówimy działanie programu z katalogu allegro5/plansza2d/
-
Na rozgrzewkę zadania Postać piły i Haft z II etapu OIG.
-
Następnie zajmiemy się projektem Mrówka Langtona.
-
Starszaki - pętle
-
Młodsi - uczymy się korzystać z github-a, poruszać w terminalu, kompilować i uruchamiać najprostsze programy a następnie piszemy pierwsze programy
Już jutro II etap OIG. Z tego względu powalczymy dziś z zadaniami olimpijskimi. Grupa przedszkolna zajmuje się ćwiczeniami z instrukcji warunkowej.
Grupa początkująca walczy z zadaniami
Z grupą zaawansowaną omówimy zadania z zeszłego tygodnia i zadania z konkursu
(potraktujcie go jako trening). Rozwiązania zadań tradycyjnie umieszczamy w repozytorium. Powodzenia!
Na rozgrzewkę zrobimy zadanie choinka. Rozwiązanie wysyłacie do oceny na stronę OIG oraz zamieszczacie w repozytorium, 15 minut powinno wystarczyć.
Następnie projekt gra w życie (do kontynuacji w domu). Uwaga: przed przystąpieniem do tego projektu musisz mieć skończone zadanie wzory (patterns.cpp).
Do domu: even Fibonacci numbers, figury szachowe, zapałki, czas wycieczki.
Trening - archiwum zadań 2012/2013 / SKN / SKN 130119 G4. Powinniście dać sobie radę ze wszystkimi zadaniami w 60 minut. Pod koniec zajęć omówimy rozwiązania.
Już za tydzień II etap Olimpiady Informatycznej.
Wyniki konkursu sprzed tygodnia pozostawiam bez komentarza:
Zadania domowe:
-
(sobota) zadania piramida liczbowa, szachownica oraz odejmowanie.
-
(poniedziałek) drzewo, gra w czynniki.
-
(wtorek) imieninowy zbiór - napisz algorytm brute-force, sprawdzający wszystkie przypadki. Za pomocą operacji na bitach i odpowiedniego kodowania danych można szybko sprawdzić, czy w konkretnym zbiorze liczb wszystkie pary są względnie pierwsze.
-
(środa) prezenty
-
(czwartek) lampki
Rozwiązania proszę weryfikować w serwisie OIG oraz zamieszczać w repozytorium.
-
Grupa zaawansowana: konkurs. Do domu pozostałe ćwiczenia z funkcji, slogany i zaległości.
-
Grupa początkująca: zadanie wzory. Do domu multiplies of 3 and 5 oraz kwadraty i sześciany i zaległości.
- Grupa zaawansowana: po uzupełnieniu zaległości zabieramy się za algorytm Euklidesa (ćwiczenia proszę wykonać na kartce). Następnie zapoznamy się ze strukturami.
Zadania domowe: przyciski.cpp, pieczatki.cpp (wskazówki do zadań znajdziesz w kąciku olimpijskim).
- Grupa początkująca: uzupełniamy zaległości. Jeżeli masz zaliczone lub właśnie zaliczyłeś zaległe zadania, to pomóż innym (zwłaszcza w obsłudze git-a).
Zadania domowe (do "nadgryzienia" na zajęciach): Choinka2 (choinka2.cpp), Kasztany (kasztany.cpp). Rozwiązania zadań należy umieścić w plikach choinka2.cpp i kasztany.cpp w swoim katalogu oraz wysłać do oceny w serwisie main.
-
Grupa zaawansowana: funkcje i ćwiczenia 1-5 z funkcji oraz Kącik Olimpijski.
-
Grupa początkująca: jeżeli nie umieściłeś jeszcze w repozytorium swojego rozwiązania zadania WERSALIKI, zrób to teraz (w katalogu zajecia/(Twój login)/).
Pomocą służy strona jak używać git-a? z naszego wiki.
- Rozwiążemy zadanie uʍop ǝpısdn.
Kod źródłowy rozwiązania umieść w repozytorium w odpowiednim katalogu.
-
Zadanie dysleksja z konkursu "Potyczki Algorytmiczne".
-
Jeżeli sprawnie uwiniemy się z powyższymi zadaniami, to pokażę Wam zastosowanie tablic dwuwymiarowych (Allegro 5) - zadanie arena.
-
Code review: https://github.com/anagorko/kinf/blob/master/allegro4/sokoban/sokoban.cpp.
-
Zaglądamy do Księgi kucharskiej i odpowiadamy na nagromadzone tam pytania. W szczególności na to, gdzie zapisywać rozwiązania zadań.
-
Grupa zaawansowana zabiera się za Kącik Olimpijski.
-
Z grupą początkującą rozwiązujemy zadanie WERSALIKI (na tablicy), następnie w parach implementujecie ostatnie z rozwiązań (tablice translacji).
Ćwiczenia z tablic jednowymiarowych.
Ćwiczenia Inicjalizacja, Na wspak, Parzyste przodem z tablic jednowymiarowych.
© 2013-15 Kółko Informatyczne Szkoły Żagle. Licencja Creative Commons-BY-NC-SA.