【问题标题】:Search in flat array based double link list when element in between head and tail当元素在头尾之间时,在基于平面数组的双链表中搜索
【发布时间】:2021-11-17 18:35:51
【问题描述】:

我有一个使用数组的双链接列表,并且在插入元素时我保持顺序,例如this。我将新值(节点)视为数组索引并将它们直接存储到它们的位置。链接列表很长。一切都按要求工作,但是当节点落在头尾之间时,是否有任何算法或想法可以帮助我减少迭代次数?

那是

if (new_node > head && new_node < tail) {
        search from head() 
}

所以要减少迭代;在发现新节点更接近哪个头部或尾部后,我添加了search from tail()。然后我添加了一个位于头部和尾部中间的中间节点。但是当需要链接节点时,我仍然无法减少迭代。知道值的范围会有帮助吗?还有什么可以减少插入时的迭代次数(由于排序性质)?

我希望我能正确解释这一点。

【问题讨论】:

  • 如果是链表,你应该通过实现基本的链表操作来抽象它。然后使用它们遍历/搜索列表。
  • 您无法显着降低搜索线性数据结构的时间复杂度。您可以向列表中的某些节点添加特殊的随机“快捷方式”链接,这将允许您向前和向后跳跃很远,但这会使节点的结构显着复杂化(节点本质上需要保留附加链接的列表)。您也可以考虑 som random-access list,在 Wikipedia (Linked list / Random-access lists) 中提到,但我没有来源可指。
  • 也许你应该考虑一棵树...?

标签: c algorithm


【解决方案1】:

这里是SO answer 讨论数组和链表之间的区别:插入/删除函数。

tldr;这是双链表的限制。即使你将它包装在一个数组中来做一些事情。

了解链表和数组如何工作的基本方法将有助于确定您正在解决的不可能的问题。除非您使用不同的结构,否则您通常会遇到您所描述的问题。

我会做以下事情:

  • 考虑你的问题,你关心什么
    • 正在搜索?
    • 插入/删除?
    • 内存大小?
  • 然后确定最能解决您的问题的数据结构
    • 数组
    • 链接列表
    • 树木
    • 哈希

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2023-03-22
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2021-05-24
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多