3

我需要一个始终按值排序并且可以按键索引的字典(或任何其他集合)。我的目的是实现一个缓存,其中对象具有唯一的键和与之关联的指标。当必须完成缓存替换时,将删除具有最少度量的对象。它需要尽可能快,因此每次更换完成时都进行完整订购并不是一个好的选择。有任何想法吗?谢谢

4

5 回答 5

3

像这样的东西应该可以正常工作(没有经过太多测试):

http://pastebin.com/eYeE33F5

于 2011-08-17T08:52:51.930 回答
0

它接缝优先级队列是您正在寻找的。这个类有很好的使用二进制堆的实现。示例: http: //www.codeproject.com/Articles/126751/Priority-queue-in-Csharp-with-help-of-heap-data-st.aspx

于 2011-08-17T08:11:54.297 回答
0

你为什么不保留常规的字典。现在,每当您需要进行缓存替换时,就是您选择具有“最小”值的元素并替换它的时刻。

编辑 - 这是您如何获得具有最小值的 KeyPair。之后只需使用 Key 和 Value 属性:

var minValuePair = myDictionary.OrderBy(p => p .Value).First();
于 2011-08-17T08:12:33.053 回答
0

您可以将任何类型的快速优先级队列(看这里:.Net 中的优先级队列)与标准字典组合到一个新集合中。插入新元素时,将对该元素的引用插入到两个容器中。通过“键”查找元素时,请使用字典。当您要删除“metric”最低的元素时,使用优先级队列找到它,从元素本身获取键,然后很容易从两个容器中删除元素引用。

于 2011-08-17T08:20:41.573 回答
0

您需要一个按值排序但也按键索引的字典。您不能同时以两种方式排列数据,因此您必须有两个集合、基本键值字典和反向查找字典。您的第一个是标准字典,您的第二个是SortedDictionary具有相同数据并且交换了键和值的字典。您必须使两者保持同步。

您还可以编写自己的 Dictionary 实现来将这两个集合封装为一个。

于 2011-08-17T08:21:17.393 回答