查找算法初学一

来源:互联网 发布:淘宝服装模特拍摄视频 编辑:程序博客网 时间:2024/06/04 13:06

前言:在日常生活中我们无时无刻都需要用到搜索引擎,那么在这背后搜索的算法又是怎样的呢?google、百度等等搜索算法都是很复杂的,毕竟要在数以百亿的数据中几毫秒查找出你所需要的数据。基于这个缘故,想想自己大一的时候学习的数据结构与算法,学的糊里糊涂的,现在利用一点时间重新学学并且写写博客记录一下,这里记录的都是简答的查询算法

1.顺序表查找法

/* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */int Sequential_Search(int *a,int n,int key){int i;for(i=1;i<=n;i++){if (a[i]==key)return i;}return 0;}
优化
/* 有哨兵顺序查找 */
int Sequential_Search2(int *a,int n,int key){int i;a[0]=key;i=n;while(a[i]!=key){i--;}return i;}

2.有序表查找法

/* 折半查找 */int Binary_Search(int *a,int n,int key){int low,high,mid;low=1;/* 定义最低下标为记录首位 */high=n;/* 定义最高下标为记录末位 */while(low<=high){mid=(low+high)/2;/* 折半 */if (key<a[mid])/* 若查找值比中值小 */high=mid-1;/* 最高下标调整到中位下标小一位 */else if (key>a[mid])/* 若查找值比中值大 */low=mid+1;/* 最低下标调整到中位下标大一位 */else{return mid;/* 若相等则说明mid即为查找到的位置 */}}return 0;}

/* 插值查找 */int Interpolation_Search(int *a,int n,int key){int low,high,mid;low=1;/* 定义最低下标为记录首位 */high=n;/* 定义最高下标为记录末位 */while(low<=high){mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */if (key<a[mid])/* 若查找值比插值小 */high=mid-1;/* 最高下标调整到插值下标小一位 */else if (key>a[mid])/* 若查找值比插值大 */low=mid+1;/* 最低下标调整到插值下标大一位 */elsereturn mid;/* 若相等则说明mid即为查找到的位置 */}return 0;}
关键:插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心是插值的计算公式(key-a[low])/(a[high]-a[low])

/* 斐波那契查找 */int Fibonacci_Search(int *a,int n,int key){int low,high,mid,i,k=0;low=1;/* 定义最低下标为记录首位 */high=n;/* 定义最高下标为记录末位 */while(n>F[k]-1)k++;for (i=n;i<F[k]-1;i++)a[i]=a[n];while(low<=high){mid=low+F[k-1]-1;if (key<a[mid]){high=mid-1;k=k-1;}else if (key>a[mid]){low=mid+1;k=k-2;}else{if (mid<=n)return mid;/* 若相等则说明mid即为查找到的位置 */else return n;}}return 0;}

测试代码 vc++6.0下
#include "stdio.h"    #include "stdlib.h"   #include "io.h"  #include "math.h"  #include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 100 /* 存储空间初始分配量 */typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ int F[100]; /* 斐波那契数列 *//* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */int Sequential_Search(int *a,int n,int key){int i;for(i=1;i<=n;i++){if (a[i]==key)return i;}return 0;}/* 有哨兵顺序查找 */int Sequential_Search2(int *a,int n,int key){int i;a[0]=key;i=n;while(a[i]!=key){i--;}return i;}/* 折半查找 */int Binary_Search(int *a,int n,int key){int low,high,mid;low=1;/* 定义最低下标为记录首位 */high=n;/* 定义最高下标为记录末位 */while(low<=high){mid=(low+high)/2;/* 折半 */if (key<a[mid])/* 若查找值比中值小 */high=mid-1;/* 最高下标调整到中位下标小一位 */else if (key>a[mid])/* 若查找值比中值大 */low=mid+1;/* 最低下标调整到中位下标大一位 */else{return mid;/* 若相等则说明mid即为查找到的位置 */}}return 0;}/* 插值查找 */int Interpolation_Search(int *a,int n,int key){int low,high,mid;low=1;/* 定义最低下标为记录首位 */high=n;/* 定义最高下标为记录末位 */while(low<=high){mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */if (key<a[mid])/* 若查找值比插值小 */high=mid-1;/* 最高下标调整到插值下标小一位 */else if (key>a[mid])/* 若查找值比插值大 */low=mid+1;/* 最低下标调整到插值下标大一位 */elsereturn mid;/* 若相等则说明mid即为查找到的位置 */}return 0;}/* 斐波那契查找 */int Fibonacci_Search(int *a,int n,int key){int low,high,mid,i,k=0;low=1;/* 定义最低下标为记录首位 */high=n;/* 定义最高下标为记录末位 */while(n>F[k]-1)k++;for (i=n;i<F[k]-1;i++)a[i]=a[n];while(low<=high){mid=low+F[k-1]-1;if (key<a[mid]){high=mid-1;k=k-1;}else if (key>a[mid]){low=mid+1;k=k-2;}else{if (mid<=n)return mid;/* 若相等则说明mid即为查找到的位置 */else return n;}}return 0;}  int main(void){    int a[MAXSIZE+1],i,result;int arr[MAXSIZE]={0,1,16,24,35,47,59,62,73,88,99};for(i=0;i<=MAXSIZE;i++){a[i]=i;}result=Sequential_Search(a,MAXSIZE,MAXSIZE);printf("Sequential_Search:%d \n",result);result=Sequential_Search2(a,MAXSIZE,1);printf("Sequential_Search2:%d \n",result);result=Binary_Search(arr,10,62);printf("Binary_Search:%d \n",result);result=Interpolation_Search(arr,10,62);printf("Interpolation_Search:%d \n",result);F[0]=0;F[1]=1;for(i = 2;i < 100;i++)  { F[i] = F[i-1] + F[i-2];  } result=Fibonacci_Search(arr,10,62);printf("Fibonacci_Search:%d \n",result);return 0;}



1 0
原创粉丝点击