Algorithm 数据结构名称:组合数组/链表

Algorithm 数据结构名称:组合数组/链表,algorithm,language-agnostic,data-structures,Algorithm,Language Agnostic,Data Structures,我提出了一种数据结构,它结合了链表的一些优点和固定大小数组的一些优点。这对我来说似乎很明显,所以我希望有人已经想到了它,并且已经给它命名了。有人知道这叫什么吗 以固定大小的小数组为例。如果要放入数组的元素数大于数组的大小,请在新旧数组之间添加新数组和任何您喜欢的指针 因此,你有: Static array ————————————————————————— |1|2|3|4|5|6|7|8|9|a|b|c| ————————————————————————— Linked list ————

我提出了一种数据结构,它结合了链表的一些优点和固定大小数组的一些优点。这对我来说似乎很明显,所以我希望有人已经想到了它,并且已经给它命名了。有人知道这叫什么吗

以固定大小的小数组为例。如果要放入数组的元素数大于数组的大小,请在新旧数组之间添加新数组和任何您喜欢的指针

因此,你有:

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
————————————  ————————————
编辑:作为参考,该算法在最坏情况下的添加/删除性能非常差,而在平均情况下没有更好的性能。我的方案的最大优势是提高了读操作的缓存性能

编辑再赏金:安塔尔S-Z的答案是如此完整,经过充分研究,我想为他们提供赏金。显然,堆栈溢出不允许我在提供悬赏后立即接受答案,因此我必须等待(诚然,我在某种程度上滥用了意向悬赏系统,尽管这是以奖励优秀答案的人的名义)。当然,如果有人能够提供一个更好的答案,给他们更多的权力,他们当然可以得到赏金


编辑更名:我对你所说的不感兴趣,除非你这么说,因为这是权威人士所说的。如果是你刚想到的名字,我不感兴趣。我想要的是一个名字,我可以在教科书和谷歌上查到。(还有,这里有一个提示:Antal的答案正是我想要的。如果你的答案不是没有很好理由的“展开的链表”,那就是大错特错。)

我会称之为一个桶列表。

你可以称之为
LinkedArray


另外,我想查看
removeIndex
操作的伪代码。

虽然我不知道您的任务,但我强烈建议您查看跳过列表

至于名称,我认为一个存储桶列表可能是最合适的(如果你已经足够大,能够记住Lisp机器的话)


另请参见此列表/数组概念对字符串的概括。

此数据结构在插入和删除方面的优势是什么? 前任: 如果要添加一个介于3和4之间的元素,该怎么办?还得换班,需要O(N) 如何找到elementAt的正确存储桶

我同意jer的观点,您必须查看跳过列表。它带来了链表和数组的优点大多数操作都是在O(logn)中完成的。

它被称为一个。似乎有两个优势,一个在速度上,一个在空间上。首先,如果每个节点中的元素数量大小适当(例如,最多一条缓存线的大小),则可以通过改进的内存位置获得明显更好的缓存性能。其次,由于您有O(n/m)个链接,其中n是展开链接列表中的元素数,m是可以存储在任何节点中的元素数,因此您还可以节省可观的空间量,如果每个元素都很小,这一点尤其明显。在构建展开链表时,显然实现通常会在节点中留出空间;尝试插入完整节点时,会将一半元素移出。因此,最多一个节点将少于半满。根据我所能找到的(我自己没有做过任何分析),如果你随机插入一些东西,节点实际上会占满四分之三,如果操作往往在列表的末尾,甚至会更满

正如其他人(包括维基百科)所说的,你可能想看看。跳过列表是一种漂亮的概率数据结构,用于存储有序数据,插入、删除和查找的预期运行时间为O(logn)。它由一个链接列表的“塔”实现,每一层的元素越少,越高。在底部,有一个普通的链表,包含所有元素。在每一个连续的层中,元素数量较少,其系数为p(通常为1/2或1/4)。它的建造方式如下。每次将一个元素添加到列表中时,它都会插入到最下面一行的适当位置(这使用“查找”操作,也可以使其快速)。然后,使用概率p,它被插入到链接列表中“上面”的适当位置,如果需要,创建该列表;如果它被放在一个更高的列表中,那么它将再次以概率p出现在上面。要查询此数据结构中的某些内容,请始终检查顶部通道,并查看是否可以找到它。如果您看到的图元太大,您将下降到下一个最低车道,然后重新开始查看。这有点像二进制搜索。维基百科对此进行了很好的解释,并提供了很好的图表。当然,内存使用情况会更糟,缓存性能也不会得到改善,但通常会更快

工具书类
  • “展开的链接列表”
  • “展开的链接列表”
  • “跳过列表”
  • 我的算法课上的跳过列表讲座

从算法复杂度的角度来看,这很有趣——从技术上讲,几乎所有基本操作都是O(n)(这很糟糕),但常数比例因子非常低(这很好,其他所有操作都是相同的!)。如果这适用于您的应用程序,那对您很好,但我仍然建议您进行一些仔细的基准测试:-)如果我错了,请纠正我。我使用了C、C++和java,所有这些都只允许存储一种类型的数据。在上面的例子中,一些数组元素是int,一些是char,一些是指针。您的数组实际上将如何声明?您是否使用某种结构来表示这一点?srikfreak:其思想是,在链表中,您有(在C++
中)模板结构ll