2013-09-04 4 views
2

Я ищу вычисления сложности моего кода. Это просто DFS (поиск по глубине в DFS). DFS работает на графике (конечный автомат) от конца до начала (обратный поиск). Всякий раз, когда он достигает начала, он накапливает строку, которая заставляла ее запускаться, и пытается эту строку на другом графике с другой DFS, чтобы проверить, достигает ли она и начало состояния на другом графике с той же строкой.DFS в DFS, DFS с известной строкой

Внешняя сложность DFS определенно O (Vo + Eo), где Vo: число вершин во внешнем графе и Eo: количество ребер во внешнем графе. Но какова сложность внутри DFS, когда известна строка, которая будет следовать?

И если возможно, можете ли вы также ответить на всю сложность алгоритма?

Я не уверен, является ли это O ((Ео + Vo) + (Ei + Vi)) или O ((Ео + Vo) (Ei + Vi)) или smtg .else

Спасибо advance,

+0

O (| строка | (Eo + Vo)) .. где | строка | это размер строки –

+0

благодаря Халеду. это то, что я сначала подумал, но как насчет путей во второй DFS, которые искали и не заканчивались в начальном состоянии? Не должно быть кумулятивного термина вместо просто | string | ? –

+0

Это потому, что вы используете график для разбора конечного состояния машины, если он детерминирован, тогда это O ((Eo + Vo) + | string |), если он стохастичен, тогда это O ((Eo + Vo) * | string |) –

ответ

0

Это зависит от того, что вы делаете в случае неудачи второй DFS. В противном случае я хочу сказать, что второй граф не содержит строку, найденную в первой DFS.

Если второй отказ DFS означает, что вы возвращаетесь назад и выполняете поиск другой строки в первой DFS, а затем повторите попытку второй DFS, тогда ваша сложность O((Eo+Vo)*(Ei+Vi)), потому что вы можете в худшем случае выполнить полную DFS второго графика для каждый путь DFS к стартовому узлу в первой DFS.

Если второй отказ DFS означает, что вы остановились, вы в худшем случае выполните одиночную DFS первого графика и одну DFS второго графика, дающую вам худшую сложность O((Eo+Vo)+(Ei+Vi)).

Тот факт, что вы являетесь DFS, чтобы проверить, содержит ли граф строку, означает, что в некоторых случаях вы можете рано или поздно завершить свою DFS (например, вы достигнете вершины без запуска, не оставив никаких символов для проверки). Однако, сможете ли вы закончить раннее, полностью зависит от структуры графика, поэтому я бы сказал, что вторая DFS находится в худшем случае O(Ei+Vi), потому что с неприятным графиком вы все равно можете пройтись по всем краям и всем вершины.

+0

нет возможности не дойти до начала во второй DFS. он должен достичь, чтобы начать через строку, полученную в первой DFS. Поэтому он пробует каждую строку, которая достигает начала в первой DFS, во второй DFS. Поскольку худший случай - наша забота и худший случай не может быть хуже, чем | string | как сказал Халед, это не должно быть связано с O (Ei + Vi). То, что я застрял, это то, что если он пытается эту строку длины | string | много раз и доходит до конца. чем это также должно быть больше, чем | string | –

+0

@ ŞuleSelin Что делать, если во втором графике у вас есть вершина, у которой есть ряд ребер, помеченных одним и тем же персонажем, выходящим из него? Это возможно? Я думаю, что с «O (Ei + Vi)» вы в безопасности, потому что вторая DFS не может быть больше, и поэтому у вас есть хорошая (если не самая маленькая) верхняя граница. – cyon

+0

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