【发布时间】:2021-01-02 05:24:39
【问题描述】:
我的算法运行一个循环,其中维护一组对象。在每次迭代中,都会从集合中添加和删除对象。此外,每个对象都有一些“measures”(整数值,可能有几个),可以随时更改。根据这些度量,可以根据度量和迭代次数计算出分数。
每当对象的数量超过某个阈值时,我想识别并删除 最低 得分的对象,直到对象的数量再次低于该阈值。即:如果有n 具有阈值t 的对象,如果n>t 则删除n-t 得分最低的对象。
而且,定期我想获得最高-得分
我真的不知道我应该在这里使用什么数据结构来有效地做到这一点。优先级队列并没有真正起作用,因为措施一直在变化,无论如何我想要使用的“分数”可以是这些措施和当前迭代次数的任意复杂函数。显而易见的方法可能是存储关联对象 -> 度量的哈希表,具有分摊的 O(1) 添加/删除/更新操作,但随后找到最低或最高得分的对象将是 O(n) 的元素数量。 n 很容易在短时间内达到数百万,所以这并不理想。这是我能做到的最好的吗?
我意识到这可能不是很简单,但我想知道是否有人对如何最好地实现它有任何建议。
PS:语言是OCaml,但其实没关系。
【问题讨论】:
-
可能是一个b-tree,每个节点的key就是分数?
-
但是分数一直在变化,实际上每个分数在每次迭代时都会发生变化,这是由于对迭代次数的依赖。
标签: algorithm