Пользовательская реализация HashTable в Java?
Я решал проблему Quora, и для моего конкретного решения мне нужна была хеш-таблица (длинные ключи, int-значения) для кэширования значений. Я надеялся, что Java HashMap можно улучшить, потому что я знал свои типы данных для ключей и значений, они были примитивами, а также мое проблемное пространство. Я решил наивно реализовать простую хеш-таблицу, используя структуру "массив-связанного списка" (даже мой связанный список был моим собственным классом узлов, который я реализовал). Но я заметил, что моя собственная наивная реализация была примерно в 4 раза медленнее, чем универсальный Java HashMap. Я также попытался использовать библиотеку Trove LongToIntMap, чтобы посмотреть, что они делают. У кого-нибудь есть хорошие предложения по созданию настраиваемой хеш-таблицы Long to Int в Java, которая значительно превосходит Java HashMap?
2 ответа
Взгляните на FastMap от Javolution. Исходный код доступен здесь.
Я также попытался использовать библиотеку Trove LongToIntMap, чтобы посмотреть, что они делают.
Вы пытались посмотреть на код, чтобы увидеть, как они это делают?
Невозможно точно сказать, что вы сделали неправильно в своей реализации, не глядя на код. Однако одним из возможных улучшений может быть замена LinkedList<Integer>
с пользовательским типом "список целых", который использует int[]
представлять списки. В зависимости от API хеш-таблицы вы сможете избежать затрат на представление значений в виде объектов (в частности, Integer
с). (И как следствие, вы получите лучшую производительность и использование пространства, НЕ реализовав API, который имеет универсальные типы для ключей и / или типов значений.)
Что бы это ни стоило, одна ошибка, которая может привести к снижению производительности, заключается в пренебрежении реализацией изменения размера хеш-таблицы. Без изменения размеров, сложность get
а также put
операции на столе будут O(N)
скорее, чем O(1)
... потому что длина цепочки хеширования будет расти пропорционально количеству записей в хеш-таблице.
Наконец, вы должны четко понимать, оптимизируете ли вы производительность или использование пространства. Оптимальное решение будет другим....