Size: a a a

2020 April 25

EG

Emmanuel Goldstein in rust_offtopic
Если длина исходной строки — N, то я выполняю сначала N операций, чтобы построить свою структуру, а потом ещё log(N)  каждый раз, когда мне нужно найти номер строки для оффсета
источник

SS

Stanislav Sagan in rust_offtopic
Emmanuel Goldstein
Если длина исходной строки — N, то я выполняю сначала N операций, чтобы построить свою структуру, а потом ещё log(N)  каждый раз, когда мне нужно найти номер строки для оффсета
Так String где ты делаешь поиск имутабельная, как я понял. Значит не нужно тебе считать там строки каждый раз
источник

EG

Emmanuel Goldstein in rust_offtopic
Stanislav Sagan
Так String где ты делаешь поиск имутабельная, как я понял. Значит не нужно тебе считать там строки каждый раз
Ну, я один раз ищу все ньюлайны и бью по ним строку
источник

EG

Emmanuel Goldstein in rust_offtopic
А потом бинпоиском ищу ту line, в которой находится нужный оффсет
источник

EG

Emmanuel Goldstein in rust_offtopic
Спасибо стандартной библиотеке Rust за то, что там есть бинпоиск
источник

SS

Stanislav Sagan in rust_offtopic
Emmanuel Goldstein
А потом бинпоиском ищу ту line, в которой находится нужный оффсет
А, ну и норм. По идее быстрее и не получится
источник

EG

Emmanuel Goldstein in rust_offtopic
Можно быстрее и быстрее, но гораздо дороже по памяти
источник

EG

Emmanuel Goldstein in rust_offtopic
Можно все номера байтов сложить в хешмапу из номера байта в номер строки
источник

EG

Emmanuel Goldstein in rust_offtopic
Тогда определить строку по оффсету можно мгновенно
источник

EG

Emmanuel Goldstein in rust_offtopic
Но это оверкилл
источник

EG

Emmanuel Goldstein in rust_offtopic
Emmanuel Goldstein
Я уже, в целом, нашёл решение
Итератор по 2-чанкам следующей последовательности:
— 0
далее, для каждого ньюлайна
— индекс ньюлайна
— индекс плюс один
далее
— длина строки
Я, собственно, этот итератор долго составлял, дальше всё просто
источник

SS

Stanislav Sagan in rust_offtopic
Emmanuel Goldstein
Но это оверкилл
Ага, сильно оверкилл.
источник

SS

Stanislav Sagan in rust_offtopic
Emmanuel Goldstein
Можно все номера байтов сложить в хешмапу из номера байта в номер строки
Лучше уже тогда предположить среднестатистическую длину строки в символах, и может попробовать бить более точнее чем бинпоиск.. Так то мысли для размышления, если ты уже заморачиваешься)
источник

EG

Emmanuel Goldstein in rust_offtopic
Stanislav Sagan
Лучше уже тогда предположить среднестатистическую длину строки в символах, и может попробовать бить более точнее чем бинпоиск.. Так то мысли для размышления, если ты уже заморачиваешься)
Бью я просто по ньюлайнам, без изысков, а потом ищу бинпоиском по уже разбитым строкам
Плохо представляю себе, как знание средней длины строки может помочь
источник

SS

Stanislav Sagan in rust_offtopic
Emmanuel Goldstein
Можно все номера байтов сложить в хешмапу из номера байта в номер строки
И тогда уже не в хешмапу а в массив просто. Ключи не имеют смысла, если они просто от нуля до длины string.len()
источник

EG

Emmanuel Goldstein in rust_offtopic
Stanislav Sagan
И тогда уже не в хешмапу а в массив просто. Ключи не имеют смысла, если они просто от нуля до длины string.len()
Логично, да
источник

SS

Stanislav Sagan in rust_offtopic
Emmanuel Goldstein
Бью я просто по ньюлайнам, без изысков, а потом ищу бинпоиском по уже разбитым строкам
Плохо представляю себе, как знание средней длины строки может помочь
Ну типа бинпоиск заглянет сразу в середину, а ты можешь по средней длине строки прикинуть куда нужно глянуть чтоб не в середину, а если пропамзал, скорректировать на сколько промазал опять отталкиваясь на среднюю длину строки.. ну это я к примеру. Так то я не знаю как оно будет быстрее или медленнее. Знаю что сравнения дешевле чем вычисления. Так что я бы не заморачивайся над своим поисковым велосипедом))) Наверное.
источник

EG

Emmanuel Goldstein in rust_offtopic
А. Ну технически можно, да, особенно с учётом того, что среднюю длину строки я знаю.
источник

SS

Stanislav Sagan in rust_offtopic
Но опять же, это бенчмаркать нужно наверное будет. Не знаю будет ли смысл. Просто мысли вслух
источник

EG

Emmanuel Goldstein in rust_offtopic
Но это, кажется, уже слишком. Я не хочу каждый раз перебирать всю строку, логарифм от длины меня устроит
источник