Позвольте мне начать с того, что проверка подлинности double
s не является хорошей практикой. Подробнее см .: What every programmer should know about floating points.
Вы должны использовать более надежные сравнения double
.
Теперь, когда мы закончим с этим, давайте обратимся к вашей проблеме.
Вы имеете дело с изменением Element Distinctness Problem с числами с плавающей запятой.
Вообще говоря, в рамках модели вычисления алгебраического дерева нельзя сделать это лучше, чем Omega(nlogn)
(ссылки в этой теме: https://stackoverflow.com/a/7055544/572670).
Однако, если вы собираетесь придерживаться double
чеки идентичности (пожалуйста, нет), вы можете использовать более сильную модель и хэш-таблицу для достижения O(n)
решения, сохраняя хэш-таблицу на основе histogram (реализовано в виде HashMap<Double,Integer>
), и когда вы закончите, просмотрите гистограмму и введите ключ самого высокого значения.
(Пожалуйста, не делайте этого)
Существует сложный способ сделать достичь O(n)
времени основанного на хеширования, даже при работе с плавающей точкой. Это основано на добавлении элементов к нескольким записям хеш-таблицы и при условии, что хеш-функция принимает диапазон элементов [x-delta/2,x+delta/2)
к тому же значению хэша (поэтому он хеширует куски [x1,x2)->h1, [x2,x3)->h2, [x3,x4)->h3, ....
). Затем вы можете создать хеш-таблицу, где элемент x
будет хэширован до трех значений: x-3/4delta, x, x + 3/4delta
.
Это гарантирует при проверке равного значения позже, он будет иметь совпадение, по крайней мере, в одном из трех мест, в которые вы помещаете элемент.
Это значительно сложнее реализовать, но оно должно работать. Вариант этого можно найти в cracking the code interview, математический, вопрос 6. (Просто убедитесь, что вы смотрите на выпуске 5, ответ в редакции-неверно и был зафиксирован в новой редакции)
В другой стороне обратите внимание: вам не нужно реализовывать свой собственный вид. Использовать Arrays.sort()
Проверка личности 'double' не является хорошей практикой. [Что каждый программист должен знать о плавающих запятых] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – amit
В качестве побочного примечания это проблема отличия элементов, и есть нет O (n) решения по алгебраической модели дерева. Если вы собираетесь придерживаться идентичности удвоений, вы можете использовать хеш-таблицу, но опять же - это плохая практика. – amit
@amit Почему это плохая практика использовать хеш-таблицы в таких случаях, как указано выше? – sAm