【发布时间】:2014-06-06 21:17:56
【问题描述】:
我有一个包含类似数据的字典(字典将有大约 100k 个条目):
[1] -> 5
[7] -> 50
[30] -> 3
[1000] -> 1
[100000] -> 35
我还有一个范围列表(大约 1000 个)
MyRanges
Range
LowerBoundInclusive -> 0
UpperBoundExclusive -> 10
Total
Range
LowerBoundInclusive -> 10
UpperBoundExclusive -> 50
Total
Range
LowerBoundInclusive -> 100
UpperBoundExclusive -> 1000
Total
Range
LowerBoundInclusive -> 1000
UpperBoundExclusive -> 10000
Total
Range (the "other" range)
LowerBoundInclusive -> null
UpperBoundExclusive -> null
Total
我需要计算字典中这些范围的总数。例如,0-10 的范围是 55。这些范围可能会变得非常大,所以我知道只在字典中搜索两个范围之间的每个值是没有意义的。我的直觉是我应该从字典中获取一个键列表,对其进行排序,然后遍历我的范围并进行某种搜索以查找范围内的所有键。这是正确的方法吗?有没有简单的方法可以做到这一点?
编辑: 感谢您的回复。真正聪明的东西。不过,我忘记了一个非常重要的警告。不能保证范围是连续的,最终的范围是不在其他范围内的所有内容。
【问题讨论】:
-
不,你的预感是错误的。您应该只遍历范围检查键是否存在,如果存在则使用该值。
-
100K 条目?或许可以考虑改用某种数据库。
-
我建议
SortedDictionary<K, V>:msdn.microsoft.com/en-us/library/f7fta44c(v=vs.110).aspx。这样一来,您就可以在达到范围上限时中止迭代。 -
在您的示例中,第三个和第四个范围重叠;这是故意的吗?你真的有重叠的范围吗?如果这样做,则意味着可以将一个值计为多个范围的一部分,因此它会大大改变实现...
-
这是无意的。没有重叠范围。
标签: c# algorithm dictionary