使用迭代而不是递归的拓扑排序
Topological Sort using Iteration instead of Recursion
我最初有这个拓扑排序的递归解决方案:
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
visited[v] = true;
node* curr = adjList[v];
while (curr != NULL) {
if(!visited[curr->val]) {
dfs(curr->val, visited, adjList, myStack);
}
curr = curr->next;
}
myStack.push(v);
}
它似乎符合我的目的。但是我无法将其转换为迭代解决方案。这是我的尝试:
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
std::stack<int> recursion;
visited[v] = true;
recursion.push(v);
while( !recursion.empty() ) {
v = recursion.top();
recursion.pop();
node* curr = adjList[v];
myStack.push(v);
while (curr != NULL) {
if(!visited[curr->val]) {
visited[curr->val] = true;
recursion.push(curr->val);
}
curr = curr->next;
}
}
}
但是订单完全搞砸了!我认为这可能是由于我的myStack.push(v)
定位,但我不知道如何处理这个问题。任何帮助将不胜感激。
我想
我解决了自己的问题。从本质上讲,您可以通过按节点完成的时间对节点进行排序来获取拓扑顺序。但是,与其进行排序并获得 O(nlogn) 解决方案,我们可以将其保留为 O(n)。当您完成节点时,我们可以将节点的唯一标识符弹出到堆栈上,而不是记录其完成时间。由于在我的例子中我们只处理正顶点,因此将唯一标识符简单地设置为顶点值的负值就足够了。因此,如果我们连续弹出堆栈,我们将得到我们的拓扑顺序。
void dfs(int v, bool visited[], node* adjList[], std::stack<int> &myStack) {
std::stack<int> recursion;
visited[v] = true;
recursion.push(v);
while( !recursion.empty() ) {
v = recursion.top();
recursion.pop();
//A dummy node to denote finish order (e.g. topological order)
if (v < 0) {
myStack.push(v * -1);
} else {
node* curr = adjList[v];
recursion.push(v * -1);
while (curr != NULL) {
if(!visited[curr->val]) {
visited[curr->val] = true;
recursion.push(curr->val);
}
curr = curr->next;
}
}
}
}
相关文章:
- 使用列表 STL 递归进行插入排序
- 在气泡排序中使用递归
- 运行合并排序递归算法时EXC_BAD_ACCESS错误
- 合并排序与递归
- 递归合并排序算法实现
- 从递归向后选择排序函数调用 max 和交换函数
- 递归在合并排序中行为异常
- 递归定义数组中的数据对齐和排序
- 为什么我的递归快速排序算法有如此不平衡的分区
- C :重复的变化的递归功能,按不同字母数量排序
- 递归代码快速排序
- 无法让我的代码正确排序用户输入的数字数组(使用递归)
- 合并排序中的递归
- C 不需要带有递归排序算法的数组长度
- C++中的无限递归快速排序
- 使用选择算法编译时递归排序
- 递归合并排序错误
- 未处理的异常排序递归
- 归并排序递归实现的部分理解
- 归并排序递归不清楚数组的排序是如何实现的,请帮助理解代码