|
|
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUПопробуй вот так :) Стало чуть лучше, но всё равно отстой: рандомные ключи 1млн: 7091 уникальный хеш последовательные 1млн: 348 уникальных хешей английский словарь 30322: 1580 уникальных хешей А замер скорости времени поиска? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:33:27 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUKazantsev Alexeyпропущено... Стало чуть лучше, но всё равно отстой: пропущено... А замер скорости времени поиска? зачем нужен замер скорости, если сам хеш - говно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:34:48 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUХаре лениться. Заколебали Выложи dpr. Мне лень переводить подсчёт коллизий со своей структуры на словарь. Поэтому нет. SOFT FOR YOUЕщё я коллизии не считал Дело хозяйское. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:37:10 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUА замер скорости времени поиска? Какой ещё замер скорости??? У тебя там сплошные коллизии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:39:27 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
defecatorSOFT FOR YOUпропущено... А замер скорости времени поиска? зачем нужен замер скорости, если сам хеш - говно ? У меня в оригинале rol и bswap. Что в упрощенном паскале коллизий много - я удивлён Нужен тестовый проект со скоростью поиска и с подсчётом коллизий. Можно будет посмотреть, что не так, докрутить функцию И сравнить варианты между собой Может Алексей что-то не так написал А то без проекта можно с тем же успехом брать цифры с потолка и сюда постить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:39:53 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUА то без проекта можно с тем же успехом брать цифры с потолка и сюда постить тебе код привёл, вставь в пустой проект эти 8 строчек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:41:39 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUМожет Алексей что-то не так написал А то без проекта можно с тем же успехом брать цифры с потолка и сюда постить Я тебе все вводные дал - проверяй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:41:50 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Ладно, вот вариант с 1 умножением: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Уникальных: 999772, коллизий: 228 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 14:59:06 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Справедливости ради стоит сказать, что коллизии нужно считать не по хешу, а по младшим битам хеша в соответствии с размером таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 15:06:02 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЛадно, вот вариант с 1 умножением: ... Уникальных: 999772, коллизий: 228 Ну это на рандомных ключах, а на последовательных и на словаре всё равно дофига коллизий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 15:09:20 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUколлизии нужно считать не по хешу, а по младшим битам хеша в соответствии с размером таблицы Сам-то понял, что сказал? Если у тебя хеши одинаковые, то и вход в таблицу ты получишь один и тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 15:13:27 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUЛадно, вот вариант с 1 умножением: ... Уникальных: 999772, коллизий: 228 Ну это на рандомных ключах, а на последовательных и на словаре всё равно дофига коллизий. Так я тебе поэтому и говорю Код в студию И замер времени поиска Коллизий может быть сколько угодно, в конечном счёте важна скорость поиска ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 15:15:36 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUколлизии нужно считать не по хешу, а по младшим битам хеша в соответствии с размером таблицы Сам-то понял, что сказал? Если у тебя хеши одинаковые, то и вход в таблицу ты получишь один и тот же. Я к тому, что приведённый твой волшебный хеш на самом деле даёт значительно больше коллизий, чем ты думаешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 15:16:46 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUКоллизий может быть сколько угодно, в конечном счёте важна скорость поиска SOFT FOR YOUЯ к тому, что приведённый твой волшебный хеш на самом деле даёт значительно больше коллизий, чем ты думаешь Коллизия хеша однозначно приведёт к замедлению поиска. Это аксиома. Аксиомы доказательств не требуют. И кстати, тут никто не говорил, что у хорошей хеш-функции не будет коллизий при получении входа в таблицу (по крайней мере до тех пор, пока размерность хеша не совпадёт с размерностью таблицы), но у плохой их будет ещё больше. Я сейчас попробовал заменить в своей таблице хеш Седжвика на твою функцию. До этого момента она в поиске была быстрее TDictionary на 159%, на последовательных ключах. C твоей функцией (последним её вариантом) я вообще не смог дождаться заполнения таблицы. Закономерный результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 15:46:56 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUКоллизий может быть сколько угодно, в конечном счёте важна скорость поиска SOFT FOR YOUЯ к тому, что приведённый твой волшебный хеш на самом деле даёт значительно больше коллизий, чем ты думаешь Коллизия хеша однозначно приведёт к замедлению поиска. Это аксиома. Аксиомы доказательств не требуют. И кстати, тут никто не говорил, что у хорошей хеш-функции не будет коллизий при получении входа в таблицу (по крайней мере до тех пор, пока размерность хеша не совпадёт с размерностью таблицы), но у плохой их будет ещё больше. Я сейчас попробовал заменить в своей таблице хеш Седжвика на твою функцию. До этого момента она в поиске была быстрее TDictionary на 159%, на последовательных ключах. C твоей функцией (последним её вариантом) я вообще не смог дождаться заполнения таблицы. Закономерный результат. Если на одну позицию хеш-таблицы есть 1000 элементов - тогда да А если на одну позицию ~2 элемента - тогда скорость поиска упирается в скорость функции. А для строк - это цикл по символам У тебя синдром defecator-а? Сложно выложить тестовый проект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 16:00:11 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Вот проект по коллизиям Хеш корректируется под размер таблицы (1048576) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. Код: plaintext 1. 2. 3. Отдельно публикую быстрый StringHash Работает по 4 байтам за итерацию, одно умножение, понимает как Unicode-версию Delphi, так и Ansi Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 16:13:20 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЕсли на одну позицию хеш-таблицы есть 1000 элементов - тогда да А если на одну позицию ~2 элемента - тогда скорость поиска упирается в скорость функции. А для строк - это цикл по символам В скорость функции всё упрётся только тогда, когда каждому выданному хешу будет соответствовать незанятая точка входа. В противном случае, чем больше коллизий даёт функция, тем медленнее работает таблица. SOFT FOR YOUСложно выложить тестовый проект? Сложно. SOFT FOR YOUВот проект по коллизиям Хеш корректируется под размер таблицы (1048576) Подгоняем условия под результат? И снова удобные рандомные ключи На последовательных сделай, и посмотри. И кстати, не у всех таблиц внутренний размер кратен степени двойки. Кстати, вот тебе для облегчения задачи готовый компарер для TDictionary: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Тестируем с последовательными ключами. С Седжвиком TDictionary ускоряется вдвое. С твоей функцией... сам проверь, если дождаться заполнения сумеешь. Моя таблица с твоим хешем медленне в 78(!) раз чем с Седжвиком. Ну и в качестве пищи для размышлений: TDictionary имеет размер внутренней таблицы кратный степени двойки, моя таблица нет. Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 17:41:01 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeySOFT FOR YOUЕсли на одну позицию хеш-таблицы есть 1000 элементов - тогда да А если на одну позицию ~2 элемента - тогда скорость поиска упирается в скорость функции. А для строк - это цикл по символам В скорость функции всё упрётся только тогда, когда каждому выданному хешу будет соответствовать незанятая точка входа. В противном случае, чем больше коллизий даёт функция, тем медленнее работает таблица. Чем по твоему грозит коллизия в "ячейке"? Только тем, что будет вызвано на N сравнений больше, когда будет проход по записям с одинаковым хешем Kazantsev AlexeySOFT FOR YOUСложно выложить тестовый проект? Сложно. Бред какой-то Kazantsev AlexeySOFT FOR YOUВот проект по коллизиям Хеш корректируется под размер таблицы (1048576) Подгоняем условия под результат? И снова удобные рандомные ключи На последовательных сделай, и посмотри. И кстати, не у всех таблиц внутренний размер кратен степени двойки. Причём здесь подгоняем? 1048576 - это следующее кратное 2 число после миллиона Покажи хоть один промышленный хеш-массив с размером не равным степени двойки. И давай замерим его производительность И что удобного в рандомных ключах? Там одинаковая длина и диапазон символов - 17 Где ты видел миллион строк "Index" + i ? Даже миллион гвидов - задача, притянутая за уши. Ты же предлагаешь всерьёз воспринимать то, что реалиям не имеет никакого отношения. Но я согласен, в этих случаях лучше Седжвик Kazantsev AlexeyТестируем с последовательными ключами. С Седжвиком TDictionary ускоряется вдвое. С твоей функцией... сам проверь, если дождаться заполнения сумеешь. Моя таблица с твоим хешем медленне в 78(!) раз чем с Седжвиком. Ну и в качестве пищи для размышлений: TDictionary имеет размер внутренней таблицы кратный степени двойки, моя таблица нет. Удачи. Нет проекта - нет дискуссии "Index" + i не имеют ничего общего с реальностью Имеет значение не скорость добавления, а скорость поиска ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:32:42 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
С Седжвиком TDictionary ускоряется вдвое. Сейчас проверил на своем примере, с при подстановке компаратора с Седжвиком, поиск стал медленнее в 1.5 раза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:37:34 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
asviridenkov, А что было до Седжвика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:43:20 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatasviridenkov, А что было до Седжвика? Дефолтный компарер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:55:48 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
asviridenkov, А который у тебя дефорлтный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:03:03 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatasviridenkov, А который у тебя дефорлтный? Почему у меня, у TDictionary. Не знаю, что именно там. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:07:52 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUЧем по твоему грозит коллизия в "ячейке"? Только тем, что будет вызвано на N сравнений больше, когда будет проход по записям с одинаковым хешем Ох и трудный же ты... Отсутствие коллизии хеша не гарантирует отсутствия коллизии на точке входа, зато коллизия хеша её присутствие гарантирует. SOFT FOR YOUБред какой-то Бред, это твой хеш. SOFT FOR YOUПокажи хоть один промышленный хеш-массив с размером не равным степени двойки. И давай замерим его производительность Я тебе ничего доказывать не собираюсь. У меня таблица именно такая, и насколько она опережает TDictionary я уже писал. SOFT FOR YOUИ что удобного в рандомных ключах? Там одинаковая длина и диапазон символов - 17 А подумать? Идентификаторы сессий/объектов/дачегоугодновообще на сервере. SOFT FOR YOUГде ты видел миллион строк "Index" + i ? Это лишь синтетический пример. Последовательные ключи или ключи с постоянной частью это реальная проблема для хеш-функций. Ты бы знал об этом, если бы читал что-нибудь по теме. Поэтому универсальные хеши всегда тестируют на разных наборах данных, а не только на удобных. SOFT FOR YOUНет проекта - нет дискуссии Да бога ради. Если для тебя сложно вставить свой хеш в готовый компарер и проинициализировать им словарь, тут действительно не о чем больше говорить. SOFT FOR YOUИмеет значение не скорость добавления, а скорость поиска Мы бы и померили скорость поиска, если бы смогли заполнить таблицу с твоим хешем. Проблема в том, что я так долго ждать не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:11:31 |
|
||
|
TDictionary или TList<>.BinarySearch с позиции поиска
|
|||
|---|---|---|---|
|
#18+
rgreatБыстрый хэшик для строки. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А ведь кто-то может утащить в копилку алгоритм с ошибой ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:12:14 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39369324&tid=2041988]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 474ms |

| 0 / 0 |
