Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 算法-查找项目在队列中的位置_Algorithm_Data Structures - Fatal编程技术网

Algorithm 算法-查找项目在队列中的位置

Algorithm 算法-查找项目在队列中的位置,algorithm,data-structures,Algorithm,Data Structures,我有一个任意对象数组 每个对象都有一个唯一的id 新对象添加到队列末尾(尾部) 从顶部移除对象以进行处理(FIFO) 如果需要,可以删除挂起处理的对象 问题是从给定id的尾部查找队列中的对象当前位置 最快的方法是什么?我要明确的是,我不希望对象来自id,所以哈希映射不是解决方案。我真正需要的是这个职位 我们想到了两种方法: 蛮力,在循环中查找 在对象中添加一个新字段,该字段存储全局索引,对于添加到队列中的每个对象,该索引都会递增。然后,我们可以通过检查存储在最后一项和该项中的全局索引来快速获得位

我有一个任意对象数组

  • 每个对象都有一个唯一的id
  • 新对象添加到队列末尾(尾部)
  • 从顶部移除对象以进行处理(FIFO)
  • 如果需要,可以删除挂起处理的对象 问题是从给定id的尾部查找队列中的对象当前位置

    最快的方法是什么?我要明确的是,我不希望对象来自id,所以哈希映射不是解决方案。我真正需要的是这个职位

    我们想到了两种方法:

  • 蛮力,在循环中查找
  • 在对象中添加一个新字段,该字段存储全局索引,对于添加到队列中的每个对象,该索引都会递增。然后,我们可以通过检查存储在最后一项和该项中的全局索引来快速获得位置。但是,唯一的复杂性是,如果删除其中一个对象,则需要更新下面所有项目的全局索引
    还有更好的主意吗?请建议。

    最简单的方法是将FIFO表示为双链接列表。这个列表可以是
    对象
    s(这意味着如果你有一个ID,你也需要一个从ID到对象的映射,一个哈希映射或其他方法),也可以是独立的FIFO节点(在这种情况下,你会有一个从ID到节点地址的映射)。

    我相信我有一个
    日志(n)
    时间解决方案。构造一个哈希表,将每个
    ID
    映射到另一个数据结构中的节点——一个自平衡二叉搜索树(红黑、AVL,随便你喜欢什么)。在此树中,节点应按其在队列中的相对优先级/顺序排序。它还应该在树中存储指向其父树的指针,以及以自身为根的子树的大小。由此我们可以查询在对数时间内具有较低优先级/顺序的元素的数量。

    你认为有一个选项具有摊销时间复杂度吗?简单地说,我们将从数组中使用浅删除(不是真的,只是标记应该删除这个对象)。然后,当标记对象占用超过30%的容量时,我们处理recalc.2,但以运行长度编码形式维护全局索引,即全局id和连续id值的数量。您可以快速找到您的id,将跳过的行程相加,然后计算最终偏移量。若要删除,请将管路长度拆分为两段,或缩短管路长度,或根据需要将其删除。