有没有一种有效的方法来搜索队列中的键并覆盖其值?

时间:2019-11-05 05:10:28

标签: c++ performance message-queue

我正在使用C ++编写一个应用程序,其中我需要实现一个消息队列,该消息队列将不断从网络接收数据(即对象),每个对象都有一个密钥(例如公司名称,例如Oracle,Google等)。如果队列使用者较慢,则队列中可以包含大量元素(最大限制可以保持数百万个)。

要求是:如果具有XYZ键的对象是从网络到达的,并且队列中已有具有XYZ键的对象,那么我需要重写该对象,并且该对象在队列中的位置应保持不变。例如,如果键“ Oracle”的值为25的对象是从网络到达的,并且键为“ Oracle”且值为10的对象已存在于队列中的位置120,那么我需要覆盖值为25的值10并且位置应保持在120。

我尝试使用线程安全队列和集合来实现此目的,首先从网络到达对象时,我检查集合中是否存在密钥,如果不存在密钥,则将密钥添加到集合中并在队列中添加对象。如果存在密钥,那么我将在队列中执行线性搜索,以覆盖该对象。

如果我非常频繁地更新队列中已经存在的密钥,性能将会非常慢。

有没有有效的方法来实现这一目标?预先感谢。

1 个答案:

答案 0 :(得分:1)

由于未对队列进行排序,因此没有比线性搜索更快的数据获取方法。 您可以优先使用队列。 std :: priority_queue不允许快速更改优先级,您将不得不使用boost。

您也可以尝试以下算法:

  • 将密钥(例如Google,Microsoft,Apple等)存储在unordered_map中。 还要统计到目前为止已经处理了多少个项目。
  • 从队列中删除项目时,增加计数并从地图中删除键。
  • 当物品到达队列时,
    • 在地图上查看键是否存在(线性时间)
    • 如果有,请更改queue[index -count](线性时间)的值
    • 如果尚未存储map[key] = count + index where the new item is placed in the queue(线性摊销时间)

我不提供任何担保,我尚未测试此算法。