我有一个键/值对列表(可能会使用SortedList),我不会添加新值。
相反,我将使用新键来获取边界值。例如,如果我有以下键/值对:
(0,100) (6, 200), (9, 150), (15, 100), (20, 300)
我有7的新键,我希望它返回200和150,因为7在6到9之间。
如果我给15,我希望它返回100和100(因为15正好是15)。我想要像二进制搜索这样的东西。
由于
答案 0 :(得分:2)
是的,您希望完全二进制搜索 - 使用List<t>.BinarySearch
方法,特别是重载IComparer
第二个参数(并使用简单的辅助类实现该接口)只是比较键。)
答案 1 :(得分:2)
您可以使用List<T>.BinarySearch
:
var keys = new List<int>(sortedList.Keys);
int index = keys.BinarySearch(target);
int lower;
int upper;
if (index >= 0) {
lower = upper = index;
}
else {
index = ~index;
upper = index < keys.Count ? index : index - 1;
lower = index == 0 ? index : index - 1;
}
Console.WriteLine("{0} => {1}, {2}",
target, sortedList[keys[lower]], sortedList[keys[upper]]);
您必须使用List<T>.BinarySearch
的返回值来获取边界值。从msdn开始,其返回值为:
“如果找到项目,则排序List<T>
中项目的从零开始的索引;否则,是负数,它是下一个元素的索引的按位补码,大于项目或者,如果没有更大的元素,则为Count的按位补码。“
此外,对于低于第一个或超出最后一个的元素,此代码分别“返回”第一个和最后两个。这可能不是您想要的,但您需要定义边界条件。另一个是如果集合是空的,我没有解决。