SPECYFIKACJA Problem: Wyszukiwanie lidera w nieuporządkowanym ciągu liczb. DANE WEJŚCIOWE Ciąg n liczb umieszczonych w tablicy L. DANE WYJŚCIOWE Pozycja (indeks) lidera w ciągu L. Jeżeli w tablicy nie ma lidera, to należy to zasygnalizować.
Lider to element ciągu n elementów, który występuje więcej niż n//2 razy w ciągu. Dla n=2k lub n=2k+1 lider musi wystąpić co najmniej k+1 razy.
Metoda siłowa rozwiązania problemu ma następujące etapy.
Najbardziej pracochłonne jest sortowanie ciągu. Lepszy jest inny algorytm, który ma złożoność O(n). Składa się on z dwóch etapów [Sysło].
Algorytm bazuje na spostrzeżeniu, że jeżeli zbiór X ma lidera, to po usunięciu ze zbioru X dwóch różnych elementów również będzie zawierał lidera. Stwierdzenie odwrotne nie jest prawdziwe.
def lider(L, left, right): """Wyszukiwanie lidera w ciągu nieuporządkowanym.""" if left > right: return None # Etap I - wykrywanie kandydata na lidera. k = left # kandydat na lidera (indeks) number = 1 # krotność kandydata for i in range(left+1, right+1): if number == 0: # nowy kandydat na lidera k = i number = 1 else: # porównujemy z kandydatem if L[k] == L[i]: number += 1 else: number -= 1 # Etap II - sprawdzanie kandydata na lidera. if number == 0: # na liście nie ma lidera return None # Sprawdzamy ile razy kandydat jest na liście. number = 0 for i in range(left, right+1): if L[i] == L[k]: number += 1 if number > (right-left+1) // 2: return k # indeks lidera else: return None # na liście nie ma lidera