C++ 在c+中实现可变排名表+;

C++ 在c+中实现可变排名表+;,c++,sorting,boost,map,stl,C++,Sorting,Boost,Map,Stl,在事件驱动的模拟器中,我需要跟踪目录中大量内容元素的流行情况。更具体地说,我感兴趣的是了解任何给定内容的排名,即其在按请求数量降序排序的列表中的位置。我知道每个内容的请求数量每次只会增加一个,所以排名没有明显的变化。此外,只有在极少数情况下才会从目录中插入或删除元素,而请求的数量和频率要多得多。实现这一点的最佳数据结构是什么 以下是我考虑过的方案: astd::map将内容映射到它们收到的请求数。这不是一个好的选择,因为它需要我将所有内容转储到一个列表中,并在我想知道内容的排名时对其进行排序,

在事件驱动的模拟器中,我需要跟踪目录中大量内容元素的流行情况。更具体地说,我感兴趣的是了解任何给定内容的排名,即其在按请求数量降序排序的列表中的位置。我知道每个内容的请求数量每次只会增加一个,所以排名没有明显的变化。此外,只有在极少数情况下才会从目录中插入或删除元素,而请求的数量和频率要多得多。实现这一点的最佳数据结构是什么

以下是我考虑过的方案:

  • a
    std::map
    将内容映射到它们收到的请求数。这不是一个好的选择,因为它需要我将所有内容转储到一个列表中,并在我想知道内容的排名时对其进行排序,这是非常常见的
  • 一个包含两个索引的
    boost::multi_index_容器
    ,一个哈希值为ContentElement唯一,一个有序值为not_唯一,用于请求数。这使我能够快速检索内容,以更新其请求数量,并在通过
    modify
    调用执行此操作时保持容器排序,但我对有序索引的理解是,它仍然迫使我遍历其所有元素以计算内容的排名——我无法找到一种简单的方法从有序迭代器中提取排名中的位置
  • 内容元素和排名位置之间的
    boost::bimap
    ,由存储每个内容请求数的外部排序向量支持。本质上,内容的排名还表示向量元素的索引及其请求数。这允许我做我想做的一切(例如,轻松地从内容到排名,反之亦然),在新请求后对向量进行排序最多需要在bimap中进行两次交换。然而,它感觉笨拙且容易出错,因为我很容易失去地图和向量之间的同步,然后一切都会崩溃

我的直觉告诉我,一定有一种更简单、更优雅的处理方法,但我找不到。有人能帮忙吗?

没有必要进行全面排序。这里的关键观点是,当访问排名时,它只能改变+1或-1。我会做以下的

将元素保存在您选择的容器中,例如

map< elementId, elementInstance >
map
维护元素排名的链接列表,如下所示:

list< rankingInstance >
list
rankingInstance有一个指向elementInstance的指针以及当前排名和当前访问次数的值。在访问时,您可以:

  • 访问映射中的元素
  • 获取其当前排名和访问计数
  • 更新计数
  • 使用当前排名访问链接列表
  • 检查一下邻居
  • 如有必要,交换列表中的位置
  • 如果发生了交换,请返回并更新秩已更改的两个元素

  • 它可能看起来很简单,但我的建议是在列表中使用
    气泡排序
    。因为,
    Bubble Sort
    只比较和切换相邻元素,这是您的情况,只需在排名中向上或向下移动一次即可。向量可以将'Rank'作为键,将'ContentHash'作为向量中的值。还需要包含'Content''Content Reference'的地图。我希望这个非常简单的方法能让你对你的问题有所了解。

    你对bimap+向量的想法不错。如果正确封装,这似乎是一个非常好的(优雅的)解决方案。将ContentElement*向量按其秩排序,并考虑指针,假设它们“永久”存储在其他位置。在每次秩的变化后,对向量再次排序。如果向量大部分已经排序,那么再次排序应该很快。这不是最佳解决方案,但可能足够快以满足您的需要。以后可以改进。