Повторяющийся обход дерева

Быстрый поиск в Google показал, что это должно быть проблемой JAVA. Взгляните на: https://helpx.adobe.com/aem-forms/kb/java-update-compatability-md5.html

и попробуйте изменить / добавить [110 ] в этом файле: %JAVA_HOME%\jre\lib\security\java.security

Для новых приложений я бы рекомендовал создать новый ключ подписи

14
задан Pete Kirkham 16 April 2009 в 14:58
поделиться

4 ответа

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

Если вы выполняете поиск в глубину, то рекурсия является наиболее естественным способом кодирования обхода. Однако, если ваш компилятор не оптимизирует хвостовую рекурсию в итерацию, Ваша рекурсивная реализация будет медленнее, чем итеративный алгоритм, и умрет с переполнением стека на достаточно глубоком дереве.

Несколько быстрых Python, чтобы проиллюстрировать разницу:

#A tree is a tuple of an int and a tree. 
t = (1, (2,(4, (6), (7, (9)) )), (3, (5, (8)) ))
def bfs(t):
    to_visit = [t]
    while len(to_visit) > 0:
        c = to_visit[0]
        if type(c) is int:
            print c
        else: 
            print c[0]
            to_visit.append(c[1])
            if len(c) > 2: to_visit.append(c[2])
        to_visit = to_visit[1:]

def dfs(t):
    if type(t) is int:
        print t
        return 
    print t[0]
    dfs(t[1])
    if len(t) > 2: dfs(t[2]) 

bfs(t)
dfs(t)
19
ответ дан 1 December 2019 в 10:04
поделиться

Если у вас есть фиксированный объем памяти, выделенный для стека, как вы часто это делаете (это особенно проблема в многие конфигурации Java JVM), рекурсия может не работать хорошо, если у вас глубокое дерево (или если глубина рекурсии велика в любом другом сценарии); это вызовет переполнение стека. Итеративный подход, подталкивающий узлы для посещения очереди (для BFS-подобного обхода) или стека (для DFS-подобного обхода), имеет лучшие свойства памяти несколькими способами, поэтому, если это имеет значение, используйте итеративный подход.

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

8
ответ дан 1 December 2019 в 10:04
поделиться

It depends on whether you want to do Depth-First or Breadth-First traversal. Depth-first is the easiest to implement via recursion. With Breadth-first you need to keep a queue of nodes to expand in the future.

1
ответ дан 1 December 2019 в 10:04
поделиться

На самом деле вы должны использовать очередь для поиска в ширину и стек для поиска в глубину, и запустить свой алгоритм из цикла while. Выполнение рекурсивных вызовов функций может значительно затянуть вашу программу, если вы делаете простые операции при обходе, и может вызвать переполнение стека, но в эти дни вы бы нужно очень сильно постараться, чтобы увидеть его.

Просто добавьте хэш, чтобы отслеживать уже посещенные узлы, если это не так. дерево, но хорошо связанный граф.

1
ответ дан 1 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

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