Быстрый поиск в Google показал, что это должно быть проблемой JAVA. Взгляните на: https://helpx.adobe.com/aem-forms/kb/java-update-compatability-md5.html
и попробуйте изменить / добавить [110 ] в этом файле: %JAVA_HOME%\jre\lib\security\java.security
Для новых приложений я бы рекомендовал создать новый ключ подписи
Если вы выполняете поиск в ширину, естественная реализация состоит в том, чтобы помещать узлы в очередь, а не использовать рекурсию.
Если вы выполняете поиск в глубину, то рекурсия является наиболее естественным способом кодирования обхода. Однако, если ваш компилятор не оптимизирует хвостовую рекурсию в итерацию, Ваша рекурсивная реализация будет медленнее, чем итеративный алгоритм, и умрет с переполнением стека на достаточно глубоком дереве.
Несколько быстрых 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)
Если у вас есть фиксированный объем памяти, выделенный для стека, как вы часто это делаете (это особенно проблема в многие конфигурации Java JVM), рекурсия может не работать хорошо, если у вас глубокое дерево (или если глубина рекурсии велика в любом другом сценарии); это вызовет переполнение стека. Итеративный подход, подталкивающий узлы для посещения очереди (для BFS-подобного обхода) или стека (для DFS-подобного обхода), имеет лучшие свойства памяти несколькими способами, поэтому, если это имеет значение, используйте итеративный подход.
Преимущество рекурсии - это простота / элегантность выражения, а не производительность. Помните, что это ключ к выбору подходящего подхода для данного алгоритма, размера проблемы и архитектуры машины.
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.
На самом деле вы должны использовать очередь для поиска в ширину и стек для поиска в глубину, и запустить свой алгоритм из цикла while. Выполнение рекурсивных вызовов функций может значительно затянуть вашу программу, если вы делаете простые операции при обходе, и может вызвать переполнение стека, но в эти дни вы бы нужно очень сильно постараться, чтобы увидеть его.
Просто добавьте хэш, чтобы отслеживать уже посещенные узлы, если это не так. дерево, но хорошо связанный граф.