C# .NET是否有KeyValuePair的现有二进制搜索类<;K、 V>;
在我的Unity3d应用程序中,我需要检测用户选择的多段线。确定这一点的简单方法是向每个游戏对象(多段线)添加一个碰撞器组件,这样每当用户单击多段线时,我就知道了。但这是难以置信的低效,因为我将有数千条多段线 因此,我更有效的方法是将距点(0,0,0)的每条多段线存储在C# .NET是否有KeyValuePair的现有二进制搜索类<;K、 V>;,c#,.net,binary-search,C#,.net,Binary Search,在我的Unity3d应用程序中,我需要检测用户选择的多段线。确定这一点的简单方法是向每个游戏对象(多段线)添加一个碰撞器组件,这样每当用户单击多段线时,我就知道了。但这是难以置信的低效,因为我将有数千条多段线 因此,我更有效的方法是将距点(0,0,0)的每条多段线存储在列表中。此列表将从最低距离到最高距离排序。当用户在游戏中选择一个点时,我将确定该点与(0,0,0)之间的距离(D),然后使用“上界”二进制搜索查找最接近该点的多段线(即,与(0,0,0)的距离相似) 我的问题:在我重新发明轮子并编
列表中。此列表将从最低距离到最高距离排序。当用户在游戏中选择一个点时,我将确定该点与(0,0,0)之间的距离(D),然后使用“上界”二进制搜索
查找最接近该点的多段线(即,与(0,0,0)的距离相似)
我的问题:在我重新发明轮子并编写我自己的“上界”二进制搜索算法、元素排序等之前,是否有一个用于上界二进制搜索的C#NET类可以为我排序和搜索
我知道方法List(T).BinarySearch()
,但是否由我来确保List
正确排序?如果我的列表没有排序,并且该方法需要对每个方法调用的列表进行排序,那么这可能会非常低效。您是否应该首先使用list.sort
方法对列表进行排序,并在类中实现我们自己的IComparer
。我认为这是最好的办法
您可以使用排序列表
来存储已排序的多边形,而不是列表
。或者,在添加所有多边形后,对列表进行一次排序()(显然,如果以后不添加其他多边形,则第二个选项是最好的)
@IList
的下限泄漏码,它将为您提供最接近的游戏对象的索引(在您的列表中):
private static int BinarySearch<T>(IList<T> list, T value)
{
if (list == null)
throw new ArgumentNullException("list");
var comp = Comparer<T>.Default;
int lo = 0, hi = list.Length - 1;
while (lo < hi) {
int m = (hi + lo) / 2; // this might overflow; be careful.
if (comp(list[m], value) < 0) lo = m + 1;
else hi = m - 1;
}
if (comp(list[lo], value) < 0) lo++;
return lo;
}
public static int FindFirstIndexGreaterThanOrEqualTo<T,U>
(this SortedList<T,U> sortedList, T key)
{
return BinarySearch(sortedList.Keys, key);
}
private静态int二进制搜索(IList列表,T值)
{
if(list==null)
抛出新的ArgumentNullException(“列表”);
var comp=比较器默认值;
intlo=0,hi=list.Length-1;
while(lo
仅确认MSDN中的最后一段:“列表必须已根据比较器实现进行排序;否则,结果不正确。”您是否尝试过使用SortedList
/SortedDictionary
?来自MSDN:“SortedList泛型类是一个具有O(logn)检索的键/值对数组”。但请注意,只能插入唯一的键。