【问题标题】:Is there a data structure with efficient inserts/deletes, but with positional ordering?是否存在具有高效插入/删除但具有位置顺序的数据结构?
【发布时间】:2023-03-31 19:29:01
【问题描述】:

我正在寻找一种具有高效插入、删除和查找的数据结构,二叉树通常可以满足这种要求,但是我的项目不是根据它们的值排序的——而是我需要根据它们的实际值对它们进行排序插入位置(即像一个数组)。所有操作都将基于此位置访问、插入或删除项目,就像使用数组一样。

  • getItem(int position)
  • addItem(int insertPosition, object item)
  • removeItem(int position)

所以基本上问题是插入/删除一个项目会导致它之后的所有项目的索引移动 1。显然存储索引永远不会产生比 O(n) 更好的结果,所以基本的二叉树/哈希表已经不存在了.

是否有一种结构能够在亚线性时间内实现所有这些操作?我一直认为可以以某种方式调整二叉树,并且我会通过让每个节点存储其左分支中的节点数来支持按索引查找。

【问题讨论】:

  • 可能我理解错了,为什么不能用数组呢?
  • 只使用一个对象,因为您不需要自动维护索引。它会比数组快,比手工编写的花哨代码快得多。
  • @dandavis 大概,在特定位置调用“addItem”会改变所有后续元素的位置。
  • 有什么理由不使用以位置作为键的哈希表? (如果这在 javascript 中可能只是一个通用对象)。如果您需要在中间添加时移动位置,我认为您在 addItem 低于 O(N) 时运气不佳,因为根据定义,它平均需要执行 N/2 次操作。
  • @dandavis,根据定义,点移位是一项线性任务,所以如果这是一个要求,我认为他不能在这里做他想做的事。

标签: javascript .net data-structures


【解决方案1】:

List 支持这些功能,如果容量 > 计数,则添加的时间为 O(1)

List.Add Method

其他一切都是 O(N),但实际上更好。
如果你在位置 0 插入,那么它是 O(N),但如果你在倒数第二个位置插入,你会发现它比 O(N) 更好。

    List<simple> ls = new List<simple>();
    simple ss = new simple(0);
    ls.Add(ss);
    ls.Add(new simple(2));
    ls.Insert(0, new simple(1));
    ls.Add(new simple(3));
    ls.Add(new simple(4));
    ls.RemoveAt(2);
    foreach(simple s in ls) 
    {
        System.Diagnostics.Debug.WriteLine(s.ID);
    }
    System.Diagnostics.Debug.WriteLine(ls[1].ID.ToString());
    System.Diagnostics.Debug.WriteLine(ls.IndexOf(ss).ToString());
}
public class simple
{
    public Int32 ID { get; private set; }
    public simple(Int32 id) { ID = id; }
}

【讨论】:

  • -1 List.Add最后加法效率高,但是这个问题包括中间加法,也就是线性时间。
  • @delnan 这反映在答案中。
  • 很好,但这并不能改变List 不是这个问题的答案这一事实。
【解决方案2】:

2-3 用索引注释的手指树应该能够做到这一点。它们是持久的(在函数式编程意义上),这可能是好是坏。如果你非常想要一个可变的变体,它至少是一个想法的来源。 2-3个手指树支持

  1. 对数时间访问,以及
  2. 在摊销的常数时间内在开始和结束时添加和删除,并且
  3. 按时间对数分割和连接较小部分的大小。

所以要在任意位置插入,您可以在该位置拆分,添加到其中一个部分的末尾,然后连接。 同样,要删除一个项目,您可以在该索引处拆分,删除该项目,然后再次连接。两者都花费少于 O(log n) 的时间,这是一个过度近似。

Haskell 中的Data.Sequence 模块是现有的实现(针对索引注释的特殊情况,并针对性能进行了调整)。介绍它们的paper 比它需要的更难阅读。有一个article 更清楚地解释了总体思路,但省略了许多细节,因此实现它们是不够的。

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2014-01-06
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多