【问题标题】:Data structure / algorithm design for insertion插入的数据结构/算法设计
【发布时间】:2020-05-25 09:05:14
【问题描述】:

假设您有一个包含值和长度的线对象。如何设计一个数据结构,这样每当你插入一个新的线对象时,它不仅会存储它,还会返回每个长度比新线对象短的线对象的值的总和。每次插入的时间复杂度应该是 O(logn)。整体时间复杂度可以是 O(nlogn)。

我曾尝试使用分段树,但对如何调整它来解决我的问题有点困惑。因为我认为线段树本身并不能真正帮助我只过滤长度比新插入的线对象短的线对象。

【问题讨论】:

  • 为什么不允许对它们进行排序?将它们保持在排序顺序是否被视为排序?如果是这样,如何以固定的排序顺序存储它们以规避此要求?
  • 对不起,我编辑了一点,因为原来的有点偏离我真正想问的,排序没有任何限制
  • 然后使用二分查找(根据长度)找到插入的位置,这个是O(log n)
  • 所以我还是应该使用段树数据结构然后二分查找找到插入位置?

标签: algorithm data-structures


【解决方案1】:

您可以使用self-balancing binary search tree,将长度属性用作键,将值用作有效负载。例如,您可以使用 AVL 树或红黑树。

除了节点的长度和值属性之外,您还需要维护节点后代中所有值的总和,包括它自己的值。

这意味着对于插入操作,当您沿着树向下查找插入点时,您应该更新您访问的每个节点的总值,并将要插入的值添加到其中。

另外,在沿着树走的时候,累积应该返回的总和,如下所示:

向右移动时,将存储在您来自的父项中的总值(在增加之前)加上总和,并减去存储在您要移动到的子项中的总值(也在增加之前) )。

向左走时,不要改变总和。

当最终插入叶子时,同样的规则适用。将其作为右孩子插入时,总和应随着其父项的总值增加(在增加之前)。如果叶子变成左孩子,不要改变总和。

返回总和。

注意自平衡机制(取决于您选择的自平衡树的类型):当需要旋转时,存储在受影响节点中的总值也需要调整。但这应该不难管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2010-12-07
    • 2015-06-17
    相关资源
    最近更新 更多