|
|
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
Строю дерево произвольной ширины и глубины. Узел дерева: Код: java 1. 2. 3. 4. 5. 6. 7. Корнем дерева является узел с ключом (key) == topNode Начиная от childs корневого узла необходимо получить все цепочки ключей, например key1 - key12 key1 - key13 - key123 key1 - key13 - key234 key2 - key22 - key277 итд. Вот как я это делаю: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Но это потоконебезопасно. Если кто запустит keySet() пока работает другой keySet() результат будет не предсказуем. Можно лочить keys, но это в нагруженной системе будет узким местом. Можно ли как-то еще получить цепочки ключей? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 18:04 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
Что касается многопоточности то тут скорее проблема в том, что другой поток может изменить саму структуру данных, а не ваш keySet, который фиксится банальным выносом private Set<List> keys = new HashSet<>(); из вне метода внутрь. Нет шаринга данных - нет проблем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 18:18 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
G.Collector, Рекурсию всегда можно развернуть в цикл. По поводу многопоточности не понятно что именно вы хотите. Синглтон? Или параллельное вычисление? Каждому потоку дать свой экземпляр во время поиска ключей. Можно это разными способами делать. Можно keys сделать аргументом метода. Можно отделить объект дерева от объекта поиска ключей. Можно создать структуру в которой поиск не понадобится а список будет сформирован вместе с формированием дерева ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 18:32 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
BlazkowiczG.Collector, Рекурсию всегда можно развернуть в цикл. По поводу многопоточности не понятно что именно вы хотите. Синглтон? Или параллельное вычисление? Каждому потоку дать свой экземпляр во время поиска ключей. Можно это разными способами делать. Можно keys сделать аргументом метода. Можно отделить объект дерева от объекта поиска ключей. Можно создать структуру в которой поиск не понадобится а список будет сформирован вместе с формированием дерева Вот мне кажется, что это самый лучший вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 18:46 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
«Лучший» вариант зависит от того как и когда вы этот список будете использовать. Фактически может оказатся что такой список вам и не нужен вовсе. Просто нужна дополнительная информация в узлах чтобы обойти их нужным вам образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2018, 19:02 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
G.CollectorМожно лочить keys, но это в нагруженной системе будет узким местом. Мы сейчас говорим о том чего нет и проектируем структуру данных под неизвестный юзкейс. Серебрянной пули для вашего решения нет. И все реализации деревьев что мы придумаем будут очень сильно зависеть от количества активных читателей и писателей этого дерева. Для структур данных с минимальной конкуренцией обычно делают страничную память и для каждой страницы фиксируют серийный номер версии. Потоки работают атомарно с номером версии а со страницей эксклюзивно. Если поток писатель хочет писать то он создают свою версию страницы. Потоки читатели - читают безопасно страницу с учотом версии. Вобщем все как в базах данных. Как вы разложите дерево в страничную память это та еще дилемма. Вобщем версионные структуры очень сложны. И может быть проще пересмотреть ваш алгоритм чем подпиливать дерево под универсальный случай которого мы не знаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 00:46 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
G.CollectorМожно ли как-то еще получить цепочки ключей?расшарить в базе. Там и запрос для цепочки уже есть. И лочить не надо)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 07:15 |
|
||
|
Получение всех цепочек ключей дерева
|
|||
|---|---|---|---|
|
#18+
Мне кажется что если каждая нода дерева будет знать не только своих детей, но и количество всех листьев в потомках, то используя эту информацию можно по индексу пути вычислить полный путь к листу. Если я правильно понял пример, то нужны пути только к листьям. Соответсвенно, зная количество дочерних листьев и индекс пути, всегда можно вычислить какой из детей находится в этом пути. Это и будет той дополнительной информацией о которой я говорил ранее. Если эту информацию обновлять во время построения дерева, то задача вычисления путей отсутсвует в принципе. Список уже будет доступен в самом дереве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2018, 07:33 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=46&tid=2122035]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 10ms |
| total: | 150ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...