用于顺序访问但随机插入/删除的适当数据结构



如果我正在编写一个算法,该算法需要存储从列表中的第一项到列表中的最后一项依次访问的数据。该数据将定期需要在列表中的任意位置插入或删除。

我说LinkedList比ArrayList、Binary Tree和Circular Buffer更合适吗?

ArrayList是随机访问,所以不是它们。二进制树不是线性数据结构,所以不是他们,因为它们不能在一次运行中顺序访问。它不能是循环缓冲区,因为数据需要在随机位置插入或删除,但它们只在2个选择位置排队和出队。

如果你得到的只是链表的头和必须插入的索引("位置"(,那么链表就不太方便了:你必须从列表的头遍历到所需的位置,这需要O(𝑘)时间,在哪里𝑘是所需的位置。像𝑘原则上可以是0到𝑛(其中𝑛是列表中的当前节点数(,这意味着最差和平均时间复杂度为O(𝑛).

一个更好的结构将是自平衡二进制搜索树(如AVL、红黑、B-树等(,其中每个节点都是"0";增强的";具有一个属性,该属性给出了它所根的子树中的值的数目。这允许根据值的索引存储和遍历(有序遍历(值。插入和删除则具有O(日志𝑛)时间复杂性。一个特别方便的遍历树数据结构是B+树。

另一个同样有效的是跳过列表。这是一个用多层链表扩充的链表,因此允许O(log𝑛)访问任何索引。

然而,如果用";位置";这意味着你在链表中得到了一个节点引用,必须在其中插入新节点,然后链表就可以了。但问题是:你是怎么找到那个位置的?最后,这是一个必须以某种方式检索的节点引用,除了从头遍历列表以获得这样的节点引用之外,你没有什么可做的了。。。那么我们回到我答案的开头。

最新更新