【问题标题】:Best data structure for a effecient insertion, deletion and occasional traversal高效插入、删除和偶尔遍历的最佳数据结构
【发布时间】:2021-03-26 02:56:22
【问题描述】:

所以,我正在尝试制作一个个人项目,我需要知道我可以使用什么数据结构,这使我能够以任何顺序快速插入和删除。最重要的是,如果我能在内部管理数据,那将是最好的。我尝试了一个哈希集,但一位前辈的反馈是它不是最佳选择。所以我想知道我可以使用什么?

一些额外的背景:无论结构中的数据量如何,性能都是最重要的。插入和删除非常频繁且顺序随机

【问题讨论】:

  • 我会问前辈他们的建议是什么。有了你给出的模糊细节,听起来std::unordered_set 就可以了。
  • 无序集正是我使用的。有人建议我查看链表之类的东西,因为我可能需要维护索引。我确实有需要频繁插入和删除的限制
  • “我正在尝试为我的 git repo 制作一个个人项目”——这与问题相关还是只是为了让你的问题看起来更长?最好从类似“我正在设计一个需要 [etc.] 的数据结构”开始
  • 该注释只是为了确保没有人认为这是一项学术作业。我很久以前就离开了大学,目前正忙于在工作的同时整理我的 git 存储库
  • 只有当您已经有一个指向要删除的节点或要插入的位置的节点的指针时,链表才有效。如果你不这样做,你将需要通过遍历找到节点/点——这会很慢。 unordered_set 一样快,但您无法控制项目的顺序,因此如果您确实需要索引,它对您不起作用。你需要控制物品的顺序是否正确?

标签: c++ data-structures


【解决方案1】:

LinkedList 是您的最佳选择。在 std lib 中,std::list 是它的实现。

列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作,以及双向迭代。

只要知道后面插入的列表节点地址和位置即可。

在插入你的值之前增加你的迭代器:

if (someIterator != someList.end()) {
    someIterator++;
}
someList.insert(someIterator, someValue);

但是没有办法从 std::list 中删除 O(1)。除非您知道已删除元素的索引或迭代器。

您可能需要考虑使用侵入式列表,其中列表节点直接嵌入到结构中,就像您已经做过的那样。

您可以使用 boost::intrusive 或自己滚动。

自己实现

定义节点

/* Node of a doubly linked list */
struct Node {
    int data;
    struct Node* next; // Pointer to next node in DLL
    struct Node* prev; // Pointer to previous node in DLL
};

现在您可以通过 Node* 指针擦除或插入。

【讨论】:

  • 感谢您的回复!我会尝试这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2012-03-05
  • 2014-12-23
  • 1970-01-01
  • 2010-10-27
相关资源
最近更新 更多