Liderem nazywamy liczbę, która w zbiorze liczącym elementów występuje więcej niż razy. Ponieważ inna liczba nie może występować w tym samym zbiorze liczbowym więcej niż razy, lider jest tylko jeden. W zbiorze {1, 4, 6, 1, 1} liderem jest liczba 1 – występuje w nim aż 3 razy.
Natomiast w zbiorze {8, 6, 4, 5, 3, 2} żadna z sześciu liczb nie jest liderem.
Właściwości zbiorów z liderem
Zbiory, które mają lidera, posiadają bardzo ważną właściwość: jeżeli z takiego zbioru usuniemy parę liczb – pod warunkiem, że będą one różne – zbiór ten nadal będzie miał tego samego lidera. Przeanalizujmy dwa przykłady:
jeden, w którym obie usunięte liczby ze zbioru nie są liderem;
drugi, w którym jedna z liczb jest liderem, natomiast druga nie.
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ć, iż 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 – 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.
Jeżeli weźmiemy jakikolwiek zbiór i będziemy odejmować od niego po dwa różne elementy, aż do momentu, w którym nie będziemy mogli usunąć już więcej, otrzymamy jeden z trzech możliwych rezultatów:
pusty zbiór – oznacza, że zbiór nie ma lidera,
zbiór z jednym elementem – jeżeli zbiór ma lidera, to będzie nim właśnie ten element, a jeżeli nie ma, to jest to po prostu element, który nie został usunięty; żeby upewnić się, czy ten element jest liderem, należy policzyć, ile razy wystąpił on w oryginalnym zbiorze i sprawdzić, czy liczba ta jest większa niż ,
zbiór zawiera więcej niż jeden element, ale wszystkie pozostałe elementy mają takie same wartości – w tym przypadku element, który pozostał, na pewno jest liderem.
Algorytm wyszukiwania lidera
W e‑materiale teoretycznym poznaliśmy algorytm wyszukiwania lidera w zbiorze. Jego implementacja w języku Python wygląda następująco:
Linia 1. zbior znak równości otwórz nawias kwadratowy 1 przecinek 3 przecinek 1 zamknij nawias kwadratowy.
Linia 2. lider znak równości zbior otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.
Linia 3. n znak równości 1.
Linia 5. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły zbior zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 6. if n zamknij nawias ostrokątny 0 dwukropek.
Linia 7. if lider znak równości znak równości zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy dwukropek.
Linia 8. n znak równości n plus 1.
Linia 9. else dwukropek.
Linia 10. n znak równości n minus 1.
Linia 11. else dwukropek.
Linia 12. lider znak równości zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 13. n znak równości 1.
Linia 15. if n znak równości znak równości 0 dwukropek.
Linia 16. print otwórz nawias okrągły cudzysłów Zbiór nie ma lidera cudzysłów zamknij nawias okrągły.
Linia 17. exit otwórz nawias okrągły zamknij nawias okrągły.
Linia 19. liczba podkreślnik wystapien podkreślnik lidera znak równości 0.
Linia 20. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły zbior zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 21. if zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości lider dwukropek.
Linia 22. liczba podkreślnik wystapien podkreślnik lidera plus znak równości 1.
Linia 24. if liczba podkreślnik wystapien podkreślnik lidera zamknij nawias ostrokątny len otwórz nawias okrągły zbior zamknij nawias okrągły prawy ukośnik 2 dwukropek.
Linia 25. print otwórz nawias okrągły cudzysłów Liderem zbioru jest cudzysłów przecinek lider zamknij nawias okrągły.
Linia 26. else dwukropek.
Linia 27. print otwórz nawias okrągły cudzysłów Zbiór nie ma lidera cudzysłów zamknij nawias okrągły.
Wyszukiwanie idola w zbiorze
Wyobraźmy sobie pewną grupę, w której każda osoba może, ale nie musi, znać pozostałe osoby. Ponieważ to, że osoba A zna osobę B, nie znaczy, że osoba B zna osobę A, może dojść do specyficznej sytuacji, w której odnajdziemy jedną osobę znaną przez wszystkich, jednocześnie nieznającą nikogo. Taką osobę nazywamy idolem.
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.
Linia 1. macierz znak równości otwórz nawias kwadratowy.
Linia 2. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 3. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 4. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 5. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 6. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy.
Linia 7. zamknij nawias kwadratowy.
Linia 9. for i in range otwórz nawias okrągły len otwórz nawias okrągły macierz zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 10. if macierz otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk len otwórz nawias okrągły macierz zamknij nawias okrągły dwukropek.
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.
Linia 1. macierz znak równości otwórz nawias kwadratowy.
Linia 2. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 3. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 4. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 5. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 6. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy.
Linia 7. zamknij nawias kwadratowy.
Linia 9. for i in range otwórz nawias okrągły len otwórz nawias okrągły macierz zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 10. if macierz otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk len otwórz nawias okrągły macierz zamknij nawias okrągły dwukropek.
Linia 11. for x in macierz otwórz nawias kwadratowy dwukropek i zamknij nawias kwadratowy plus macierz otwórz nawias kwadratowy i plus 1 dwukropek zamknij nawias kwadratowy dwukropek.
Linia 12. if x otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości 0 dwukropek.
Linia 13. print otwórz nawias okrągły cudzysłów Zbior nie ma idola cudzysłów zamknij nawias okrągły.
Linia 14. break.
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.
Linia 1. macierz znak równości otwórz nawias kwadratowy.
Linia 2. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 3. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 4. otwórz nawias kwadratowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 5. otwórz nawias kwadratowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 6. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy.
Linia 7. zamknij nawias kwadratowy.
Linia 9. for i in range otwórz nawias okrągły len otwórz nawias okrągły macierz zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 10. if macierz otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk len otwórz nawias okrągły macierz zamknij nawias okrągły dwukropek.
Linia 11. for x in macierz otwórz nawias kwadratowy dwukropek i zamknij nawias kwadratowy plus macierz otwórz nawias kwadratowy i plus 1 dwukropek zamknij nawias kwadratowy dwukropek.
Linia 12. if x otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości znak równości 0 dwukropek.
Linia 13. print otwórz nawias okrągły cudzysłów Zbior nie ma idola cudzysłów zamknij nawias okrągły.
Linia 14. break.
Linia 15. else dwukropek.
Linia 16. print otwórz nawias okrągły f cudzysłów Idol to otwórz nawias klamrowy i zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.
Linia 17. break.
Linia 18. else dwukropek.
Linia 19. print otwórz nawias okrągły cudzysłów Zbior nie ma idola cudzysłów zamknij nawias okrągły.
Po uruchomieniu tego programu otrzymamy informację, że idolem jest osoba o numerze 4.
Przykładowe macierze, dla których idol nie istnieje: