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

Is there a efficient way to search a key in queue and override its value?

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

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

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

如果我对已在队列中的密钥进行频繁更新,性能会很慢。

有什么有效的方法可以实现吗?提前致谢。

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

你也可以试试这个算法:

  • 将 Google、Microsoft、Apple 等密钥存储在 unordered_map 中。 还要记录到目前为止已处理的项目数。
  • 从队列中删除项时,增加计数并从映射中删除键。
  • 当一个项目到达队列时,
    • 查看map是否存在key(线性时间)
    • 如果是,请更改 queue[index -count] 处的值(线性时间)
    • 如果还没有,存储map[key] = count + index where the new item is placed in the queue(线性摊销时间)

我不提供任何保证,我没有测试过这个算法。