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

Подскажите, такой алгоритм можно только с unsafe написать? я хочу дерево

с обходом Breadth-First, при этом максимально выжать все что можно по производительности, так как планирую запускать метод visit очень много раз, на большие деревья каждую ms.

Хочется избавится от любого лишниго выделения памяти даже в стеке, и везде использовать ссылки на уже существующие данные.

тут как видно rust не может передать владение child, так как он перезатирается в конце каждой итерации for цикла.

Пока никаких идей кроме unsafe в голову не приходит, мб есть ещё способы это реализовать без копирования?

20 ответов

11 просмотров

а тут точно должно быть не for child in &cur.child?

Konstantin- Автор вопроса
Alexey Sokolovskiy
а тут точно должно быть не for child in &cur.child...

о, помогло. А как это работает, мы сохраняет ссылку на ссылку в итоге в queue?

а зачем упарываться по производительности, когда надо закешировать все что можно и получать данные за хотя бы O(log) вместо O(n)?

Konstantin
о, помогло. А как это работает, мы сохраняет ссылк...

нет, ссылку на вершину дерева, которое уже живет в self то есть &self - это ссылка на дерево, которое как-то лежит уже в памяти и на них сохраняем ссылки

unsafe здесь точно не поможет

Mister Tomato
а зачем упарываться по производительности, когда н...

затем что иногда нужно иметь дерево, а раз дерево то и ходить по нему нужно

Αλεχ Zhukovsky
затем что иногда нужно иметь дерево, а раз дерево ...

вот иногда и ходите по дереву если надо иногда, а если надо очень часто и на больших деревьях то надо менять подход

Mister Tomato
вот иногда и ходите по дереву если надо иногда, а ...

возьмем тот же SQL, любой поиск оп индексу это ходим по дереву и что-то смотрим. Какой подход тут менять?

Αλεχ Zhukovsky
возьмем тот же SQL, любой поиск оп индексу это ход...

у вас линейный поиск, возьмите красное черное дерево и ищите за логарифм

Konstantin- Автор вопроса
Mister Tomato
вот иногда и ходите по дереву если надо иногда, а ...

мне очень часто и всегда по всем элементам (причем мутабельно их менять при обходе). если кратко: делаю игру, там будет что-то вроде электро-сеть. В дереве каждая нода это здание или электро-столб. Между нодами нужно каждый кадр игры передавать что-то вроде электричества (у root ноды -= someFloat, у детей += someFloat) (от рута дальше вниз по дереву).

Konstantin
мне очень часто и всегда по всем элементам (причем...

а вот мутабельность кстати будет непросто добавить, потому что придётся одновременно в очереди держать мутабельные ссылки на разные элементы, но компилятору-то не доказать, что они разные :) и потом в правильном порядке ещё нужно обходить (сначала менять детей, потом — родителей, потому что иначе изменение родителя может удалить детей, а если хранить на них указатели, то..), тут уж придётся либо ансейф, либо rwlock, либо mutex, либо арены, либо что-то ещё для динамического управления памятью

Денис
а вот мутабельность кстати будет непросто добавить...

тут вроде не очень сложно: если дерево меняется только этой функцией, то просто заменить &self на &mut self, и for child in cur.child.iter_mut()

Konstantin- Автор вопроса
Денис
а вот мутабельность кстати будет непросто добавить...

у меня динамического добавления или удаления самих нод в дереве не будет, только изменение value. Попробую пока самый простой подход, надеюсь без unsafe получится

Konstantin
мне очень часто и всегда по всем элементам (причем...

что если у вас каждая нода иммет список других нод подписчиков (и как только вы обновляете ноду, вы уведомляете всех кто с ней связан?) и тогда линейное время для проходу по всему граффу не придется тратить? В общем я пытаюсь сказать то, что вам нужно над дизайном подумать и структурами а не пытаться оптимизировать то что и так на 95% работает от максимальной скорости

Денис
а вот мутабельность кстати будет непросто добавить...

Почему? pub fn visit(&self, f: &mut impl FnMut(&T)) { что тут доказывать

А можете скинуть код на play.rust-lang.org? Интересно попробовать стало

Денис
FnMut(&mut T)

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=c0c638fc3f3a53b7d73483e8ed7e2050

Konstantin- Автор вопроса
Mister Tomato
что если у вас каждая нода иммет список других нод...

ну если смотреть с точки зрения того что я пытаюсь сделать, в игре есть источники энергии (типо электро-станция), который каждый кадр передают энергию дальше по дереву. В любой имлементации, хоть событиями, хоть деревом, хоть списком, всё равно нужно каждый кадр обновить все N элементов, тут всегда будет O(N) и никак это не захешировать, в этом суть логики игровой. но в рамках O(N) я пытаюсь сделать максимально быстрый проход по дереву с изменением value каждого из объектов (в моем случае value это какой-то float с хранением тек. кол-ва энергии у здания)

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта