Git Product home page Git Product logo

hashtable's Introduction

Hashtable with double hashing

hashtable's People

Contributors

lexcorp3439 avatar

hashtable's Issues

Замечания

private int hashCode1(Object key) {
return Math.abs(key.hashCode()) % (capacity - 1);
}
private int hashCode2(Object key) {
return 1 + Math.abs(key.hashCode()) % (capacity - 2);
}

Получается, у двух объектов с одинаковым hashCode hashCode1 и hashCode2 будут одинаковыми. Это перечёркивает всю идею двойного хэширования по сравнению с обычной открытой адресацией (с линейным пробированием). Функция для второго хэшкода должна предоставляться снаружи, как и для первого. Можно попробовать применить подход, используемый для SortedMap (сделать что-то аналогичное Comparatorу и Comparable для второго хэша).

  1. private int lastSize;

Это поле не используется.

  1. Вы сделали thread-safe класс, путём добавления synchronized ко всем методам. Он действительно стал thread-safe, но большого смысла в этом нет: можно сделать мапу со всеми синхронизированными методами из любой мапы с помощью стандартной библиотеки (java.util.Collections.synchronizedMap()). Навязывать синхронизацию не стоит, часто потокобезопасность не нужна и лишний оверхед просто так добавлять не стоит.

  2. Кстати, о потокобезопасности: тот тест, где вы пытаетесь проверить многопоточность на самом деле не многопоточный: Thread.run() не создаёт новый поток. А если б он был многопоточным, то, скорее всего, не проходил бы, или проходил бы не всегда: assertEquals мог бы вызваться до завершения thread1 и thread2. interrupt там вообще непонятно зачем.

  3. equals по спецификации интерфейса Map должен уметь делать сравнение с другими реализациями Map. hashSet, кстати, тоже проверьте на соответствие спеке.

  4. Логика equals реализована неправильно: если obj содержит все элементы из this и ещё некоторые, то ваш equals вернёт true

  5. В setDeleted нет необходимости инициализировать массив в цикле. После создания там и так будут false.

  6. Логику массива deleted, кстати, я не понял. По-моему, после rehash не должно быть deleted элементов вообще. Вообще, мне кажется deleted может быть нужен, если элемент в ячейке был, но мы его удалили, чтобы продолжить поиск по цепочке в случае коллизии. Но у вас, как будто что-то другое. Или нет?

  7. Что за параметр link в одном из конструкторов?

  8. Почему hashCode тестируется через println. Поведение hashCode для Map специфицировано, можно проверить с помощью assertEquals

  9. Что произойдёт, если после вычисления хэшей нужно положить элемент в последнюю ячейку, а она занята? Обычно в хэш-таблицах с открытой адресацией пытаются вставить в начале массива (по кругу). У вас такой логики нет.

  10. Избавьтесь от сырых типов везде: в HashSet и в тестах.

  11. Имена у contains и getIndex вводят в заблуждение. Я так понял, getIndex возвращает подходящий свободный индекс для ключа, а contains как раз возвращает индекс для ключа, который есть в мапе.

  12. В rehash лишний раз копируете массив. Вспомните, как работают ссылки в Джаве. Одной копии можно избежать.

  13. Вместо констант KEYS/VALUES лучше сделать перечисление.

  14. Разберитесь с тем, какие методы должны быть публичными: getIterator, например, не должен. Возможно есть что-то ещё.

lol

Фууу!!! Файлы идеи оставил, грязно, приберись!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.