将方法 BinarySearch 与 ArrayList 一起使用
Uses of method BinarySearch with ArrayList
在 C# 中,我们有 ArrayList 来存储各种类型的数据和对象。
在 ArrayList 中我们有 IndexOf 方法,returns ArrayLIst 中第一次出现的索引。
同样在 ArrayList 中,我们有 BinarySearch 方法,它在 Sorted ArrayList 中搜索元素和 returns 它的索引。
我的查询:
据我了解,BinarySearch 和 IndexOf 正在做同样的事情 task.In BinarySearch 方法在什么情况下会有用?我知道 BinarySearch 需要一个排序的 ArrayList 。那么我们可以说当 ArrayList 排序时应该使用 BinarySearch 而当没有排序时我们应该使用 IndexOf 方法吗?同样在 Sorted ArrayList 中,哪种方法提供了高性能:BinarySearch 或 IndexOf ?
定义
BinarySearch
通过逐渐将搜索大小减半来工作 space。它依赖于首先由搜索参数 排序的数据 来完成此操作。它的性能是对数的 - O(log n)
IndexOf
将执行 线性搜索 以查找项目的索引 - O(n)。
后果
这实际上意味着在 ArrayList
的 1000 个值中,如果要查找的项目位于列表的末尾,IndexOf
将必须检查 1000 个值才能找到结果。 BinarySearch
将首先检查中间值,然后是剩余值的中间值,依此类推,实际上总共只检查 10 个项目,然后返回正确结果。
当然,在实践中搜索的项目不太可能总是在列表的末尾,所以 1000 次比较只是 最差- case scenario 用于线性搜索。如果该项目是列表中的第一个,IndexOf
将优于 BinarySearch
.
与所有算法一样,使用哪种算法在很大程度上取决于您要实现的目标和数据的性质。
如果您的数据未排序并且您不想更改 ArrayList
中项目的顺序,或者如果比较数据是一项昂贵的操作,BinarySearch
的计算成本可能要高得多尽管由于需要制作 ArrayList
的副本并对该副本进行排序,平均执行的比较次数少于 IndexOf
。
如果您需要查找的项目通常是 ArrayList
中的第一个项目(平均而言),那么 IndexOf
可能是最好的选择。
同样,如果您有一个非常小的数组(大约 10 个项目),BinarySearch
不会产生明显更好的结果。
依赖于 BinarySearch
的代码也可能更难维护 - 您的代码必须记录这样一个事实,即维护数据的顺序对于应用程序的正确性能至关重要 - 否则其他开发人员稍后可能会更改重新排序数据的代码使二进制搜索无效并破坏应用程序。
如果您的数据已经排序(即不需要为了搜索目的而排序),那么 BinarySearch
几乎总是优于 IndexOf
在包含多个值的列表中搜索项目时...但是在还执行任何其他重要任务(例如 I/O绑定活动)。
推荐
一般来说,人们应该倾向于没有要求或副作用的更简单的操作(即 IndexOf
),直到(通过分析)变得明显 BinarySearch
会 显着提高 应用程序的可用性或效率。
每当您选择一种算法时,请务必记录原因。它将帮助其他开发人员理解代码,有时 "other" 开发人员就是您,在您忘记最初为什么选择一种算法而不是另一种算法多年后审查代码。
在 C# 中,我们有 ArrayList 来存储各种类型的数据和对象。
在 ArrayList 中我们有 IndexOf 方法,returns ArrayLIst 中第一次出现的索引。
同样在 ArrayList 中,我们有 BinarySearch 方法,它在 Sorted ArrayList 中搜索元素和 returns 它的索引。
我的查询: 据我了解,BinarySearch 和 IndexOf 正在做同样的事情 task.In BinarySearch 方法在什么情况下会有用?我知道 BinarySearch 需要一个排序的 ArrayList 。那么我们可以说当 ArrayList 排序时应该使用 BinarySearch 而当没有排序时我们应该使用 IndexOf 方法吗?同样在 Sorted ArrayList 中,哪种方法提供了高性能:BinarySearch 或 IndexOf ?
定义
BinarySearch
通过逐渐将搜索大小减半来工作 space。它依赖于首先由搜索参数 排序的数据 来完成此操作。它的性能是对数的 - O(log n)
IndexOf
将执行 线性搜索 以查找项目的索引 - O(n)。
后果
这实际上意味着在 ArrayList
的 1000 个值中,如果要查找的项目位于列表的末尾,IndexOf
将必须检查 1000 个值才能找到结果。 BinarySearch
将首先检查中间值,然后是剩余值的中间值,依此类推,实际上总共只检查 10 个项目,然后返回正确结果。
当然,在实践中搜索的项目不太可能总是在列表的末尾,所以 1000 次比较只是 最差- case scenario 用于线性搜索。如果该项目是列表中的第一个,IndexOf
将优于 BinarySearch
.
与所有算法一样,使用哪种算法在很大程度上取决于您要实现的目标和数据的性质。
如果您的数据未排序并且您不想更改 ArrayList
中项目的顺序,或者如果比较数据是一项昂贵的操作,BinarySearch
的计算成本可能要高得多尽管由于需要制作 ArrayList
的副本并对该副本进行排序,平均执行的比较次数少于 IndexOf
。
如果您需要查找的项目通常是 ArrayList
中的第一个项目(平均而言),那么 IndexOf
可能是最好的选择。
同样,如果您有一个非常小的数组(大约 10 个项目),BinarySearch
不会产生明显更好的结果。
依赖于 BinarySearch
的代码也可能更难维护 - 您的代码必须记录这样一个事实,即维护数据的顺序对于应用程序的正确性能至关重要 - 否则其他开发人员稍后可能会更改重新排序数据的代码使二进制搜索无效并破坏应用程序。
如果您的数据已经排序(即不需要为了搜索目的而排序),那么 BinarySearch
几乎总是优于 IndexOf
在包含多个值的列表中搜索项目时...但是在还执行任何其他重要任务(例如 I/O绑定活动)。
推荐
一般来说,人们应该倾向于没有要求或副作用的更简单的操作(即 IndexOf
),直到(通过分析)变得明显 BinarySearch
会 显着提高 应用程序的可用性或效率。
每当您选择一种算法时,请务必记录原因。它将帮助其他开发人员理解代码,有时 "other" 开发人员就是您,在您忘记最初为什么选择一种算法而不是另一种算法多年后审查代码。