【问题标题】:I have a sorted list of key/value pairs, and want to find the values adjacent to a new key我有一个键/值对的排序列表,并希望找到与新键相邻的值
【发布时间】:2023-04-04 01:47:01
【问题描述】:

我有一个键/值对列表(可能会使用 SortedList),我不会添加新值。

相反,我将使用新键来获取边界值。例如,如果我有以下键/值对:

(0,100) (6, 200), (9, 150), (15, 100), (20, 300) 

我有新的密钥 7,我希望它返回 200 和 150,因为 7 介于 6 和 9 之间。

如果我给出 15,我希望它返回 100 和 100(因为 15 正好是 15)。我想要类似二进制搜索的东西。

谢谢

【问题讨论】:

  • 如果您有以下搜索条件,您会期望什么输出(用您的话来说是“返回”):(-10, 50) ... 或 (25, 400)?

标签: c# generics collections sortedlist sorteddictionary


【解决方案1】:

您可以使用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&lt;T&gt;.BinarySearch 的返回值才能到达边界值。来自msdn,其返回值为:

"排序后的List&lt;T&gt;中的item从零开始的索引,如果找到item;否则,一个负数,它是下一个大于item的元素的索引的按位补码,或者,如果没有更大的元素,Count 的按位补码。”

此外,对于低于第一个或超过最后一个的元素,此代码分别“返回”第一个和最后一个两次。这可能不是您想要的,但您可以定义边界条件。另一个是如果集合是空的,我没有解决。

【讨论】:

  • 这看起来像我想要的,我回家试试。我想知道上层是否意味着使用 + 而不是 - 但我可以测试一下。谢谢!
【解决方案2】:

是的,你想要完全二分搜索——使用List&lt;t&gt;.BinarySearch 方法,特别是采用IComparer 第二个参数的重载(并使用仅比较键的简单辅助类实现该接口)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2020-11-16
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多