作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简单问题 - 给出 IList<T>
如何在不自己编写方法且不将数据复制到具有内置二分搜索支持的类型的情况下执行二分搜索。我目前的状态如下。
List<T>.BinarySearch()
不是 IList<T>
的成员ArrayList.Adapter()
等效的项方法List<T>
IList<T>
不继承自IList
,因此使用 ArrayList.Adapter()
不可能的我倾向于认为使用内置方法不可能做到这一点,但我无法相信 BCL/FCL 中缺少这样的基本方法。
如果不可能,谁能给 IList<T>
最短、最快、最智能、最漂亮的二分查找实现?
更新
我们都知道在使用二分搜索之前必须对列表进行排序,因此您可以假设它是这样的。但我假设(但没有验证)排序有同样的问题 - 你如何排序 IList<T>
?
结论
似乎没有内置的二分搜索 IList<T>
。可以使用First()
和OrderBy()
LINQ 方法进行搜索和排序,但它可能会影响性能。自己实现它(作为扩展方法)似乎是您能做的最好的事情。
最佳答案
我怀疑 .NET 中是否存在这样的通用二分搜索方法,除了某些基类中存在的方法(但显然不在接口(interface)中),所以这是我的通用二分搜索方法。
public static Int32 BinarySearchIndexOf<T>(this IList<T> list, T value, IComparer<T> comparer = null)
{
if (list == null)
throw new ArgumentNullException(nameof(list));
comparer = comparer ?? Comparer<T>.Default;
Int32 lower = 0;
Int32 upper = list.Count - 1;
while (lower <= upper)
{
Int32 middle = lower + (upper - lower) / 2;
Int32 comparisonResult = comparer.Compare(value, list[middle]);
if (comparisonResult == 0)
return middle;
else if (comparisonResult < 0)
upper = middle - 1;
else
lower = middle + 1;
}
return ~lower;
}
这当然假设相关列表已经根据比较器将使用的相同规则进行排序。
关于.net - 如何对 IList<T> 执行二分查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967047/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!