Сообщение Re[4]: [Голосование] Нужен ли binary tree если есть hash таб от 30.06.2017 13:20
Изменено 30.06.2017 14:51 vfedosov
Re[4]: [Голосование] Нужен ли binary tree если есть hash таб
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, netch80, Вы писали:
vsb>>>Дерево даёт упорядоченность. Это и плюс (если она нужна) и минус (элементам нужен компаратор). Обе структуры нужны.
N>>[UPD] А для хэша нужен собственно hash code. Иногда получается, что сравнить элементы можно, а вот получить от элемента что-то, достойное для использования как хэш-код — дзуськи.
vsb>Ну получить хэш код можно всегда, я по крайней мере не представляю, когда нельзя, разве что элемент это какой-то очень чёрный ящик, но это уже проблема архитектуры.
Нужно, чтобы этот код имел более-менее равномерное распределение. Иначе будет много коллизий и hashtable будет уступать по производительности дереву — в хучшем случае сложность операции может просесть до O(N). Если распределение данных имеет сложный характер, то дерево может дать лучшие результаты. К примеру, если есть миллион 64х битных целых чисел, которые разделены на 1000 групп и внутри каждой группы значения идут подряд, но группы значительно отстоят друг от друга — со случайным шагом порядка сотни миллионов. Если использовать эти числа как хеш напрямую, то будет где-то по 1000 коллизий на один нод hashtable. То есть сложность будет O(sqrt(N)), что хуже, чем log(N) дерева. Вот и придумай, как получить равномерный хеш хеш для такого распределения.
vsb>Здравствуйте, netch80, Вы писали:
vsb>>>Дерево даёт упорядоченность. Это и плюс (если она нужна) и минус (элементам нужен компаратор). Обе структуры нужны.
N>>[UPD] А для хэша нужен собственно hash code. Иногда получается, что сравнить элементы можно, а вот получить от элемента что-то, достойное для использования как хэш-код — дзуськи.
vsb>Ну получить хэш код можно всегда, я по крайней мере не представляю, когда нельзя, разве что элемент это какой-то очень чёрный ящик, но это уже проблема архитектуры.
Нужно, чтобы этот код имел более-менее равномерное распределение. Иначе будет много коллизий и hashtable будет уступать по производительности дереву — в хучшем случае сложность операции может просесть до O(N). Если распределение данных имеет сложный характер, то дерево может дать лучшие результаты. К примеру, если есть миллион 64х битных целых чисел, которые разделены на 1000 групп и внутри каждой группы значения идут подряд, но группы значительно отстоят друг от друга — со случайным шагом порядка сотни миллионов. Если использовать эти числа как хеш напрямую, то будет где-то по 1000 коллизий на один нод hashtable. То есть сложность будет O(sqrt(N)), что хуже, чем log(N) дерева. Вот и придумай, как получить равномерный хеш хеш для такого распределения.
Re[4]: [Голосование] Нужен ли binary tree если есть hash таб