在C#中,我们有ArrayList来存储各种类型的数据和对象。
在ArrayList中,我们有IndexOf方法,它返回ArrayLIst中第一次出现的索引。
同样在ArrayList中,我们有BinarySearch方法,它在Sorted ArrayList中搜索一个元素并返回它的索引。
我的查询: 据我所知,BinarySearch和IndexOf正在做同样的任务。在什么情况下BinarySearch方法会有用?我知道BinarySearch需要一个排序的ArrayList。所以我们可以说当ArrayList被排序时,应该使用BinarySearch,当没有排序时我们应该使用IndexOf方法吗?同样在Sorted ArrayList中哪种方法具有高性能:BinarySearch或IndexOf?
答案 0 :(得分:2)
<强>解释强>
BinarySearch
通过逐渐减半搜索空间的大小来工作。它依赖于首先由搜索参数排序的数据来完成此任务。它的性能是对数 - O(log n)
IndexOf
将执行线性搜索以查找项目的索引 - O(n)。
后果
这实际上意味着在ArrayList
的1000个值中,正在搜索的项目位于列表的末尾,IndexOf
必须检查1000个值才能找到结果。 BinarySearch
首先检查中间值,然后检查剩余值的中间值,依此类推,实际上只检查10个项目,然后返回正确的结果。
当然,在实践中,所寻求的项目不太可能始终位于列表的末尾,因此1000次比较只是最坏情况线性搜索。如果该项目是列表中的第一项,IndexOf
将超出BinarySearch
。
与所有算法一样,使用哪种算法在很大程度上取决于您要完成的工作以及数据的性质。
如果您的数据未排序且您不想更改ArrayList
中项目的顺序,或者比较数据是一项昂贵的操作,那么BinarySearch
的计算成本可能远远高于IndexOf
。 {1}}尽管由于需要复制ArrayList
并对该副本进行排序而平均执行的比较较少。
如果您需要查找的项目通常是ArrayList
(平均)中的第一项,那么IndexOf
可能是最佳选择。
同样,如果你有一个非常小的数组(大约10个项目),BinarySearch
将不会产生明显更好的结果。
依赖BinarySearch
的代码也可能更难维护 - 您的代码必须记录这样一个事实:维护数据的排序对于应用程序的正确性能至关重要 - 否则另一个开发人员可能会稍后将代码更改为重新排序数据使二进制搜索无效并破坏应用程序的东西。
如果您的数据已经排序,(例如,不需要对其进行排序只是为了进行搜索而进行排序),那么BinarySearch
几乎总是会优于IndexOf
在多个值的列表中搜索项目......但是,在执行任何其他非平凡任务(例如I / O绑定活动)的应用程序中,性能提升的级别可能完全无关紧要。
<强>建议强>
一般来说,人们应该支持没有要求或副作用的简单操作(即IndexOf
),直到明显(通过剖析)BinarySearch
显着改善< / em>应用程序的可用性或效率。
每当您选择算法时,请始终记录原因。它将帮助其他开发人员理解代码,有时候“其他”开发人员将成为您,在您忘记为什么首先选择一种算法而不是另一种算法时,会在几年后查看代码。