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 .