数据结构查找算法
1.顺序查找
又叫线性查找,是一种基本的查找算法。查找过程:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,
若某个记录的关键字和给定值相等,则查找成功,如果查找到表中最后一个元素,还没有找到,则查找不成功。
代码:
public int Search(int [] array , int key){
int i;
for(i = 0; i<array.length; i++){
if(array[i] == key){
return i;
}
}
return -1;
}
时间复杂度:顺序查找的时间复杂度为O(n);
优点:简单,是对表中数据元素的存储没有要求;
缺点:当n很大时,查找效率极为低下。
2.折半查找
又称为二分查找。它的前提是线性表中的记录是关键码有序,线性表必须采用顺序存储。
查找过程:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于关键字,则在中间记录的左边查找;
若大于关键字,则在中间记录的右边查找。不断重复,直到查找成功。
代码:
public int Search(int [] array , int key){
int low,higt,mid;
low = 0;
high = array.length -1;
while(low <= high){
mid = (low+high)/2;
if(key< array[mid])
high = mid-1;
else if (key>array[mid])
low = mid+1;
else
return mid;
}
return -1;
}
时间复杂度:顺序查找的时间复杂度为O(logn);
优点:效率快;
缺点:需要查找表有序。
3.插值查找
基于二分查找,将查找的选择改进为自适应选择,可以提高查找效率。根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,
其核心就在于插值得计算公式:mid = low + (key -a [low])/(a[high] - a[low])(high - low),替换了二分查找到的:mid=low+1/2(high-low)
public int Search(int[] array, int key){
int low,high,mid;
low = 0; //定义最低下标为数组首位
high = array.length-1; //定义最高下标为数组末位
while (low <= high){
mid = low + (high-low)*(key-array[low])/(array[high]-array[low]); //自适应选择查找点
if(key < array[mid])
high = mid-1;
else if(key > array[mid])
low = mid+1;
else
return mid;
}
return -1;
}
时间复杂度:顺序查找的时间复杂度为O(logn);
优点:效率快,且优于二分查找;
缺点:需要查找表有序且不适合极端不均匀的数据。
4.二叉排序树查找
二叉排序树中查关键字,在二叉树不为空的情况下,首先将被查找的值同树的节点进行比较,有三种情况:
如果相等,则查找成功;
如果比较结果为根节点的关键值较大,则说明关键字可能存在其左子树中;
如果比较结果为根节点的关键值较小,则说明关键字可能存在其右子树中;
代码:(运用递归的方法)
BiTree Search (BiTree T, KeyType key){
//如果递归过程中T为空,则查找结果返回null;或者查找成功,返回指向该关键字的指针
if(!T || key == T->data) {
retur n T;
}else if (key<T->data) {
//递归遍历左孩子
return Search(T->lchild, key);
}else{
//递归遍历右孩子
return Search(T->rchild, key);
}
}
时间复杂度:O(logn),最坏情况下的复杂度O(n)
优点:查找效率很高
缺点:用这个算法之前要先创建树;