Время выполнения описанного алгоритма O(n^2)
. Внешний цикл выполняется n/2
раза, таким образом, внутренний счетчик j
сбрасывается n/2
раза, и, таким образом, внутренний цикл выполняется всего O(n^2)
раз.
Я не уверен, что следую логике вашей идеи, но вот два подхода к ее реализации [в псевдокоде высокого уровня]:
(1) создать гистограмму из данных:
- создайте
Map<Integer,Integer>
[ключ — это элемент а значение — количество вхождений]
- перебрать массив и для каждого элемента подсчитать, сколько раз он появляется
- повторите гистограмму и найдите, есть ли уникальные максимумы.
- Если есть - верни true, иначе верни false.
Этот подход имеет среднее значение O(n)
, если вы используете HashMap
а> как карта.
(2) отсортировать и найти максимальные вхождения:
- Отсортируйте массив — в результате все равные элементы окажутся рядом друг с другом. Вы можете использовать
Arrays.sort(array)
для сортировки.
- Подсчитайте, сколько раз появляется каждый элемент [аналогично идее гистограммы], и найдите, есть ли уникальные максимумы. На самом деле вам не нужно хранить данные для всех элементов, достаточно сохранить для первых 2 и в конце проверить, идентичны ли они.
Это решение O(nlogn)
среднее + наихудшее [на самом деле, в зависимости от сортировки - сортировка слияния дает вам O(nlogn)
в худшем случае, в то время как быстрая сортировка дает O(n^2)
в худшем случае, и оба O(nlogn)
в среднем случае ].
РЕДАКТИРОВАТЬ:
Я неправильно понял проблему, я думал, что вы ищете, есть ли уникальные максимумы. Эти 2 решения все еще подходят для проблемы, вам просто нужно изменить последний шаг каждого [чтобы проверить, появляется ли наиболее часто встречающийся элемент более чем в половине случаев, что снова довольно просто и выполнимо в O(n)
].
Кроме того, есть другое решение: использовать алгоритм выбора, чтобы найти медиану, а после ее нахождения проверить если это элемент большинства, и вернуть, если это так. Поскольку алгоритм выбора основан на принципе «разделяй и властвуй», я думаю, что он соответствует вашим потребностям.
person
amit
schedule
14.04.2012