C# 通过ArrayList使用BinarySearch方法
在C#中,我们有ArrayList来存储各种类型的数据和对象 在ArrayList中,我们有IndexOf方法,它返回ArrayList中第一次出现的索引 在ArrayList中,我们还有BinarySearch方法,它在排序后的ArrayList中搜索元素并返回其索引 我的问题是:C# 通过ArrayList使用BinarySearch方法,c#,arraylist,indexof,C#,Arraylist,Indexof,在C#中,我们有ArrayList来存储各种类型的数据和对象 在ArrayList中,我们有IndexOf方法,它返回ArrayList中第一次出现的索引 在ArrayList中,我们还有BinarySearch方法,它在排序后的ArrayList中搜索元素并返回其索引 我的问题是: 据我所知,BinarySearch和IndexOf正在执行相同的任务。在什么情况下BinarySearch方法会有用?我知道BinarySearch需要一个排序的ArrayList。所以我们可以说当ArrayLis
据我所知,BinarySearch和IndexOf正在执行相同的任务。在什么情况下BinarySearch方法会有用?我知道BinarySearch需要一个排序的ArrayList。所以我们可以说当ArrayList排序时应该使用BinarySearch,而当没有排序时应该使用IndexOf方法吗?在排序数组列表中,哪种方法提供了高性能:BinarySearch还是IndexOf?定义
BinarySearch
的工作原理是逐步将搜索空间的大小减半。它依赖于搜索参数首先排序的数据来完成这一任务。它的性能是对数O(logn)
IndexOf
将执行线性搜索以查找项-O(n)的索引
后果
这实际上意味着在1000个值的ArrayList
中,如果要查找的项位于列表的末尾,IndexOf
必须检查1000个值才能找到结果BinarySearch
将首先检查中间值,然后检查剩余值的中间值,依此类推,在返回正确结果之前,实际上只检查了总共10项
当然,在实践中,搜索的项目不太可能总是在列表的末尾,因此1000次比较只是线性搜索的最坏情况。如果该项是列表中的第一项,IndexOf
将执行BinarySearch
与所有算法一样,使用哪种算法在很大程度上取决于您要完成的任务和数据的性质。
如果您的数据未排序,并且您不想更改ArrayList
中项目的顺序,或者如果比较数据是一项昂贵的操作,BinarySearch
的计算成本可能远高于IndexOf
,尽管由于需要复制ArrayList
并对该副本进行排序,因此平均执行的比较较少
如果您需要查找的项目通常是ArrayList
(平均)中的第一个项目之一,那么IndexOf
可能是最好的选择
类似地,如果您有一个非常小的数组(按10项的顺序),BinarySearch
将不会产生明显更好的结果
依赖于BinarySearch
的代码也可能更难维护-您的代码必须记录这样一个事实,即维护数据的顺序对于应用程序的正确性能至关重要-否则其他开发人员稍后可能会更改代码,使数据重新排序,从而使二进制搜索和破坏应用程序
如果您的数据已经排序(即,不需要为了搜索而对其进行排序),则在搜索包含多个值的列表中的项目时,BinarySearch
几乎总是优于IndexOf
。。。但是,在同时执行任何其他非平凡任务(如I/O绑定活动)的应用程序中,性能增益的级别可能完全不重要
建议
一般来说,人们应该倾向于使用没有要求或副作用的简单操作(例如,IndexOf
),直到(通过分析)发现BinarySearch
将显著提高应用程序的可用性或效率
无论何时选择算法,都要记录其原因。它将帮助其他开发人员理解代码,有时“其他”开发人员将是您,在您忘记为什么首先选择一种算法而不是另一种算法多年后回顾代码。感谢pal提供的详细答案,我真的很感谢你在详细说明何时使用哪一个方面所做的努力。你的回答在我脑海中引起了更多的疑问,希望我的疑问能传到你的手中,因为不知什么原因,我无法在这里提到你的用户名@MATT。我的查询1=>如果我们的ArrayList中有已经排序的元素,现在有人试图向其中添加新元素,那么现在如何维护排序的特征?在添加新元素时总是要担心这一点。查询2=>如果ArrayList还没有排序,我想对它进行排序,但它包含一些ID属性的对象,我想对ID进行排序。我得到了一些相关的qry,其中谈到了实现类的IComparable接口,就这些吗?它能解决我的问题吗?如果您有新问题,请创建一个新问题,而不是在评论中提出问题。要在
ArrayList
上保持排序顺序,请在每次插入或追加操作后执行Sort
,或者在插入项目之前计算项目应该插入的位置(例如使用BinarySearch
)。第二种选择可能更有效。根据您的应用程序,您可能会发现在每次插入后不需要保持排序顺序,并且只能在需要时进行排序(即,如果不需要经常搜索,则只能在搜索之前进行排序)。要在类实例的ArrayList
上执行排序
,您需要为类实现。在拥有具有id
属性的类的示例中,根据id实现比较。