Один из моих любимых вопросов на собеседовании -
За время O (n) и пространство O (1) определите, содержит ли связанный список цикл.
Это можно сделать с помощью алгоритма поиска цикла Флойда.
Мой вопрос в том, можно ли получить такие хорошие временные и пространственные гарантии при попытке определить, содержит ли двоичное дерево цикл. То есть, если кто-то дает вам struct
определение в духе
struct node {
node* left;
node* right;
};
Насколько эффективно вы можете проверить, что данная структура действительно является двоичным деревом, а не, скажем, DAG или графом, содержащим цикл?
Есть ли алгоритм, который, учитывая корень двоичного дерева, может определить, содержит ли это дерево цикл за время O (n) и лучше, чем за O (n) пространство? Ясно, что это можно сделать с помощью стандартной DFS или BFS, но для этого требуется O (n) пространства. Можно ли это сделать в O (n) пространстве? O (log n) пробел? Или (Святой Грааль) всего за O (1) пространство? Мне любопытно, потому что в случае связанного списка это можно сделать в пространстве O (1), но я никогда не видел соответствующего эффективного алгоритма для этого случая.
bool containsCycle(Tree t) { return false; }
. Деревья не могут содержать циклов по определению. Вы хотели спросить, есть ли в каком-нибудь общем графике цикл? - person Peter Alexander   schedule 21.08.2011O(log n)
пространством, аналогично тому, как вы получили бы быструю сортировку для использованияO(log n)
пространства: рекурсивно только на меньшем поддерево и повторение / использование хвостовой рекурсии на большем дереве. - person IVlad   schedule 22.08.2011