Хеширование в словаре в kdb - PullRequest
       11

Хеширование в словаре в kdb

0 голосов
/ 11 октября 2019

Когда мы читаем Q для смертных (раздел «Словарь»), появляется описание, которое:
Когда вы знаете, что ключи уникальны, вы можете применить атрибут `u # к ключам. Это фактически сделает словарь хеш-таблицей с сопутствующим улучшением скорости поиска по сравнению с линейным поиском по умолчанию.

Может кто-нибудь, пожалуйста, дайте мне знать, как этот словарь конвертируется в хеш-таблицу за кулисами?

Как известно, в Java массив из 16 сегментов поддерживается для хеш-таблицы, а хеш-функция генерирует местоположение, а элемент помещается в этот сегмент, и в случае коллизии сохраняется связанный список / дерево.

Просто хотите понять, как происходит преобразование словаря в хеш-таблицу в kdb?

Практически применение уникального атрибута к ключам ускоряет поиск.

Eg:
q)a:(`u#asc -100000?`6)!100000?10 / hashtable
q)b:(-100000?`6)!100000?10

// Searching elements in dictionary which is converted to hashtable
q)\t:100000 a[(key a)[1021]]
24
q)\t:100000 a[(key a)[2231]]
25
q)\t:100000 a[(key a)[72461]]
24
q)\t:100000 a[(key a)[89985]]
24

//Searching elements in dictionary which is not converted to hashtable
q)\t:100000 b[(key b)[1021]]
51
q)\t:100000 b[(key b)[2231]]
90
q)\t:100000 b[(key b)[72461]]
2642
q)\t:100000 b[(key b)[89985]]
3280

1 Ответ

3 голосов
/ 11 октября 2019

Создание хеш-таблицы не доступно пользователю, поэтому вы вряд ли узнаете, как это делается за кулисами. Также хеш-таблица не создается из словаря, она создается только для списка, который образует ключ вашего словаря.

Ваш поиск в словаре требует поиска ключей (списка) - атрибут u # ускоряет поиск в указанном списке, не используя по умолчанию линейный поиск.

Некоторая информация здесь: http://www.timestored.com/kdb-guides/table-attributes#unique-attribute

...