PDA

Просмотр полной версии : Алгоритмы найти диапазон видимых итемов


undefined
13.03.2018, 18:02
что-то не прет мысль никак.
Имеется массив итемов в вертикальном скроллвью.У каждого итема своя высота:0<height<maxHeight.
Требуется найти индексы итемов,попадающие в окно (minY;maxY).Функция будет вызываться раз в кадр,поэтому важна производительность.Мне кажется или решить задачу можно только полным перебором(в худшем случае)?

ZergMaster
13.03.2018, 18:31
можно завести темп массив (допустим с именем veiwportItems), содержащий в себе итемы (либо индексы итемов), Y которых > minY и < maxY. Массив обновлять при прокручивании скролла.
Соответственно каждый итем может иметь в себе ссылку на veiwportItems и на оверайд сеттера своего .y добавлять либо удалять себя из veiwportItems. Это если именно итемы срокллятся. Если скроллится их контейнер, то придется перебирать полюбэ.. но уже в сеттере игрика контейнера. Впринципе, сложность n это не так плохо.

undefined
13.03.2018, 18:41
Впринципе, сложность n это не так плохо.

А у обычного перебора какая сложность? :)
По мере листания в скроллвью добавляются новые итемы и мысль что чем дальше листаешь,тем больше тормозит удручает.Я думал может какой-нибудь вариант с bsp tree (https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0% BD%D1%81%D1%82%D0%B2%D0%B0) намудрить, там хотя бы n*log(n) обещают.

ZergMaster
13.03.2018, 19:33
А у обычного перебора какая сложность?
n. Я это и имел ввиду, что простой перебор это не так плохо)
Если итемы появляются по мере скроллинга, то есть вариант, например, сохранять индекс последнего "уползшего" вверх (в переменную begunIndex)и перебирать начиная с него до (begunIndex + (height вьюпорта скролла / minHeight итема)). А если вниз то наоборт.

undefined
13.03.2018, 22:00
ну да, а для редких случаев смены позиции через setScrollPosition можно и перебрать все.