Я подготовил две реализации в Python с различной пространственной и временной сложностью:
Первая использует «массив вхождений»: O (k) в терминах сложности времени и S (k + 1) в терминахтребуется пространство, где k - наибольшее число на входе.
input =[1,2,3,8,4,6,1,3,7,9,6,1,9]
def find_max(tab):
max=tab[0]
for i in range(0,len(tab)):
if tab[i] > max:
max=tab[i]
return max
C = [0]*(find_max(input)+1)
print len(C)
def count_occurences(tab):
max_occurence=C[0]
max_occurence_index=0
for i in range(0,len(tab)):
C[tab[i]]=C[tab[i]]+1
if C[tab[i]]>max_occurence:
max_occurence = C[tab[i]]
max_occurence_index=tab[i]
return max_occurence_index
print count_occurences(input)
ПРИМЕЧАНИЕ. Представьте себе такой жалкий пример ввода, как массив [1, 10 ^ 8,1,1,1], будет массивдлины k + 1 = 100000001 необходимо.
Второе решение предполагает, что мы сортируем наш ввод перед поиском режима.Я использовал основную сортировку, которая имеет временную сложность O (kn), где k - длина самого длинного числа, а n - размер входного массива.И затем мы должны выполнить итерацию по всему отсортированному массиву размера n, чтобы определить самое длинное подмножество чисел, обозначающих режим.
input =[1,2,3,8,4,6,1,3,7,9,6,1,9]
def radix_sort(A):
len_A = len(A)
mod = 5 #init num of buckets
div = 1
while True:
the_buckets = [[], [], [], [], [], [], [], [], [], []]
for value in A:
ldigit = value % mod
ldigit = ldigit / div
the_buckets[ldigit].append(value)
mod = mod * 10
div = div * 10
if len(the_buckets[0]) == len_A:
return the_buckets[0]
A = []
rd_list_append = A.append
for b in the_buckets:
for i in b:
rd_list_append(i)
def find_mode_in_sorted(A):
mode=A[0]
number_of_occurences =1
number_of_occurences_canidate=0
for i in range(1,len(A)):
if A[i] == mode:
number_of_occurences =number_of_occurences +1
else:
number_of_occurences_canidate=number_of_occurences_canidate+1
if A[i] != A[i-1]:
number_of_occurences_canidate=0
if number_of_occurences_canidate > number_of_occurences :
mode=A[i]
number_of_occurences =number_of_occurences_canidate+1
return mode#,number_of_occurences
s_input=radix_sort(input)
print find_mode_in_sorted(s_input)