Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与手动搜索列表相比,Collections.binarySearch的性能如何?_Java_Collections - Fatal编程技术网

Java 与手动搜索列表相比,Collections.binarySearch的性能如何?

Java 与手动搜索列表相比,Collections.binarySearch的性能如何?,java,collections,Java,Collections,我想知道该用哪一个。我有一份学生名单。我想用他的名字搜索一个学生。到目前为止,我是通过如下迭代列表手动完成的 for(int i = 0; i < list.size(); i++) { Student student = list.get(i); if(student.getName().equals(studentNameIWantToSearch)) { index = i; break; } } Student studen

我想知道该用哪一个。我有一份学生名单。我想用他的名字搜索一个学生。到目前为止,我是通过如下迭代列表手动完成的

for(int i = 0; i < list.size(); i++) {
    Student student = list.get(i);
    if(student.getName().equals(studentNameIWantToSearch)) {
        index = i;
        break;
    }
}

Student student = list.get(index);
//my logic from here
for(int i=0;i
最近我看到了一个名为
binarySearch(ListJava的集合)的方法。sort()需要O(n logn)时间。所以sort+二进制搜索需要O(n logn)+O(logn)。将其与O(n)线性搜索进行比较

您可能还需要考虑到只需排序一次。因此,如果您使用线性搜索搜索x次,您现在将采用O(n logn)排序,并添加O(n)算法的x次迭代,而不是添加O(logn)算法的x次迭代,这显然成本更高

what if I don't want to sort the list?
正如文件所说

如果未排序,则结果未定义。如果列表包含多个与指定对象相等的元素,则无法保证将找到哪个元素。

如果您有多个与列表中其他名称相似的名称,则可以保证使用
binarySearch
找到该名称

an anyone please tell me why should I use binary search instead of manually searching.
如果您使用的ArrayList是一个
随机访问
列表,没有任何名称重复,那么它将在O(log n)中搜索

以下是文档

This method runs in log(n) time for a "random access" list (which provides near-constant-time positional access). 
因此,如果您使用的列表不是
randon access
ex.
LinkedList
,则它将以
O(n)


二进制搜索比普通搜索快得多

假设您有一个包含11个元素的列表:
a、c、d、f、g、j、m、p、r、s、z
。您的for循环在元素上迭代,最少迭代1次,最多迭代11次,这使得查找元素的平均迭代次数为5.5次。现在,让我们尝试从列表中选择
r
。二进制搜索的工作方式是:pi勾选中间元素(在我们的例子中是
j
)。
r
j
,因此
r
的索引大于
j
。让我们再来一次,中间元素从
m
z
。也就是说
r
,我们已经到了

您可以看到,平均而言,我们的迭代次数较少。每次迭代,都会保留一半的元素


这就是二进制搜索的优点。缺点是必须对列表进行排序。因此,如果您经常更改列表,则需要对插入的元素进行排序,然后使用二进制搜索可能太“昂贵”。否则,如果您经常搜索,则可能需要使用二进制搜索。

如果搜索的成本超过成本,则使用二进制搜索排序的成本(例如,在一个不变的列表上进行大量搜索)。不过,先进行评测是个好主意。您可以在javadoc上找到Java用于排序方法的排序算法的详细信息。建议a)自我介绍并查看b)除非你的学生名单很大-为什么要强调它?我真的认为你应该扩展这个答案。这个答案比Big-O分析要深入得多,因为Big-O并不是决定选择哪种算法的全部。例如:搜索次数超过
n次,线性搜索开始变得非常昂贵。@整晚你能用列表中500个元素的例子解释一下吗?假设我有500个元素。进行排序的操作为500 log 500。现在我正在搜索元素。它的原木是500。总运算量为500*2.x+2.x。其中,如果我线性搜索,它是500个操作。我的理解是,如果列表总是在变化,我必须进行线性搜索。如果搜索更多,并且添加元素的频率更低,那么我必须选择二进制搜索。“我说得对吗?”克里希纳柴坦尼亚是的,这将是一个总的结论。如果在同一个列表上执行一个或两个搜索,则线性搜索速度更快。如果您在同一个列表上执行三次或更多搜索,则排序+二进制搜索速度更快。前提是您保留已排序的结果。假设我有500个元素。进行排序的操作为500 log 500。现在我正在搜索元素。它的原木是500。总运算量为500*2.x+2.x。其中,如果我线性搜索,它是500个操作。我的理解是,如果列表总是在变化,我必须进行线性搜索。如果搜索更多,并且添加元素的频率更低,那么我必须选择二进制搜索。我说的对吗?@KrishnaChaitanya你计算的手术次数不正确。Big-O表示法只是将算法复杂性的上限描述为
n
的变化。你不能用那样的数字来代替。您所知道的是,排序操作的数量以
knlgn
为界,其中
k
是一个常数。O(lgn)和O(n)的情况类似。但最后,我认为你的想法是正确的。一次性搜索一个未排序的列表,考虑线性。在列表中重复搜索,考虑Bialay.OP已经阅读文档。我不想粗鲁,但我不认为在没有任何实际建议的情况下引用更多的文档对他有什么意义。
If the specified list does not implement the RandomAccess interface and is large, this method 
will do an iterator-based binary search that performs O(n) link traversals and O(log n) element
comparisons.