Wyszukiwanie liniowe

Przypomnijmy sobie najważniejsze informacje dotyczące algorytmu wyszukiwania liniowego.

Polega on na sprawdzaniu, czy kolejne elementy zbioru są szukaną liczbą. Możemy wyróżnić najprostszą wersję algorytmu oraz jego modyfikację – algorytm wyszukiwania liniowego wartownikiemwartownikwartownikiem.

Specyfikacja problemu:

Dane:

  • n – liczba naturalna; liczba elementów w tablicy tablica

  • tablican-elementowa tablica liczb naturalnych

  • szukana – liczba naturalna

Wynik:

  • komunikat wskazujący indeks, pod którym znajduje się szukana liczba lub informujący, że w tablicy nie ma szukanej liczby

Wyszukiwanie liniowe bez wartownika

Zapiszmy nagłówek funkcji. Przyjmuje ona trzy argumenty – tablicę liczb, szukany element oraz liczbę elementów tablicy.

Na początku przypisujemy dwóm zmiennym pomocniczym odpowiednie wartości. Zmiennej znaleziono przypisujemy wartość fałsz, a zmiennej i wartość 0.

W kolejnym kroku zapisujemy pętlę dopóki. Będzie się ona wykonywać tak długo, jak długo będą spełnione dwa warunki – zmienna znaleziono będzie przechowywać wartość logiczną fałsz oraz wartość zmiennej i będzie mniejsza od długości tablicy, czyli wartości zmiennej n.

W pętli zapisujemy warunek logiczny jeżeli. Będziemy sprawdzać, czy wartość i-tego elementu tablicy jest równa szukanej liczbie  – jeżeli tak, wypiszemy odpowiedni komunikat, przypiszemy zmiennej znaleziono wartość prawda i zakończymy działanie algorytmu; jeżeli nie, zwiększymy wartość zmiennej i o 1.

W sytuacji, gdy po wyjściu z pętli dopóki wartością zmiennej znaleziono będzie fałsz, wypiszemy komunikat, że szukana liczba nie została znaleziona.

Linia 1. funkcja wyszukiwanie podkreślnik liniowe otwórz nawias okrągły tablica przecinek szukana przecinek n zamknij nawias okrągły. Linia 2. znaleziono ← fałsz. Linia 3. i ← 0. Linia 4. dopóki znaleziono wykrzyknik znak równości prawda oraz i otwórz nawias ostrokątny n wykonuj dwukropek. Linia 5. jeżeli tablica otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości szukana. Linia 6. wypisz cudzysłów Znaleziono liczbę na pozycji cudzysłów plus i. Linia 7. znaleziono ← prawda. Linia 8. zakończ działanie pętli. Linia 9. i ← i plus 1. Linia 11. jeśli znaleziono znak równości fałsz. Linia 12. wypisz cudzysłów Nie znaleziono szukanej liczby cudzysłów.

Operacjami, które najbardziej wpływają na złożoność tego algorytmu, są operacje porównania (wykonujące się w pętli dopóki). Dla n liczb może się ich wykonać, zależnie od ułożenia danych, od 1 do n, ponieważ w najgorszym wypadku musimy sprawdzić wszystkie liczby. Zatem złożoność czasowa tego algorytmu to On.

Wyszukiwanie liniowe z wartownikiem

Wartownik dodajemy na początku lub na końcu tablicy. Zależnie od implementacji może to być zarówno liczba, która nie występuje w tablicy, jak i wartość szukana.

Przedstawimy wersję, w której wartownik jest szukaną liczbą. Umieścimy go na końcu tablicy.

Zapiszmy nagłówek funkcji. Ponownie przyjmuje ona trzy argumenty – tablicę liczb, szukany element oraz liczbę elementów tablicy.

Na początku umieszczamy wartownik na końcu tablicy, a zmiennej pomocniczej i przypisujemy wartość 0.

W kolejnym kroku zapisujemy pętlę dopóki. Będzie się wykonywać tak długo, jak długo wartość i-tego elementu tablicy będzie różna od szukanej liczby.

W każdej iteracji pętli będziemy zwiększać wartość zmiennej pomocniczej o 1.

Zapisujemy warunek logiczny jeżeli. Będziemy sprawdzać, czy wartość zmiennej jest mniejsza od różnicy długości tablicy oraz liczby 1. Jeśli tak, wypiszemy odpowiedni komunikat mówiący o tym, że szukana liczba została znaleziona pod indeksem równym i. W przeciwnym wypadku wypiszemy komunikat mówiący o tym, że szukana liczba nie została znaleziona.

Linia 1. funkcja wyszukiwanie podkreślnik liniowe podkreślnik wartownik otwórz nawias okrągły tablica przecinek szukana przecinek n zamknij nawias okrągły. Linia 2. tablica otwórz nawias kwadratowy n zamknij nawias kwadratowy ← szukana. Linia 3. i ← 0. Linia 5. dopóki tablica otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości szukana wykonuj dwukropek. Linia 6. i ← i plus 1. Linia 8. jeśli i otwórz nawias ostrokątny n minus 1 dwukropek. Linia 9. wypisz cudzysłów Znaleziono liczbę na pozycji cudzysłów plus i. Linia 10. w przeciwnym przypadku dwukropek. Linia 11. wypisz cudzysłów Nie znaleziono szukanej liczby cudzysłów.

Ponownie operacjami, które najbardziej wpływają na złożoność tego algorytmu, są operacje porównania (wykonujące się w pętli dopóki). Może się ich wykonać, zależnie od ułożenia danych, od 1 do n. Zatem złożoność czasowa tego algorytmu to również On. Zwróćmy jednak na to, że poprzez dodanie wartownika wyeliminowaliśmy konieczność sprawdzania przy każdym kolejnym elemencie, czy nie przekroczyliśmy rozmiaru tablicy – zredukowaliśmy zatem liczbę instrukcji.

Polecenie 1

Porównaj ze sobą dwie implementacje. Jakie dostrzegasz różnice? Czy potrafisz wskazać korzyści związane z wykorzystaniem wartownika?

Wyszukiwanie binarne

Specyfikacja problemu:

Dane:

  • n – liczba naturalna; liczba elementów tablicy tablica

  • tablican-elementowa tablica liczb naturalnych

  • szukana – liczba naturalna

Wynik:

  • komunikat wskazujący indeks, pod którym znajduje się szukana liczba, lub informujący, że w tablicy nie ma szukanej liczby

Algorytm wyszukiwania binarnego wyszukuje wybrany element w posortowanym w zbiorze. W e‑materiale Rozwiązywanie problemów informatycznych – strategia „dziel i zwyciężaj”Pv0IXD75RRozwiązywanie problemów informatycznych – strategia „dziel i zwyciężaj” przedstawiliśmy jego wersję rekurencyjną.

W tym e‑materiale skupimy się na jego iteracyjnej wersji.

Zasada działania algorytmu nie zmienia się. Algorytm nie wywołuje się rekurencyjnie, wykorzystujemy natomiast pętlę dopóki.

Zapisujemy nagłówek funkcji wyszukiwanie_binarne_iter. Przyjmie ona cztery argumenty – tablicę liczb, szukaną wartość, indeks początku oraz indeks końca.

W kolejnym kroku określimy środek analizowanego przedziału, przypisując zmiennej środek wartość dzielenia całkowitego sumy wartości zmiennych pocz oraz kon przez liczbę 2.

Następnie zapiszemy instrukcję warunkową jeżeli. Sprawdzamy, czy szukana liczba jest równa wartości elementu tablicy o indeksie równym wartości zmiennej środek. Jeśli tak, wypisujemy odpowiedni komunikat.

Jeśli element nie jest równy elementowi przechowywanemu pod indeksem środek, sprawdzamy, czy jest on od niego mniejszy. Jeśli tak, zmieniamy wartość zmiennej pocz, przypisując jej wartość sumy zmiennej środek oraz liczby 1.

Jeżeli element jest mniejszy, przypisujemy zmiennej kon wartość różnicy zmiennej środek oraz liczby 1.

Jeśli po wyjściu z pętli dopóki element nie został znaleziony, wypisujemy odpowiedni komunikat.

Linia 1. funkcja wyszukiwanie podkreślnik binarne podkreślnik iter otwórz nawias okrągły tablica przecinek szukana przecinek pocz przecinek kon zamknij nawias okrągły dwukropek. Linia 2. dopóki pocz otwórz nawias ostrokątny znak równości kon dwukropek. Linia 3. środek ← otwórz nawias okrągły pocz plus kon zamknij nawias okrągły div 2. Linia 4. jeżeli tablica otwórz nawias kwadratowy środek zamknij nawias kwadratowy znak równości szukana dwukropek. Linia 5. wypisz cudzysłów Znaleziono liczbę na pozycji cudzysłów plus środek. Linia 6. zwróć środek. Linia 7. w przeciwnym wypadku jeżeli tablica otwórz nawias kwadratowy środek zamknij nawias kwadratowy otwórz nawias ostrokątny szukana dwukropek. Linia 8. pocz znak równości środek plus 1. Linia 9. w przeciwnym wypadku dwukropek. Linia 10. kon znak równości środek minus 1. Linia 12. wypisz cudzysłów Nie znaleziono szukanej liczby cudzysłów.
Ważne!

W rozwiązaniu wykorzystujemy operator div. Operator div oznacza dzielenie całkowitoliczbowe.

Algorytm wyszukiwania binarnego działa przez podział zakresu wyszukiwania na dwie równe części i wybór tej, która zawiera szukaną wartość (lub może ją zawierać). Dzięki temu zakres wyszukiwania jest dzielony na pół w każdej iteracji. W konsekwencji każdy podział sprowadzi problem do problemu o połowę mniejszego.

W związku z tym, jeżeli mamy tablicę o długości , to w najgorszym wypadku potrzebujemy Ologn podziałów, aby zawęzić zakres wyszukiwania do jednego elementu. Stąd złożoność czasowa wynosi Ologn.

Lider w zbiorze

Czym jest liderliderlider? Określamy tak liczbę, która występuje w zbiorze n-elementowym więcej niż n2 razy. Ponieważ jedna liczba nie może występować w tym samym zbiorze liczbowym więcej niż n2 razy, lider jest tylko jeden.

Na przykład w zbiorze {1, 4, 6, 1, 1} lider to liczba 1, ponieważ występuje w nim aż 3 razy.

n2=52=2,53>2,5

Natomiast w zbiorze {8, 6, 4, 5, 2, 2} żadna z sześciu liczb nie jest liderem, choć liczba 2 występuje więcej razy niż pozostałe.

Zbiory, które mają lidera, posiadają bardzo ważną właściwość: jeżeli z takiego zbioru usuniemy parę różnych liczb, zbiór ten nadal będzie miał tego samego lidera.

Rozważmy dwa przypadki.

Pierwszy dotyczy usunięcia pary liczb, z której żadna nie jest liderem. Ze zbioru {1, 4, 6, 1, 1} usuwamy liczby 4 oraz 6 i zostajemy z podzbiorem {1, 1, 1}. Ponieważ zbiór ten składa się tylko z jedynek, bardzo łatwo stwierdzić, że lider tego zbioru nie zmienił się i nadal jest nim liczba 1.

W drugim przypadku usuniemy jedną liczbę, która nie jest liderem, i jedną, która nim jest – czyli usuniemy liczby 4 oraz 1. Zostajemy wtedy ze zbiorem {1, 6, 1}, którego liderem nadal jest liczba 1. Ponieważ para, która zostaje wyeliminowana, nie może składać się z tych samych liczb, przypadek, w którym usunięte zostaną dwie liczby lidera, nie zaistnieje.

Ciekawostka

Liderem w zbiorze będzie zwycięzca pierwszej tury polskich wyborów prezydenckich. Więcej na temat sposobu wybierania prezydenta znajdziesz w e‑materiałach z Wiedzy o społeczeństwie, np. w e‑materiale Głowa państwaPn14yv1EwGłowa państwa.

Algorytm wyboru lidera

Specyfikacja problemu:

Dane:

  • n – liczba naturalna; liczba elementów zbioru zbiór

  • zbior – zbiór liczb naturalnych

Wynik:

  • komunikat wskazujący lidera zbioru lub informujący, że zbiór nie ma lidera

Przykład będzie bazował na zbiorze trzyelementowym, ponieważ łatwiej będzie na nim wskazać pewne zależności.

Wykorzystamy poznaną zależność.

Załóżmy, że pierwsza liczba ze zbioru jest liderem, oraz stwórzmy zmienną, która będzie liczyć wystąpienia lidera. Nazwijmy ją licznik. Skoro zakładamy, że pierwsza liczba jest liderem, zmienną licznik inicjalizujemy wartością 1, ponieważ jedno wystąpienie potencjalnego lidera już nastąpiło. Dodajemy również zmienną, która będzie przechowywała liczbę elementów zbioru.

W pseudokodzie będzie to wyglądało następująco:

Linia 1. zbior ← otwórz nawias klamrowy 1 przecinek 3 przecinek 1 zamknij nawias klamrowy. Linia 2. lider ← zbior otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. licznik ← 1. Linia 4. n ← 3.

Następnym krokiem będzie iteracja przez cały zbiór. Ponieważ zakładamy, że pierwszy element zbioru jest liderem, i został on już uwzględniony w zmiennej licznik, możemy go pominąć w pętli i zainicjować zmienną sterującą wartością 1.

Linia 1. zbior ← otwórz nawias klamrowy 1 przecinek 3 przecinek 1 zamknij nawias klamrowy. Linia 2. lider ← zbior otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. licznik ← 1. Linia 4. n ← 3. Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka n minus 1 wykonuj.

Naszym celem jest eliminacja par liczb, które nie są takie same. W konsekwencji, jeżeli kolejny element zbioru nie jest taki sam jak dotychczasowy lider (czyli poprzedni element), zmniejszymy wartość zmiennej licznik o jeden. W kolejnej iteracji sprawdzimy, czy zmienna licznik ma wartość 0. Jeżeli warunek jest prawdziwy, przesuniemy lidera na miejsce sprawdzanego elementu, ponieważ oznacza to, że para, która została sprawdzona, zawierała dwie różne liczby – może zatem zostać pominięta. Zobaczmy, jak będzie to wyglądać w pseudokodzie, a następnie przetestujmy działanie tej części algorytmu na przykładzie:

Linia 1. zbior ← otwórz nawias klamrowy 1 przecinek 3 przecinek 1 zamknij nawias klamrowy. Linia 2. lider ← zbior otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. licznik ← 1. Linia 4. n ← 3. Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka n minus 1 wykonuj. Linia 7. jeżeli licznik zamknij nawias ostrokątny 0 to. Linia 8. jeżeli lider ← zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 9. licznik ← licznik plus 1. Linia 10. w przeciwnym wypadku. Linia 11. licznik ← licznik minus 1. Linia 12. w przeciwnym wypadku. Linia 13. lider ← zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 14. licznik ← 1.

Dla przykładu rozważmy zbiór {1, 3, 1, 3, 1, 3, 1}, w którym liderem jest 1, i przeanalizujmy działanie algorytmu.

Linia 1. zbior ← otwórz nawias klamrowy 1 przecinek 3 przecinek 1 przecinek 3 przecinek 1 przecinek 3 przecinek 1 zamknij nawias klamrowy. Linia 2. lider ← 1. Linia 3. licznik ← 1. Linia 4. n ← 3.

Wchodzimy w pętlę for, zmienna sterująca i otrzymuje wartość 1. Zmienna licznik ma wartość 1, więc jest większa niż 0.

Czy lider jest równy zbior[i]? Podstawmy wartości i sprawdźmy.

Po podstawieniu wartości wiemy, że wartości tych zmiennych nie są sobie równe.

Odejmujemy od zmiennej sterującej 1 i przechodzimy do kolejnej iteracji. Zmienna licznik jest równa 0, więc przenosimy lidera do zbior[2] czyli 1, a zmiennej licznik przypisujemy wartość 1. Dzięki temu pierwsza para (1, 3) zostaje usunięta, ponieważ liczby w tej parze nie są takie same.

Co się jednak dzieje, gdy para zawiera te same liczby? Ponieważ liczba powtórzyła się, zostaje kandydatem na lidera. Zwiększamy więc wartość zmiennej licznik, która liczy liczbę wystąpień potencjalnego lidera.

W rezultacie działania pętli otrzymamy potencjalnego lidera oraz zmienną licznik. Jeżeli wartość zmiennej licznik wynosi 0, badany zbiór nie ma lidera. Aby mieć pewność, że potencjalny lider jest faktycznie liderem, policzymy liczbę jego wystąpień w zbiorze i sprawdzimy, czy liczba ta jest większa niż długość zbioru podzielona na 2. Dodajmy te zmiany do algorytmu:

Linia 1. zbior ← otwórz nawias klamrowy 1 przecinek 3 przecinek 1 zamknij nawias klamrowy. Linia 2. lider ← zbior otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. licznik ← 1. Linia 4. n ← 3. Linia 6. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka n minus 1 wykonuj. Linia 7. jeżeli licznik zamknij nawias ostrokątny 0 to. Linia 8. jeżeli lider znak równości zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 9. licznik ← licznik plus 1. Linia 10. w przeciwnym wypadku. Linia 11. licznik ← licznik minus 1. Linia 12. w przeciwnym wypadku. Linia 13. lider ← zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 14. licznik ← 1. Linia 16. jeżeli licznik znak równości 0 to. Linia 17. wypisz cudzysłów Zbiór nie ma lidera cudzysłów. Linia 18. zakończ działanie programu. Linia 20. liczba podkreślnik wystapien podkreślnik lidera ← 0. Linia 21. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka n minus 1 wykonuj. Linia 22. jeżeli zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości lider to. Linia 23. liczba podkreślnik wystapien podkreślnik lidera znak równości liczba podkreślnik wystapien podkreślnik lidera plus 1. Linia 25. jeżeli liczba podkreślnik wystapien podkreślnik lidera zamknij nawias ostrokątny n prawy ukośnik 2 to. Linia 26. wypisz cudzysłów Liderem zbioru jest cudzysłów plus lider. Linia 27. w przeciwnym wypadku. Linia 28. wypisz cudzysłów Zbiór nie ma lidera cudzysłów.

Dominującymi operacjami w omawianym rozwiązaniu są porównania w pętlach wykonujących się dla każdego elementu zbioru wejściowego, a zatem złożoność czasowa algorytmu wynosi On.

Kim jest idol w zbiorze?

Specyfikacja problemu:

Dane:

  • n – liczba naturalna; liczba osób

  • znajomosci – tablica o wymiarach n × n; przechowuje liczby naturalne 0 oraz 1; tablica informacji na temat tego, które osoby się znają

Wynik:

  • komunikat wskazujący lidera zbioru lub informujący, że zbiór nie ma idolaidolidola

Na przyjęciu znajduje się n osób. Osoby oznaczone są numerami od 0 do n1. Ponieważ jest to duża impreza, nie wszyscy goście się znają. Osoba A może znać osobę B, co niekoniecznie musi oznaczać, że osoba B zna osobę A. Może się okazać, że na przyjęciu pojawiła się osoba na tyle popularna, że jest znana przez wszystkich. Jeżeli ponadto okaże się, że osoba ta nie zna nikogo spośród pozostałych gości, możemy nazwać ją idolem.

Poniżej zaprezentowano dwuwymiarową tablicę typu logicznego, która określa stan znajomości wśród osób znajdujących się na przyjęciu. Jeżeli wartość znajomość[A][B] wynosi 1 (zauważmy, że to tablica liczb całkowitych, nie tablica boolowska), to przyjmujemy, że osoba A zna osobę B. Dla porządku przyjmujemy, że dana osoba nie zna siebie samej.

Linia 1. n ← 5. Linia 2. znajomość otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy ← otwórz nawias kwadratowy. Linia 3. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 4. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 5. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 6. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 7. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy. Linia 8. zamknij nawias kwadratowy.
Polecenie 2

Czy na podstawie powyższej tablicy jesteś w stanie wskazać, która osoba jest idolem?

Zastanówmy się, ile pytań „Czy osoba A zna osobę B?” musimy zadać, aby sprawdzić, czy na przyjęciu pojawił się idol oraz kto nim jest.

Spróbujmy dokładnie przeanalizować informację, która wynika z odpowiedzi na pojedyncze pytanie: „Czy osoba A zna osobę B?” w kontekście wyszukiwania idola. Ponieważ idol jest osobą, która musi być znana przez każdego oraz sama nie może znać nikogo, wymienione wyżej pytanie pozwala nam stwierdzić, która z osób A lub B na pewno nie jest idolem. Jeżeli odpowiedź na nie brzmi twierdząco, wiemy, że osoba A nie może być idolem, ponieważ zna przynajmniej jedną osobę. Jeśli odpowiedź jest przecząca, to z kolei osoba B nie może być uznana za idola, ponieważ istnieje przynajmniej jedna osoba, która jej nie zna.

Tym sposobem możemy wyznaczyć idealnego kandydata na idola, zadając tylko 0 do n1 pytań. Zapiszmy ten proces w postaci pseudokodu:

Linia 1. n ← 5. Linia 2. znajomość otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy ← otwórz nawias kwadratowy. Linia 3. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 4. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 5. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 6. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 7. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy. Linia 8. zamknij nawias kwadratowy. Linia 9. kandydat ← 0. Linia 11. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 12. jeżeli znajomość otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 13. kandydat znak równości i.

Następnie sprawdzimy, czy wyznaczony kandydat może być idolem. W tym celu musimy przepytać wszystkich gości, czy znają wyznaczonego kandydata, a także przepytać kandydata, czy nie zna nikogo. Każdy z tych procesów będzie składał się z zadania n1 pytań.

Do wcześniejszego pseudokodu dopiszemy linijki odpowiadające za sprawdzenie, czy wyznaczony kandydat jest idolem:

Linia 1. n ← 5. Linia 2. znajomość otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy ← otwórz nawias kwadratowy. Linia 3. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 4. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 5. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 6. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 7. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy. Linia 8. zamknij nawias kwadratowy. Linia 10. kandydat ← 0. Linia 12. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 13. jeżeli znajomość otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 14. kandydat ← i. Linia 15. prawy ukośnik prawy ukośnik w przeciwnym wypadku kandydat dalej może być idolem. Linia 17. prawy ukośnik prawy ukośnik przepytaj gości przecinek czy znają kandydata. Linia 18. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 19. prawy ukośnik prawy ukośnik sprawdź czy osoba i nie jest kandydatem. Linia 20. jeżeli kandydat wykrzyknik znak równości i to. Linia 21. prawy ukośnik prawy ukośnik sprawdź przecinek czy osoba i zna kandydata. Linia 22. jeżeli wykrzyknik znajomość otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy to. Linia 23. prawy ukośnik prawy ukośnik osoba i nie zna kandydata. Linia 24. prawy ukośnik prawy ukośnik kandydat nie jest idolem. Linia 25. prawy ukośnik prawy ukośnik idol nie istnieje. Linia 26. wypisz cudzysłów Idol nie istnieje cudzysłów. Linia 27. zakończ działanie pętli. Linia 29. prawy ukośnik prawy ukośnik przepytaj kandydata przecinek czy nie zna gości. Linia 30. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 31. prawy ukośnik prawy ukośnik sprawdź przecinek czy kandydat nie jest osobą i. Linia 32. jeżeli kandydat wykrzyknik znak równości i to. Linia 33. prawy ukośnik prawy ukośnik sprawdź przecinek czy kandydat nie zna osoby i. Linia 34. jeżeli znajomość otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 35. prawy ukośnik prawy ukośnik kandydat zna osobę i. Linia 36. prawy ukośnik prawy ukośnik kandydat nie jest idolem. Linia 37. prawy ukośnik prawy ukośnik idol nie istnieje. Linia 38. wypisz cudzysłów Idol nie istnieje cudzysłów. Linia 39. zakończ wykonywanie programu. Linia 41. wypisz cudzysłów Idolem jest osoba numer cudzysłów plus kandydat.

Powyższy kod można skrócić, wykorzystując podobieństwo dwóch pętli:

Linia 1. n ← 5. Linia 2. znajomość otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy ← otwórz nawias kwadratowy. Linia 3. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 4. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 5. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 6. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek. Linia 7. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy. Linia 8. zamknij nawias kwadratowy. Linia 10. kandydat ← 0. Linia 12. dla i znak równości 1 przecinek 2 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 13. jeżeli znajomość otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 14. kandydat ← i. Linia 15. prawy ukośnik prawy ukośnik w przeciwnym wypadku kandydat dalej może być idolem. Linia 17. prawy ukośnik prawy ukośnik sprawdź przecinek czy kandydat jest idolem. Linia 18. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj. Linia 19. prawy ukośnik prawy ukośnik sprawdź czy nie pytamy kandydata o samego siebie. Linia 20. prawy ukośnik prawy ukośnik oraz czy czy osoba i zna kandydata. Linia 21. prawy ukośnik prawy ukośnik oraz czy kandydat nie zna osoby i. Linia 22. jeżeli kandydat wykrzyknik znak równości i. Linia 23. oraz wykrzyknik znajomość otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy. Linia 24. oraz znajomość otwórz nawias kwadratowy kandydat zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy to. Linia 25. prawy ukośnik prawy ukośnik osoba i nie zna kandydata. Linia 26. prawy ukośnik prawy ukośnik lub kandydat zna osobę i. Linia 27. prawy ukośnik prawy ukośnik kandydat nie jest idolem. Linia 28. prawy ukośnik prawy ukośnik idol nie istnieje. Linia 29. wypisz cudzysłów Idol nie istnieje cudzysłów. Linia 30. zakończ wykonywanie programu. Linia 32. wypisz cudzysłów Idolem jest osoba numer cudzysłów plus kandydat.

Przedstawiony algorytm pozwala nam na znalezienie idola po zadaniu 3n1 pytań.

By to uzasadnić, przypomnijmy jak działa omówiony algorytm. Najpierw sprawdzamy, czy każda kolejna osoba (poza pierwszą) zna obecnego kandydata (czyli pierwszą osobę). Daje to n1 pytań.

Następny krok wymaga sprawdzana, czy kolejne osoby z grupy znają kandydata (czyli znowu zadajemy n1 pytań) oraz czy kandydat zna te kolejne osoby (kolejne n1 pytań).

By znaleźć idola zadajemy 3n1 pytań. To oznacza, że złożoność czasowazłożoność czasowazłożoność czasowa omówionego algorytmu wynosi On.

Słownik

idol
idol

taka osoba, którą znają wszyscy, a która nie zna nikogo

lider
lider

wartość w zbiorze n-elementowym, która powtarza się więcej niż n2 razy

wartownik
wartownik

element umieszczany w zbiorze danych, które mają zostać przeszukane z wykorzystaniem algorytmu wyszukiwania liniowegowyszukiwanie liniowewyszukiwania liniowego

wyszukiwanie binarne
wyszukiwanie binarne

algorytm odnajdowania elementów w uporządkowanych zbiorach; polega na wielokrotnym dzieleniu przeszukiwanego zbioru na dwie równe części i porównywaniu wartości szukanej z elementem znajdującym się w środku dzielonego obszaru

wyszukiwanie liniowe
wyszukiwanie liniowe

algorytm wyszukiwania elementu w zbiorze danych polegający na porównywaniu poszukiwanego elementu z elementami zbioru danych

złożoność czasowa
złożoność czasowa

ilość czasu potrzebna do wykonania zadania, wyrażona jako funkcja ilości danych

złożoność obliczeniowa
złożoność obliczeniowa

ilość zasobów komputerowych potrzebnych do wykonania zadania; złożoność obliczeniowa obejmuje złożoność pamięciową i czasową

złożoność pamięciowa
złożoność pamięciowa

ilość pamięci potrzebnej do wykonania zadania, wyrażona jako funkcja ilości danych