|
Быстрый поиск по дереву. в дереве n уровней. поиск по последнему элементу в дереве. | ☑ | ||
---|---|---|---|---|
0
zladenuw
11.03.20
✎
01:46
|
Поиск по последнему элементу в дереве. как реализовать ?
|
|||
1
DEVIce
11.03.20
✎
05:41
|
(0) Рекурсивный обход. Пара строчек кода.
|
|||
2
strange2007
11.03.20
✎
05:57
|
Если по последнему элементу, тогда рекурсивно позиционироваться на последнюю строку коллекции родительской строки, пока не получишь строку без строк. Это и будет последний элемент в дереве
А вот если по последнему уровню, тогда да, рекурсивно спускаться до нижнего уровня и НайтиСтроки |
|||
3
rphosts
11.03.20
✎
06:19
|
(0) уровней("самых глубоких") может быть несколько... как и элементов в разных ветках иерархии. Задача неоднозначна
|
|||
4
rphosts
11.03.20
✎
06:27
|
+ (3) любая рекурсия заменяется циклом, да менее удобно, но скорость и память! С точки зрения программиста (а не одинэсника, хотя и тут есть разные мнения) глубоковложенная рекурсия куда контекстно тащатся десятки и сотни килобайт данных - прекрасный образчик говнокода. И к тому-же даже при минимальном контексте рекурсия глубже примерно 4500 приводит к падению сеанса, но до этой глубины мало кому удавалось нырять.
|
|||
5
strange2007
11.03.20
✎
06:55
|
(4) >> С точки зрения программиста
Уточняй, что с точки зрения явиста или сишника, которые вообще не представляют о программировании ни-че-го. Со стороны машины, многие рекурсии потребляют меньше памяти, чем при плоском обходе. А то нашёл тут программистов, которые вообще не представляют как данные располагаются в памяти. Хех! А знаешь почему рекурсия меньше памяти ест? Да потому что у тебя данные о вложенности более структуированы и компактны, нежели при плоском анализе, где иногда такая каша собирается только по информации про уровни, что просто жесть. Вот как раз 1С-ники про это знают. А то ишь, блин, 1С-ников записал в непонятно кого))))))) Примечание: ассемблер, это на всю жизнь |
|||
6
rphosts
11.03.20
✎
06:59
|
(5) Сишняк наше всё! каждая рекурсия - это ты снова хапаешь памяти для передачи параметров. Сам по себе цикл работает с одной копией данных в памяти, хотя конечно и внутри цикла можно начать какие-то таблицы создавать/заполнять.
Ассемблер... ничего красивее адресации к данным на уровне машкода чем в PDP-11 не видел (возможно у VAX было ещё красивее, но не приходилось)... |
|||
7
DEVIce
11.03.20
✎
07:30
|
(6) "каждая рекурсия - это ты снова хапаешь памяти для передачи параметров". Указатели? Не, не слышали. :)
|
|||
8
strange2007
11.03.20
✎
07:59
|
(6) Та неееее, там самая трубень начинается, когда расслабленный и воодушевлённый красивостью рекурсии, передаёшь вниз копию за копией данных. А вот когда используешь обход плоской модели, то тут расчётные данные узлов могут сделать тоже самое - многократное дублирование данных на каждой итерации. И самая главная фигня, из-за которой не люблю плоские обходы, это когда создаёшь трансформированные данные для всего дерева. Там избыточность иногда получается большая.
В общем я должен был защитить рекурсию, потому что моё дерево на ассемблере как раз часто обходится рекурсивно. Ну не буду же признаваться в своей слабости то |
|||
9
strange2007
11.03.20
✎
08:10
|
(0) Если надо периодически производить поиски, тогда можно первый раз закэшировать нужные ветки дерева во что-то круто индексируемое и потом искать уже очень быстро. Но тут памяти будет расходоваться больше
|
|||
10
rphosts
11.03.20
✎
08:14
|
(8) ВК на асме для 1С?
|
|||
11
strange2007
11.03.20
✎
08:20
|
(10) Не, я для своих поделок. Такое представление данных более удобно. Ну и что я, не 1С-ник что ли? Куда ж без дерева то?
|
|||
12
rphosts
11.03.20
✎
08:21
|
(7) для дерева не канает, типичный обход дерева рекурсией: http://catalog.mista.ru/public/72380/
Процедура СчитатьСуммыДЗ(СтрокиДЗ) Для Каждого СтрокаДерева Из СтрокиДЗ Цикл // Если мы в строке, у неё нет итогов, пропустим Если СтрокаДерева.Строки.Количество() = 0 Тогда Продолжить; КонецЕсли; СчитатьСуммыДЗ(СтрокаДерева.Строки); // Для текущей записи вычислим сумму строк колонки СтрокаДерева.ФактОстаток = СтрокаДерева.Строки.Итог("ФактОстаток"); КонецЦикла; КонецПроцедуры // СчитатьСуммыДЗ() на каждой новой итерации пока идёшь вглубь новая коллекция строк, да она будет передана по ссылке, но если это не последний уровень - на следующем шаге будет создана ещё 1 коллекция |
|||
13
APXi
11.03.20
✎
08:28
|
Засунь данные во что нибудь где будут поля поле поиска(желательно индексируемое) и ссылка на строку дерева.
|
|||
14
Сияющий в темноте
11.03.20
✎
09:01
|
я так и не понял,какой последний элемент мы хотим найти.
ну,сидим мы у корня дерева,смотрим вверх,куда нужно смотреть,на шидирующмй побег или на самую ветвистую ветвь? а если у нам куст? на ассемблере под параметры расходуется стек,однако. |
|||
15
trad
11.03.20
✎
09:10
|
(12) " да она будет передана по ссылке, но если это не последний уровень - на следующем шаге будет создана ещё 1 коллекция"
Нет не будет. В следующую вложенность будет передана ссылка на другую, уже существующую в дереве, коллекцию строк. |
|||
16
strange2007
11.03.20
✎
09:15
|
(14) >> на ассемблере под параметры расходуется стек,однако.
Это кто как придумает. Не всегда стек используется, можно просто в памяти структуру организовать и её использовать |
|||
17
strange2007
11.03.20
✎
09:42
|
Нафиг ассемблер. Расплодили ассемблеров, теперь вообще в них фиг разберёшься. Раньше был tasm и masm, всё просто. А сейчас...
Автор, люди дело говорят, с рекурсией будь аккуратней, но я задам вопрос публике: Подскажите, а как в 1С обойти дерево без рекурсии, если уровень вложенности неизвестен? |
|||
18
Сияющий в темноте
11.03.20
✎
19:03
|
(17) массив вложенности и цикл
добавляем в массив корень в цикле берем из массива строку выбираем к ней подстроки и пихаем в массив,закончив идем к следующему элементу массива. когда мы пройдем весь массив,то в нем будут все строки дерева. |
|||
19
Сияющий в темноте
11.03.20
✎
19:05
|
на самом деле,очень затратная по памяти операция,можно имитацию рекурсии делать,сохраняя в массив только родительские строки.
|
|||
20
fisher
12.03.20
✎
12:11
|
(0) Два вопроса.
1) О каком дереве речь? Об одинэсном или другом каком? 2) Что такое "последний элемент дерева"? ЗЫ. Есть несколько классических способов обхода деревьев. Легко гуглится. |
|||
21
pechkin
12.03.20
✎
12:16
|
если дерево упорядоченно, то можно методом дихотомии
|
|||
22
pechkin
12.03.20
✎
12:17
|
(17) это называется перебор с возвратом
|
|||
23
fisher
12.03.20
✎
13:24
|
(17) > Подскажите, а как в 1С обойти дерево без рекурсии, если уровень вложенности неизвестен?
А в чем проблема-то? Реализуешь стек на массиве и заменяешь рекурсию на циклы с явным запоминанием/восстановлением состояний в стеке. Только зачем? Как раз для обхода деревьев рекурсия как правило самое оно. |
|||
24
fisher
12.03.20
✎
13:25
|
Не говоря уже о том, что работа с суррогатным стеком в 1С выйдет дороже, чем рекурсия.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |