172 похожих чатов

Добрый день! У меня есть следующая задача. Есть Итератор. Этот Итератор изнутри

использует RangeMut(которым он владеет) по значениям BTreeMap(которым он НЕ владеет). Итератор возвращает значения, связанные временем жизни с BTreeMap, которым он не владеет.

В ряде случаев мне нужно, чтобы Итератор продвигал RangeMut к заданному известному ключу.

У RangeMut нет такого функционала. Тривиальное рашение этой задачи — это просто в цикле вызывать next() у итератора RangeMut. Но в этом случае эффективность продвижения будет O(m), где m — число элементов, которые я заскипал. Это решение, на первый взгляд, неэффективно, так как BTreeMap, вообще говоря, это коллекция с бинарным поиском. То есть продвинуться, теоретически, можно было бы за логарифмическое время от m, а не за линейное. И хотелось бы так и сделать.

Чтобы перепрыгнуть за логарифмическое время можно было бы пересоздать RangeMut, но я этого сделать не могу, так как Итератор не владеет исходным BTreeMap.

Как эту задачу можно было бы решить?

7 ответов

33 просмотра

Монжо например не пользоваться итераторами, просто делать доступ по индексу, мутабельно одалживая нужные элементы

Ilya-Lakhin Автор вопроса
Сергей
Монжо например не пользоваться итераторами, просто...

Интересная мысль, но доступ по индексу будет каждый раз иметь логарифмическое время. Это получится сильно дороже. Кроме того, мы потеряем кеш.

Ilya-Lakhin Автор вопроса
Сергей
А ты уверен, что итерация не log(n)?

Абсолютно уверен. Это же BTree+

Сергей
А ты уверен, что итерация не log(n)?

O(log(n)) вызов next в худшем случае, но O(1) в среднем И O(log(n) + k) на вызов next k раз подряд

Ilya Lakhin
Абсолютно уверен. Это же BTree+

Тогда всё будет зависеть от того, сколько ты скипаешь и сколько итерируешь. Если например скипаешь большие интервалы, может есть смысл пересоздавать итератор, чтобы по тем, которые НЕ скипаешь идти за O(1). Ну и может на другую структуру тоже есть смысл посмотреть. Сортированный вектор например.

Ilya-Lakhin Автор вопроса

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта