Files
ARSV/Docs/more/raw_data.md
T
2026-07-20 21:58:04 +03:00

4.8 KiB
Raw Blame History

raw_data

messages from tg

[6/23/26 9:57PM] Arseny: Кстати. У меня есть серьёзная математическая, она же очень серьёзная алгоритмическая задача на исследование. ALT set:version (https://git.altlinux.org/gears/r/rpm.git?a=blob;f=lib/set.c) нужен майнтейнер. [6/23/26 9:57PM] Arseny: Вы хотели алгоритмов? Вот, расскажите мне про этот. [6/23/26 9:57PM] Arseny: весь алгоритм можно разбить на 4 последовательных стадии.

  1. Задача в том, чтобы проверять, выполняется ли R ⊂ P. множества, стоящие в позиции P, даются командой навроде nm --dynamic -j -U /usr/lib64/libyourfavourite.so.N. множества, стоящие в позиции R, даются командой навроде nm --dynamic -j -u /usr/bin/yourfavouriteprog, или там может быть иной .so. Тут, наверное, ещё и введение в предметную область должно быть.

  2. hash: N элементов сбрасываются в этот самый хеш; его эффективность бы стоило оценить хорошенько. (гипотеза от меня: он вообще-то плохой и даёт много коллизий на интересных нам инпутах), в результате K <= N отсортированных хешей, чисел из [0; 2**10) (по умолчанию 10 бит на хеш);

  3. delta: K <= N чисел из прошлого шага заменяются на разности с предыдущими, и получаются по-другому распределённые числа, чаще маленькие и очень, очень мало сверхбольших; есть мнение, что они для равномерно распределённых хешей распределены геометрически;

  4. golomb: эти K разностей кодируются по Rice-Golomb (https://en.wikipedia.org/wiki/Golomb_coding), делитель по умолчанию 2**7; получается префиксный код из K битострок, которые можно слева направо прочесть без lookahead и восстановить массив разностей;

  5. (якобы) base62: их конкатенация кодируется в буквы.

(2) и (3) близки к очевидно-понятным; я поизучал, реализовал на питоне (https://altlinux.space/arseny/atsv-research) и снова поизучал. А вот (1) и (4) я не занимался совсем. От (4) у меня тоже башка взрывается, а (1) можно очень хорошо так поизучать, и существует, наверное, обширная литература. [6/23/26 9:57PM] Arseny: grep -A16 Jenkins lib/set.c вот в этом дереве исходников (https://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=blob;f=lib/set.c;h=9474a2ee6d7c;hb=a01a87db6e8a) [6/23/26 9:57PM] Arseny: Пусть параметр-делитель равен M, и энкодеру на вход поступает число A. Тогда ищутся такие q и r < q, что A = qM + r. Частное кодируется унарной кодировкой из единиц, за ним следует нулик, а далее ровно log₂M бит на остаток. Подобрать M нужно с умом.

python3 stringset.py 10 7 <<EOF
foo
bar
quux
EOF
hashes=[298, 487, 588]
deltas=[298, 189, 101]
codes=[b'1100101010', b'100111101', b'01100101']
golomb divisor: 128 (minimum word bit length: 8)
total bit length: 27
per-elem bit length: 9.000

Но здесь не хеш из файла выше, а питонический hash() обычный. Чтобы смотреть на актуальные результаты, нужно подсунуть актуальный. [6/23/26 9:58PM] Arseny: А вот страничка set:version на ALT Wiki (https://www.altlinux.org/Set-version) [6/23/26 9:58PM] Arseny: Putze, F.; Sanders, P.; Singler, J. (2007), 253 * "Cache-, Hash- and Space-Efficient Bloom Filters", 254 * http://algo2.iti.uni-karlsruhe.de/singler/publications/cacheefficientbloomfilters-wea2007.pdf [6/23/26 9:58PM] Arseny: Сайта нет, но статью поискать https://t.me/c/1622441719/1359/9771 [6/23/26 9:59PM] Arseny: И ещё наследие Алексея Турбина: https://ftp.altlinux.org/pub/people/at/ https://github.com/svpv