【发布时间】:2018-10-11 19:45:48
【问题描述】:
我已经四处搜索,但无法真正理解或找到帮助,因为这种迭代算法将需要两个堆栈(包含 left_Index 和 right_Index)。
主要的递归方式涉及将其放在一侧直到 left_Index >= right_Index,并递归地对两侧和每个小节执行此操作(如果这有意义的话),我不知道该怎么做,因为我' m 维护两个堆栈,需要查看它们之间的确切关系。
这个问题主要是因为我不理解普通的递归方法词的方式,虽然当我并排看它们以了解如何处理它时,我总是卡在该怎么做。
关于我为什么这样做的背景故事: 试图解决从 A 到 B 的字梯问题,并决定制作一个 BST,其中连接通过奇异字符差异和长度连接。我从包含大量字典的文本文件中获取单词,并且由于我使用 BST 作为具有所有顶点的主列表,因此这是字典的事实意味着每个插入都将按顺序排列,因此树是右倾(因此插入 O(n^2) 的速度很慢,这是一个 大 障碍)。我计划将数据存储在一个数组中,然后从中制作一个平衡的 BST,因为我相信速度应该会更快,因为插入将是 O(n*logn),这看起来很棒。这样做的问题是我不能使用递归方法,因为有很多数据会导致堆栈溢出,所以我需要使用堆栈和循环来迭代,但我发现它太难了。
我一开始的错误尝试:
而 (lindx.the_front() {
中 =(lindx.the_front() + rindx.the_back()) / 2;
dictionary.addVertex(vector[mid]);
std::cout }
这基本上是从我制作的链接堆栈中获取程序左半部分的 1/2。 “the_front()”是第一次插入,“the_back()”是最后/最新插入到列表中。我遇到的主要问题是了解如何让它每半场重复一次以获得所有值。
我需要找到我过去做过的作业,但代码类似于...
void array2balanced(int array[], int lIndex, int rIndex)
{
//base case
if(lIndex > rIndex)
{
return;
}
//recursive cals
else
{
mid = (lIndex+rIndex)/2;
tree.insert(array[mid]);
array2balanced(array, lIndex, mid-1);
array2balanced(array, mid+1, rIndex);
}
}
更新: 目前的进展
void balancedTree(std::vector<std::string> vector, dictionaryGraph &dictionary) // divide and conquer into tree?
{
linkedStack<int> lindx, rindx, midX;
unsigned int l_Index{ 0 }, r_Index{ vector.size() - 1 }, mid{ (l_Index + r_Index) / 2 };;
lindx.push(l_Index);
rindx.push(r_Index);
midX.push(mid);
int testCount{ 0 };
std::cout << "There are " << vector.size() << " words.\n";
while (!midX.empty())
{
mid = midX.pop();
l_Index = lindx.pop();
r_Index = rindx.pop();
std::cout << "inputted " << vector[mid] << '\n';
dictionary.addVertex(vector[mid]);
testCount++;
if (r_Index > l_Index)
{
midX.push((l_Index + mid) / 2);
lindx.push(l_Index);
rindx.push(mid - 1);
}
if (l_Index < r_Index)
{
midX.push((mid + r_Index) / 2);
lindx.push(mid + 1);
rindx.push(r_Index);
}
}
std::cout << testCount << " words were inputted...\n"; // To see how many were inserted
system("pause");
}
我遇到的问题是一些输入重复而一些丢失。
【问题讨论】:
-
你能把你见过的递归算法的伪代码贴出来吗?
-
1) 获取数组的中间并使其成为根。 2)递归地对左半边和右半边做同样的事情。 a) 获取左半部分的中间,使其成为步骤 1 中创建的根的左子。 b) 获取右半的中间,使其成为步骤 1 中创建的根的右子。 - geeksforgeeks.org
-
这是一个前序遍历,所以你想要的是迭代前序遍历算法 (en.wikipedia.org/wiki/Tree_traversal#Pre-order) 的变体,但是你将位置与节点堆叠在一起。
-
谢谢!我仍然遇到麻烦,因为我的实现不起作用,(因为一些索引丢失并且一些重复)但我认为我已经接近了!