本文为joshua317原创文章,转载请注明:转载自joshua317博客 数据结构和算法-线性查找-顺序查找 - joshua317的博客
一、顺序查找简述
什么是顺序查找呢?顺序查找就是遍历整个数据列表,逐个元素与给定值比较,若某个元素和给定值相等,则查找成功。如果直到最后一个元素和给定值比较都不相等,则查找失败。
在查找算法中,顺序查找相对比较简单,其执行的操作从数据序列中的第1个元素开始,从头到尾依次逐个查找,直到找到所要的数据或搜索完整个数据序列。顺序查找主要针对少量的、无规则的数据。
对于包含n个数据的数据序列,使用顺序查找方法查找数据,最理想的情况只需要查一次,即查找的数据位于数组的第一个,这样比较1次就能找到找到。那么最差的情况就是需比较所有的数据才找到或者比较最后都不能找到。平均来说,比较次数为n/2次,其效率比较差。
二、顺序查找的实现
package com.joshua317;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("顺序查找算法实例");
System.out.println("请输入十个整型数据");
int[] listData = new int[10];
Scanner scanner = new Scanner(System.in);
// 接收数据
for (int i = 0; i < listData.length; i++) {
listData[i] = scanner.nextInt();
}
// 打印所有数组元素
for (int i = 0; i < listData.length; i++) {
System.out.print(listData[i] + ",");
}
System.out.println("请输入要查找的数据");
int value = scanner.nextInt();
int index;
index = LinearSearch(listData, value);
if (index != -1) {
System.out.println("数据对应的位置为:"+ (index + 1) + ",数据为:" +listData[index]);
} else {
System.out.println("未找到数据");
}
}
/**
*
* @param listData 数组
* @param value 要查找的值
*/
public static int LinearSearch(int[] listData, int value) {
for (int i=0; i < listData.length; i++) {
if (listData[i] == value) {
return i;
}
}
return -1;
}
public static int LinearSearchTwo(int[] listData, int value) {
int index = 0;
while (index < listData.length && listData[index] != value) {
index++;
}
if (index >= listData.length || listData[index] != value) {
return -1;
}
return index;
}
}
三、顺序查找分析
通过上面的编程,我们不难看出,顺序查找是很简单的。
当然,顺序查找也可以结合并发来处理,比如我们把待查找的数列分为前后两个部分,开启两个线程去查找,这就是利用了多核CPU去更快地完成任务。
在介绍查找算法的性能之前,让我们先来了解一个词 ASL(Average Search Length,平均查找长度)。需要和要查找的 key 进行比较的期望次数,被称为查找算法的平均查找长度。查找成功时的 ASL 的计算公式为 ASL=Pi×Ci,其中,Pi 为查找表中第 i 个元素的概率,Ci 为找到第 i 个元素时已经比较过的次数。
其实我们在很多时候没必要太过纠结上面的公式,ASL 只是辅助我们了解查找性能的,其实和时间复杂度类似。针对顺序查找,在能够找到的情况下,ASL 为 1/n×(1+2+3+…+n),也就是 (1+n)/2,这里假设每个元素的查找概率相等。在最坏的情况下就是没有找到,近似比较 n+2 次。
现在我们来看看顺序查找的性能,平均时间复杂度为 O(n)
,n 是待查数列的长度,这其实没什么好解释的,因为顺序查找是从头到尾查找,而且我们可以看到查找了整个数组。当然最好的情况是数组的第 1 个元素就是我们要找的元素,这样可以直接找到,最坏的情况是到最后一个元素时才找到或者没有找到要找的元素。
这里我们额外分析一种并发查找的情况,实际上我们在并发查找时查找的元素可能更多,比如两个线程把待查数列分成两部分进行查找,如果元素恰巧在第 1 个线程要查的列中,那么第 2 个线程的查找就白做了。但是通常并发还是能够更快地查找的,除了这里提到的特殊情况,元素如果在后面的线程中,则会快很多,尤其是在大数列、更多的线程时。
顺序查找是对数列顺序的比较,没有额外的空间,所以空间复杂度为常数 O(1)
。
本文为joshua317原创文章,转载请注明:转载自joshua317博客 数据结构和算法-线性查找-顺序查找 - joshua317的博客