Kim jest idol
Kim jest idol w zbiorze?
Specyfikacja problemu:
Dane:
n– liczba naturalna; liczba osóbznajomosci– tablica o wymiarachn×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 idola
Na przyjęciu znajduje się n osób. Osoby oznaczone są numerami od do . 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.
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 do pytań. Zapiszmy ten proces w postaci pseudokodu:
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 pytań.
Do wcześniejszego pseudokodu dopiszemy linijki odpowiadające za sprawdzenie, czy wyznaczony kandydat jest idolem:
Powyższy kod można skrócić, wykorzystując podobieństwo dwóch pętli:
Przedstawiony algorytm pozwala nam na znalezienie idola po zadaniu 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 pytań.
Następny krok wymaga sprawdzana, czy kolejne osoby z grupy znają kandydata (czyli znowu zadajemy pytań) oraz czy kandydat zna te kolejne osoby (kolejne pytań).
By znaleźć idola zadajemy pytań. To oznacza, że złożoność czasowa omówionego algorytmu wynosi .
Implementacja algorytmu
To, czy dana osoba zna inną, przedstawimy za pomocą tzw. macierzy sąsiedztwa. Będzie to dwuwymiarowa tablica wypełniona zerami, jeżeli relacja znajomości z drugą osobą nie zachodzi, oraz jedynkami, jeżeli ta relacja zaistniała. Każdy wiersz tej macierzy będzie oznaczał stan wiedzy jednej osoby, zaś każda kolumna będzie oznaczała wiedzę o konkretnej osobie. Uznajemy, że żadna osoba nie zna samej siebie, dlatego przekątna tej tablicy będzie wypełniona zerami.
Teraz zapiszemy pętlę, która przejdzie po wszystkich wierszach tej macierzy. W każdym jej wykonaniu będziemy sprawdzali, czy znaleźliśmy wiersz wypełniony samymi zerami – oznacza to, że mamy potencjalnego idola. Jeżeli okaże się, że dowolna inna osoba go nie zna, zbiór nie będzie miał innego idola.
Teraz stworzymy kolejną pętlę, która przejdzie po wszystkich elementach w kolumnie informującej nas o tym, czy osoba o indeksie i jest znana. Wyjątkiem będzie tutaj sam wiersz wypełniony zerami – zostanie on pominięty. Jeżeli znajdziemy tam jakiekolwiek zero, natychmiastowo stwierdzimy, że zbiór ten nie ma idola i zakończymy wykonywanie pętli.
Następnie, ponownie korzystając z konstrukcji for‑else, dodamy wyświetlanie informacji o znalezionym idolu. Jeżeli pętla przechodząca po wszystkich elementach w kolumnie wykona się bez wywołania instrukcji break, wtedy mamy pewność, że osoba o indeksie i jest idolem. Dodamy też instrukcję else na koniec pętli przechodzącej po wierszach – odpowiada to sytuacji, w której nie znaleźliśmy żadnej osoby nieznającej nikogo.
Po uruchomieniu tego programu otrzymamy informację, że idolem jest osoba o numerze 4.
Przykładowe macierze, dla których idol nie istnieje:
Słownik
w teorii grafów jest to tablica zer i jedynek, informująca o tym, czy istnieją ścieżki między odpowiednimi wierzchołkami grafu
zbiór, w którym wszystkie elementy są posortowane według pewnej ich cechy; w przypadku liczb najczęściej jest to ich wartość