【发布时间】:2011-02-26 18:25:41
【问题描述】:
我提出了一种数据结构,它结合了链表的一些优点和固定大小数组的一些优点。这对我来说似乎很明显,所以我希望有人已经想到并命名了它。有谁知道这叫什么:
取一个固定大小的小数组。如果要放入数组的元素数量大于数组的大小,请添加一个新数组,并在新旧数组之间添加任何您喜欢的指针。
这样你就有了:
Static array
—————————————————————————
|1|2|3|4|5|6|7|8|9|a|b|c|
—————————————————————————
Linked list
———— ———— ———— ———— ————
|1|*->|2|*->|3|*->|4|*->|5|*->NULL
———— ———— ———— ———— ————
My thing:
———————————— ————————————
|1|2|3|4|5|*->|6|7|8|9|a|*->NULL
———————————— ————————————
编辑:作为参考,这个算法提供了非常差的最坏情况添加/删除性能,并且没有更好的平均情况。我的方案的最大优势是提高了读取操作的缓存性能。
Edit re bounty:Antal S-Z 的答案是如此完整且经过充分研究,以至于我想为他们提供赏金。显然,一旦我提供了赏金,Stack Overflow 不会让我立即接受答案,所以我将不得不等待(诚然,我在某种程度上滥用了意图赏金系统,尽管它是以奖励某人为名回答)。当然,如果有人确实设法提供了更好的答案,给他们更多的权力,他们当然可以得到赏金!
编辑重新命名:我对你会如何称呼它不感兴趣,除非你会这样称呼它,因为这是有关该主题的权威人士会这样称呼它它。如果这是你刚想出来的名字,我不感兴趣。我想要的是一个我可以在教科书和谷歌中查找的名字。 (另外,这里有一个提示:Antal 的答案正是我想要的。如果你的答案不是“展开的链表”而没有非常充分的理由,那就大错特错了。)
【问题讨论】:
-
从算法复杂性的角度来看很有趣 - 从技术上讲,你几乎所有基本操作都是 O(n) (这很糟糕),但你得到一个非常低的恒定比例因子(这很好,其他的都是平等的!)。如果这适用于您的应用程序,对您有好处,但我仍然建议您进行一些仔细的基准测试:-)
-
如果我错了,请纠正我。我使用过 C、C++ 和 Java,所有这些都只允许您存储一种类型的数据。在上述情况下,有些数组元素是 int,有些是 char,有些是指针。您的数组将如何实际声明?您是否使用某种结构来表示这一点?
-
srikfreak:这个想法是,在链表中,你有(在 C++ 中)
template <typename T> struct ll_node { T value; ll_node<T>* next; },在这里你会有类似template <typename T> struct ull_node { T value[MAX]; size_t n_elements; ull_node<T>* next; }的东西。我不认为“静态数组”案例中的数组元素应该表示文字值,但如果你愿意,我敢打赌你可以将它们视为十六进制数字而不是字符。 -
我们缺乏有关您执行插入和删除方式的信息,即您可以在列表中间放置半填充数组吗?如果不是,C++ STL 称它为
deque。 -
我很好奇为什么你不会只有一个数组的 LinkedList
标签: algorithm language-agnostic data-structures