Пользовательская реализация HashTable в Java? - PullRequest
1 голос
/ 20 августа 2011

Я решал проблему Quora , и для моего конкретного решения мне нужна была хеш-таблица (длинные ключи, int-значения) для кэширования значений. Я надеялся, что Java HashMap можно улучшить, потому что я знал свои типы данных для ключей и значений, и они были примитивами, а также моим проблемным пространством. Я решил наивно реализовать простую хеш-таблицу, используя структуру «массив-связанного списка» (даже мой связанный список был моим собственным классом узлов, который я реализовал). Но я заметил, что моя собственная наивная реализация была примерно в 4 раза медленнее, чем универсальный Java HashMap. Я также пытался использовать библиотеку Trove LongToIntMap , чтобы посмотреть, что они делают. У кого-нибудь есть хорошие предложения по созданию настраиваемой хеш-таблицы Long to Int в Java, которая значительно превосходит Java HashMap?

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Я также пытался использовать библиотеку Trove LongToIntMap, чтобы посмотреть, что они делают.

Вы пытались посмотреть на код, чтобы увидеть, как они это делают?


Невозможно точно сказать, что вы сделали неправильно в своей реализации, не взглянув на код. Однако одним из возможных улучшений может быть замена LinkedList<Integer> пользовательским типом «список целых чисел», который использует int[] для представления списков. В зависимости от API вашей хеш-таблицы вы сможете избежать затрат на представление ваших значений в виде объектов (в частности, Integer s). (И как следствие, вы получите лучшую производительность и использование пространства, НЕ реализовав API, который имеет универсальные типы для ключей и / или типов значений.)

Для чего бы то ни было, одной ошибкой, которая может привести к снижению производительности, является пренебрежение реализацией изменения размера хеш-таблицы. Без изменения размера сложность операций get и put для таблицы будет O(N), а не O(1) ..., поскольку длина цепочки хеш-функций будет расти пропорционально количеству записей в хеш-таблице.

Наконец, вы должны четко представлять себе, оптимизируете ли вы производительность или использование пространства. Оптимальное решение будет другим ....

1 голос
/ 20 августа 2011

Посмотрите на Javolution's FastMap . Исходный код доступен здесь .

...