← Lekcje
Python · lekcja 25

Porządkujemy dane i szukamy

Sortowanie liczb i wyszukiwanie, część 2 z 3

  1. Czym jest sortowanie i według jakiego kryterium porządkujemy dane?
  2. Porządek wokół nas: kod pocztowy i numery domów
  3. Wyszukiwanie sekwencyjne: sprawdzamy komórkę po komórce
  4. Wyszukiwanie binarne: w każdej próbie odrzucamy połowę zbioru

Podręcznik: s. 133–139.

Rozgrzewka · 3 minuty

Największa liczba i wartownik

Wracamy do programu „Najdłuższy skok” z poprzedniej lekcji.

  1. Program wczytuje kolejne długości skoków. Po czym poznaje, że dane się skończyły?
  2. Zmienna biggest zaczyna od zera. Co się z nią dzieje po wczytaniu każdej liczby?
  3. Do czego służyła tabela śledzenia, którą wypełnialiście na kartce?
podręcznik s. 128–132
Część 1 · Sortowanie

Sortowanie to ustawianie według kryterium

Sortowanie danych, zwane też porządkowaniem danych, to ustawianie danych w zadanej kolejności, według określonego kryterium. Tak samo działa segregator w szafie: same kartki się nie zmieniają, zmienia się ich kolejność.

Liczby rosnąco 2003 2147 2290 2435 2589 2741 Wyrazy alfabetycznie butelka długopis klucze kubek kurtka laptop Daty chronologicznie 01.01.2001 15.03.2005 22.07.2010 09.09.2012 30.04.2015 18.08.2017
Podręcznik Informatyka na czasie 2, s. 133 (9.2 Do czego służy sortowanie danych?, definicja sortowania, rys. 9.3)
Część 1 · Kryterium

Według czego porządkujemy?

Tabliczka przystankowa: kierunki alfabetycznie, godziny w każdym kierunku chronologicznie.

KierunekGodziny odjazdu
BOGUMIŁOWICE14:50
ŁÓDŹ6:58 · 12:08 · 17:03
PAJĘCZNO09:20
RADOMSKO05:11 · 07:01 · 08:15 · 14:35

Pięciobój nowoczesny: kolejność wyznacza suma punktów, od największej do najmniejszej.

Lp.ZawodniczkaSuma
1Michelle Gulyas1461
2Élodie Clouvel1452
3Seungmin Seol1441
4Blanka Guzi1433

Kryterium wybiera człowiek: w pływaniu wygrywa najkrótszy czas, więc tam porządek jest odwrotny niż w sumie punktów.

Podręcznik Informatyka na czasie 2, s. 133 (rys. 9.4, tabliczka przystankowa, godziny bez skrótów kursowania, których książka nie rozwija) i s. 136 (tabela 9.2, pierwsze cztery z dziesięciu zawodniczek, ćwiczenie 4)
Część 1 · Porządek wokół nas

Kod pocztowy i numer domu

W obu przykładach numer nie jest przypadkowy: koduje położenie. Dlatego list trafia do właściwej placówki, a nowy listonosz znajduje dom, którego nigdy wcześniej nie widział.

Kod pocztowy Wąbrzeźno 87 - 200 okręg i strefa kodowa sektor kodowy i placówka pocztowa list wędruje najpierw do strefy, potem do placówki Numeracja domów numery rosną od centrum ku krańcom nieparzyste parzyste 1 2 3 4 5 6 7 8
Podręcznik Informatyka na czasie 2, s. 134–135 (infografika „Porządek wokół nas”, bloki „Kody pocztowe” i „Numeracja domów”)
Część 2 · Po co to komputerowi

Gdzie komputer porządkuje dane?

Sortowanie to jedna z operacji najczęściej wykonywanych przez komputery.

Sortowanie przydaje się też przy usuwaniu duplikatów, sprawdzaniu, czy wszystkie wartości są różne, i przy szukaniu dwóch wartości o najmniejszej różnicy.

Podręcznik Informatyka na czasie 2, s. 137 (9.2 Do czego służy sortowanie danych?, „Sortowanie danych w komputerze”, ramka „Warto wiedzieć” z marginesu)
Część 2 · Wyszukiwanie sekwencyjne

Znasz adres czy szukasz po kolei?

Dane leżą w pamięci operacyjnej (RAM, ang. random access memory, pamięć o dostępie swobodnym) jako ciąg komórek ponumerowanych kolejnymi liczbami. Gdy procesor zna numer komórki, sięga do niej wprost. Gdy zbiór jest nieuporządkowany, zostaje wyszukiwanie sekwencyjne, czyli przeglądanie komórek w kolejności zapisu, tak jak szuka się kluczy po kolei w każdej kieszeni.

Znasz adres: procesor sięga wprost 0 1 2 3 4 5 6 7 8 9 indeks 6 Nie znasz: sprawdzasz po kolei, aż trafisz na 6 3 0 0 1 1 2 8 3 7 4 2 5 5 6 4 7 6 8 9 9
Podręcznik Informatyka na czasie 2, s. 137–138 (9.3 Sortowanie a wyszukiwanie, rys. 9.7 dostęp bezpośredni i rys. 9.8 wyszukiwanie sekwencyjne)
Część 2 · Wyszukiwanie binarne

Wyszukiwanie binarne: dzielimy zbiór na pół

Gdy dane są uporządkowane, sprawdzamy środkową komórkę i odrzucamy tę połowę, w której szukanej liczby na pewno nie ma. To wyszukiwanie binarne, zwane też połówkowym, dokładnie jak w zgadywance, gdzie po każdej odpowiedzi „za dużo” albo „za mało” odpada połowa liczb.

30 0 32 1 43 2 45 3 49 4 51 5 53 6 57 7 59 8 61 9 63 10 68 11 69 12 70 13 73 14 78 15 81 16 85 17 86 18 89 19 91 20 98 21 99 22 1 2 3 szukamy liczby 59

Po każdej próbie zostaje mniejszy zbiór i dokładnie to samo zadanie, czyli podproblem tej samej postaci. W podstawie programowej ta technika nazywa się metodą połowienia. Dlatego ten program da się zapisać także rekurencyjnie: sprawdź środek, a z połową, która została, zrób to samo.

Hasła w słowniku szukacie podobnie, choć nie tak samo: nie otwieracie go dokładnie w połowie, tylko zgadujecie stronę po pierwszej literze. To wyszukiwanie interpolacyjne.

Podręcznik Informatyka na czasie 2, s. 138–139 (9.3 Sortowanie a wyszukiwanie, rys. 9.9 wyszukiwanie binarne liczby 59 w zbiorze 23 elementów) i s. 135 (ramka o wyszukiwaniu interpolacyjnym, rys. 9.5 indeks podręcznika) · nazwa „metoda połowienia” i zapis rekurencyjny: podstawa programowa informatyki, komentarz ORE 2018, PP-INF I.3 (zakres podstawowy)
Część 2 · Trzy próby

Trzy sprawdzenia zamiast dziewięciu

  1. Środek zbioru to indeks 11, jest tam liczba 68. To więcej niż 59, więc komórki o indeksach większych od 11 odpadają.
  2. Środek reszty to indeks 5, jest tam 51. To mniej niż 59, więc szukamy w komórkach o indeksach od 6 do 10.
  3. Trzecia próba to indeks 8. Tam leży liczba 59, koniec.

Środek liczymy tak: lewy plus prawy, dzielone przez 2, bez reszty. Po kolei byłoby 9 sprawdzeń.

Ciekawostka: to wygląda prosto, ale łatwo napisać taki program źle. Jon Bentley dał wyszukiwanie binarne jako zadanie zawodowym programistom i dziewięciu na dziesięciu nie oddało poprawnego rozwiązania: ich programy myliły się w skrajnych przypadkach.

Podręcznik Informatyka na czasie 2, s. 139 (ramka „Warto wiedzieć” z opisem trzech prób wyszukiwania liczby 59) · ciekawostka: en.wikipedia.org/wiki/Binary_search (sekcja „Implementation issues”)
Ćwiczenie · na kartce · 12 minut

Ćwiczenie: szukamy w piętnastu liczbach

  1. Podpisz kartkę i przepisz ciąg z prawej razem z indeksami. Jest uporządkowany rosnąco.
  2. Znajdź w nim liczbę 72 metodą binarną. Dla każdej próby zapisz lewy, prawy, środek, wartość i decyzję.
  3. Policz, ile sprawdzeń zajęła metoda binarna, a ile zajęłoby sprawdzanie po kolei od indeksu 0.
indeks   0  1  2  3  4  5  6  7
wartość  4  7 12 15 21 26 33 38
indeks   8  9 10 11 12 13 14
wartość 44 50 57 61 68 72 80

Lewy | Prawy | Środek | Wartość | Decyzja

Dla chętnych (dom): zapisz indeksy i wartości kolejno sprawdzanych komórek przy szukaniu liczby 80 w zbiorze z rys. 9.9.

Podręcznik Informatyka na czasie 2, s. 139 (ćwiczenie 5, wersja domowa)
Część 2 · Pytania kontrolne

Trzy pytania na koniec

  1. Dlaczego wyszukiwania binarnego nie da się użyć w zbiorze nieuporządkowanym?
  2. Liczba ze środka zbioru okazała się większa od szukanej. Co robimy z prawą połową i dlaczego?
  3. Czym różni się wyszukiwanie interpolacyjne od binarnego?
Podręcznik Informatyka na czasie 2, s. 135, 138–139 (9.3 Sortowanie a wyszukiwanie, wyszukiwanie sekwencyjne, binarne i interpolacyjne)
Część 2 · Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Wyszukiwanie binarne liczone ręcznieW Pythonie jest gotowy moduł bisect, który utrzymuje listę w kolejności i znajduje miejsce wartości metodą połowienia.narzędzia
Sprawdzanie komórek po koleiBaza danych bez indeksu czyta całą tabelę wiersz po wierszu. Indeks zakłada się po to, żeby serwer trafiał od razu we właściwe miejsce.rozszerzane
Zbiór trzeba najpierw uporządkowaćWyszukiwarki internetowe indeksują strony, zanim ktokolwiek wpisze zapytanie. Bez tego wynik nie pojawiłby się w ułamku sekundy.nadal w użyciu
Kryterium sortowania wybiera człowiekW kwerendzie z rozdziału o bazach danych to samo robi się jednym poleceniem: wskazuje się pole i kierunek porządkowania.nadal w użyciu
bisect: docs.python.org/3/library/bisect.html · zastosowania sortowania w wyszukiwarkach: podręcznik s. 137