Size: a a a

Язык программирования Julia / Julia programming language

2021 June 25

A

Alexandr in Язык программирования Julia / Julia programming language
А с быстротой тут смотря что делать. Как я понимаю открытая индексация самая быстрая на выборку, но со вставкой и особенно удалением у нее есть проблемы
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Но правда это скорее про хеш было, чем про тип индексации.
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Вообщем заинтриговали, надо детальнее посмотреть что там 🙂
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
С удалением то почему?
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Там основная проблема была при ребалансе всего этого счастья.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
То есть нужно поддерживать определенный процентаж количества ключей и время от времени все приходится пересчитывать. В этот момент словарь конечно здорово тормозит.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Там всё очень просто.

https://github.com/JuliaLang/julia/blob/master/base/dict.jl - вот исходник.

https://github.com/JuliaLang/julia/blob/master/base/dict.jl#L78-L99 - это структура (там как раз видно keys и values заданные как вектора)

https://github.com/JuliaLang/julia/blob/master/base/dict.jl#L372-L393 - функции, которые вставляют новый элемент, внутри они вызывают тот самый rehash.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
ht_keyindex2! - это та самая функция, которая считает хэш до тех пор пока не находит подходящую позицию.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Хаха, они красавцы.

https://github.com/JuliaLang/julia/blob/master/base/dict.jl#L661-L667

При удалении, никакого пересчёта не производится.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
То есть если создать словарь размером в миллион ключей, а потом 99% удалить, то getindex будет всё равно медленный.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
С другой стороны, всегда можно руками rehash вызвать.
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Но да, это уже недокументированные возможности.
источник

A

Alexandr in Язык программирования Julia / Julia programming language
потому иначе это будет удаление из середины непрерывного массива
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Мне интереснее - я пока не понял, как они так хитро помечают удаленные объекты что знают что они не просто пустые, а удаленные. Это вообщем одна из проблем такого подхода
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Там похоже сурово. Они NULL пишут.
источник

A

Alexandr in Язык программирования Julia / Julia programming language
т.е. там смысл в чем - мы когда ищем ключ мы сначала попадаем в какой-то элемент массива по хэш-индексу, если этот элемент не совпадает с ключом то идем последовательно с каким-то шагом пока не найдем совпадающий или пустой элемент. Нашли совпадающий - значит нашли. Нашли пустой - значит нет такого ключа в мапе
источник

АО

Андрей Оськин... in Язык программирования Julia / Julia programming language
Вообще это нечестно 😊
Простым смертным удалять элементы без изменения типа не разрешают 😊
источник

A

Alexandr in Язык программирования Julia / Julia programming language
Соответвенно когда мы удаляем какой-то ключ, то нельзя его проставить в пустой потому что он тогда может порвать цепочку и все ключи с таким же хэшем которые в цепочке идут после него станут недоступны при выборке
источник

A

Alexandr in Язык программирования Julia / Julia programming language
а rehash скорее всего присходит когда кол-во ключей начинает превышать какую-то долю от выделенного под них массива (обычно 50%). В этом случае массив увеличивают в 2 раза и пересчитывают хэши
источник