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

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

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

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

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

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

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

7 ответов

6 просмотров

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

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 Автор вопроса

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
How to create an OS in C? what to study?
Linus
18
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта