.NET是否具有KeyValuePair <k,v> </k,v>的现有二进制搜索类

时间:2014-06-05 06:15:52

标签: c# .net binary-search

在我的Unity3d应用程序中,我需要检测用户选择的折线。确定这一点的简单方法是向每个GameObject(折线)添加一个碰撞器组件,然后我会在用户点击折线时知道。但这非常低效,因为我将拥有数千条折线。

所以我更有效的方法是将每条折线距离点{0,0,0}存储在List <KeyValuePair<double,GameObject>>中。此列表将从最低距离到最高距离排序。当用户选择游戏中的一个点时,我将确定这些点数&#39;距离(D)距离(0,0,0)然后使用“上限”#39; Binary Search找到最接近此点的折线(即与(0,0,0)的距离相近)。

我的问题:在我去重新发明轮子并编码我自己的“上界”之前。二进制搜索算法,元素排序等,是否有一个C#.NET类用于上边界二进制搜索,它将对我进行排序和搜索?

我知道方法List(T).BinarySearch(),但是我应该确保List正确排序吗?如果我的列表没有排序,并且该方法需要对每个方法调用进行排序,那么这可能效率很低。

2 个答案:

答案 0 :(得分:1)

您可以使用SortedList<double, GameObject>来存储多边形,而不是List <KeyValuePair<double,GameObject>>。或者你在添加了所有多边形后排序()你的List<>一次(如果你不打算在后面添加其他多边形,那么第二个选项最好)。

IList下限的@LeakyCode provided an implementation,它会为您提供最接近GameObject的索引(在您的列表中):

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);
}

答案 1 :(得分:0)

您是否应该首先使用List<T>.Sort方法对列表进行排序,并在类中实现我们自己的IComparer<T>。我认为这是最好的方法。

References to IComparer Reference to ISort