我在C#中实现了一棵四叉树,发现递归比迭代更快,这看起来有点奇怪。
我的节点长这样:
class QuadNode
{
private QuadNode topLeft;
private QuadNode topRight;
private QuadNode bottomRight;
private QuadNode bottomLeft;
// other fields...
}
为了遍历树,我使用了以下递归方法,我在根节点上调用它:
Traverse()
{
// visit 'this'
if (topLeft != null)
topLeft.Traverse();
if (topRight != null)
topRight.Traverse();
if (bottomRight != null)
bottomRight.Traverse();
if (bottomLeft != null)
bottomLeft.Traverse();
}
出于兴趣,我试图创建一种遍历树的迭代方法。
我为每个节点添加了以下字段:private QuadNode next
。在创建树时,我使用队列执行广度优先遍历,将每个节点的next
字段链接到下一个节点。本质上,我从树的节点创建了一个单向链表。
此时,我能够使用以下方法遍历树:
Traverse()
{
QuadNode node = this;
while (node != null)
{
// visit node
node = node.next;
}
}
经过测试,我非常惊讶地发现迭代版本始终比递归版本慢,这在大树和小树上都进行了测试,并且递归方法始终更快(我使用了
Stopwatch
来进行基准测试)。我已确认两种方法都能够成功遍历整个树,而迭代版本仅像计划的那样访问每个节点一次,因此与它们之间的链接无关。 对我来说,迭代版本似乎会表现得更好……出于什么原因递归版本更快? 我是否忽略了一些明显的原因呢?我正在使用Visual Studio 2012并在Release下编译,Any CPU(不选首选32位)。编辑:
我打开了一个新项目并创建了一个简单的测试,也证实了我的结果。这是完整的代码:http://pastebin.com/SwAsTMjQ,虽然代码没有注释,但我认为它相当容易理解。