c++ - 有序双向链表搜索

标签 c++ c linked-list html-lists

假设我们有按整数值排序的双向链表:

struct ListItem
{
  int value;
  ListItem *prev, *next;
};

struct List
{
  ListItem *first, *last;
  int count;
};

我们能否使用更快的搜索算法(例如二分搜索)在 List 中定位 ListItem 以及如何定位?

最佳答案

出于大多数实际目的,不会。如果你想要更快的搜索,链表是一个糟糕的数据结构选择。考虑使用 vector、deque、set 或 multiset。

编辑:也许最好提供一些指导,说明哪些在什么时候有意义。如果您有两个基本独立的阶段,则 vector 最有意义:要么按顺序插入所有数据,要么插入并排序,然后在数据排序后,数据保持静态,您只需在其中搜索。 deque 几乎是一样的,除了你可以在两端插入,所以如果你可能会乱序获取数据,但新数据总是属于集合的一端或另一端,它可能是一个不错的选择。

setmultiset 如果您要将插入/删除与查找混合使用,效果会更好。它始终保持排序,因此搜索总是相当快。在这两者(set 与 multiset)之间的选择非常简单:如果您需要确保集合中的每个项目都是唯一的,您需要 set。如果您可能有多个具有相同键的项目,您需要一个多集。

关于c++ - 有序双向链表搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642015/

相关文章:

c++ - Windows 短路径格式到长路径格式

c - 使用 scanf 读取整数但如果输入字母则崩溃的函数

c++ - 使用位掩码重构整数

c++ - 链表的 Delete_At 函数使程序崩溃

c++ - 使用节点的深度复制和解构器哨兵链表

c++ - 如何访问 C 文件中的 C++ public bool 类成员(以验证)?

c++ - 如何在 double 组上定义比较运算符(小于)?

c++ - 初始化 const 指针 - C++ 中的初始化列表

ios - 使用 clang xcode 9 为 iOS armv7+arm64 编译 C 代码

c++ - 链接列表的总线错误(核心转储)?