假設我有一個雙向鏈表,並且每個元素都有一個字節。維基百科擁有良好的視覺效果;假裝的數字是十六進制數字:高效算法遍歷所有鏈表(使用C++)
現在,天真(「立竿見影」)的方式來建立從列表中給出一個指向字符串中的最後一個節點一個字符串,(在這個例子中,在37
節點),是:
using std::string;
string node::makeString()
{
return this->prev->makeString() + this->data;
}
的目標是字符串"\0x12\0x99\0x37"
。然而,這個函數需要大量重新分配正在構建的字符串和大量的函數調用開銷(它不能被tail-call優化);無疑還有其他的我沒有意識到的低效率。
有沒有更好的方法?當然,我不只是想盡量減少理論上的時間複雜性,我真的試圖找到一種方法,將在實踐中最快。
該解決方案實際上相當糟糕......每個字符的一個函數調用添加到構建字符串的實際成本中。 –
是的,這就是爲什麼我說這是天真的;) – thirtythreeforty
不只是幼稚......天真本來會迭代循環添加每個字符。這看起來像一個不好的功能方法(窮人,它不允許尾遞歸優化) –