查找算法初学一
来源:互联网 发布:淘宝服装模特拍摄视频 编辑:程序博客网 时间: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
- 查找算法初学一
- STL算法---查找算法(一)
- Java查找算法(一): 二分法查找
- 查找算法总结一 顺序查找
- java查找算法(一)--顺序查找
- 查找算法(一)顺序查找
- 查找算法(一):顺序查找
- 初学算法 (一) --并归排序
- C++初学,泛型算法 一
- 查找算法总结(一)
- 查找算法总结(一)
- 查找算法总结(一)
- 算法学习--查找(一)
- 常见查找算法(一)
- 查找算法一之顺序查找 二分查找
- 查找算法练习一(线性查找+折半查找)
- 算法之 查找算法 (一) Java
- 【数据结构与算法之查找算法一】顺序查找
- C++中重载、重写(覆盖)和隐藏的区别实例分析
- 红黑树
- JNI & NDK 实例讲解一 (不通过NDK创建JNI项目)
- eclipse插入mysql是数据乱码问题(转)
- 160_折半枚举(双向搜索) 4 Values whose sum is 0 (POJ No.2785)
- 查找算法初学一
- VBA读取XML文件
- 文章标题 Hadoop:编写一个求和排序的MR
- ROS naviagtion analysis: costmap_2d--Costmap2D
- tomcat+nginx+memchaed+myeclipse2014
- 生产者消费者模式
- 如何让IDEA的properties中的中文进行unicode转码,正确显示
- 人民币数字转换汉字【修改整理】
- 蚁群算法