为添加项目(列表末尾),迭代和删除项目而优化的数据结构

时间:2009-05-26 03:24:49

标签: data-structures

我需要一个能够以高效的方式支持以下操作的数据结构:

  • 将项目添加到列表末尾
  • 按照添加项目的顺序遍历列表(随机访问并不重要)
  • 从列表中删除项目

我应该使用哪种类型的数据结构? (我将在下面发布我目前正在考虑的答案。)

5 个答案:

答案 0 :(得分:3)

您应该使用链接列表。将项添加到列表的末尾是O(1)。迭代很简单,您也可以从O(1)列表中的任何已知位置删除项目。

答案 1 :(得分:2)

这听起来像一个链表,但是你需要考虑一下。当您说“从列表中删除项目”时,这取决于您是要删除“完整项目”还是仅删除其值。

我会澄清:让我们说你的价值观是字符串。您可以构造一个包含字符串和两个链接指针(向前和向后)的类/结构。当给出这样的类时,很容易从O(1)中的列表中删除它。在伪代码中,删除项c看起来像这样(请忽略验证测试):

c.backwards = c.forwards
if c.backwards = null: head = c.forwards
if c.forwards = null: tail = c.backwards
delete c

但是,如果您希望删除包含字符串“hello”的项目,则需要O(n),因为您需要遍历列表。

如果是这种情况,我建议使用链表和哈希表的组合进行O(1)查找。插入列表末尾(伪代码):

new_item = new Item(value = some_string, backwards = tail, forwards = null)
tail.forwards = new_item
tail = new_item
hash.add(key = some_string, value = new_item)

扫描列表只是扫描链表,没问题:

i = head

while i != null:
    ... do something with i.value ...
    i = i.forwards

按值从列表中删除项目(伪代码,无验证测试):

item_to_remove = hash.find_by_key(some_string)
if (item_to_remove != null):
    hash.delete_key(some_string)
    item_to_remove.backwards = item_to_remove.forwards
    if item_to_remove.forwards = null: tail = item_to_remove.backwards
    if item_to_remove.backwards = null: head = item_to_remove.forwards
    delete item_to_remove

答案 2 :(得分:0)

我正在考虑使用简单的项目列表。添加新项目时,我只需将其添加到列表的末尾。要删除项目,我实际上不会将其从列表中删除,我只会将其标记为已删除,并在迭代项目时跳过它。

我将跟踪列表中已删除项目的数量,当超过一半的项目被删除时,我将创建一个没有删除项目的新列表。

答案 3 :(得分:0)

循环&双重链表。它满足所有3个要求:

将项添加到列表的末尾:O(1)。通过添加到Head-> prev。它支持按照添加它们的顺序遍历列表。您可以删除任何元素。

答案 4 :(得分:0)

假设Java(其他语言具有相似的结构,但我首先找到了JavaDocs):