返回首页


最近,我给一组的开发任务,它可以简化为以下简单的问题:你有一个排序的数组元素;找到一个给定的元素在这个数组的索引。他们想出了以下解决方案:

//given array

int[] sortedArray = new[] { 1, 5, 8, 12, 18, 20 };

//Create a list from the array

List<int> list = new List<int>(sortedArray);

//use IndexOf method to find the element

int result = list.IndexOf(8);

当然,它工作得很好,但没有,AOT我们做的工作太多了吗?我们或许可以使用给定的数组排序的事实吗?我们需要一个额外的数据结构?
如果我们在阅读MSDN类文档的性能注意事项"部分中,我们看到执行的indexOf()操作,列表内容进行排序,然后执行它的二进制搜索。见:
所以我们可以简单地使用bina叮()阵列的静态类的方法。所以bina叮()
基本的IndexOf()不相同,但更快,有时,AOS更好地记住,而不是使用复杂的数据结构,高效率地完成任务非常狭窄的基本算法。
二进制搜索算法的详细信息,请参阅{A}。为什么BinarySeacrh的()做多的indexOf()不?
让,的AOS寻找不存在的元素,使用这两种方法,并比较结果。
结果看起来很奇怪:{体C3}
他们都提供了一个负值,应解释为没有找到元素。 howevernbsp为opposednbsp;到List.IndexOf()总是提供-1,的Array.BinarySearch()返回负值,Äúmagic??类的文档中可以找到下面的解释:
返回值:指定数组中指定的值的索引,如果发现价值。如果没有找到值和值是小于一个或多个元素的数组,这是一个负数索引的第一个元素是值较大的位元补。如果没有找到值和值是大于任何数组中的元素,这是一个负数(的最后一个元素的索引加1)的位元补。
有关更多信息,请参阅{A2的}。
听起来很复杂,但意味着thenbsp;如下:二进制搜索旅游二叉树,在一些点,实现了该元素不能被发现和某个节点上停止。如果你否定的二进制搜索的结果,并减去1,你会得到这个元素的索引。指数12345元素158121820
所以,如果你搜索7,结果将是否定的元素的索引8减1等于2。
所以,如果你搜索17,结果将是否定的元素的索引18减1等于4。
计算公式为:{的C4}
重要:如果您正在寻找一个值大于最后一个元素,这个公式给你数组的长度,这是一个非现有指数。所以你不应该使用这种计算的结果来访问数组元素,没有检查,如果它比长度,AOS少。
所以,如果你搜索22,结果将是-7。 - (-7)-1 = 6 =数组的长度。
bina叮()的返回值可以用在广泛的算法。例如,当解决问题的顶点碰撞检测。它也可能是有用的文本段工作时。
{A3的} {七}

回答

评论会员: 时间:2