【发布时间】:2013-10-14 15:46:22
【问题描述】:
假设我有一个双向链表,每个元素都有一个字节。维基百科具有良好的视觉效果;假装这些数字是十六进制数字:
现在,给定一个指向字符串中最后一个节点(在本例中为37 节点)的指针,从列表构建字符串的简单(“显而易见”)方法是:
using std::string;
string node::makeString()
{
return this->prev->makeString() + this->data;
}
目标是字符串"\0x12\0x99\0x37"。然而,这个函数需要对正在构建的字符串进行大量的重新分配和大量的函数调用开销(它不能进行尾调用优化);毫无疑问,还有其他我不知道的低效率。
有没有更好的方法?当然,我不只是希望最小化理论时间复杂度;我真的在努力寻找一种实践中最快的方法。
【问题讨论】:
-
那个解决方案实际上很糟糕......每个字符调用一个函数会添加到构建字符串的实际成本中。
-
是的,这就是我说它幼稚的原因;)
-
不只是天真...天真的会在循环中迭代添加每个字符。这看起来是一种糟糕的功能方法(糟糕的是它不允许尾递归优化)
-
尾调用优化会非常干净......有没有办法做到这一点?
-
@SigTerm: 除了不是tail-recursion...接近,但不一样
标签: c++ c++11 linked-list