查找算法
来源:互联网 发布:gs与js防水涂料的区别 编辑:程序博客网 时间:2024/06/04 19:19
1. 二分法
(1)先将查找表排序
(2)取中间元素进行比较
1)若给定数据=中间元素,则查找成功
2)若给定数据<中间元素,则在中间元素左区间进行二分查找
3)若给定数据>中间元素,则在中间元素右区间进行二分查找
例如:
//递归版本:效率低,但可读性高
int binary_search(int *a, int low, int high, int key) //O(logn)
{
int ret = -1;
int mid;
if(low <= high)
{
mid = (low+high)/2;
printf("mid:%d\n", mid);
if(a[mid] == key)
ret = mid;
else if(a[mid] > key)
ret = binary_search(a, low, mid-1, key);
else if(a[mid] < key)
ret = binary_search(a, mid+1, high, key);
}
return ret;
}
//循环版本(推荐使用):效率高,但可读性差
int binary_search_ex(int *a, int low, int high, int key) //O(logn)
{
int ret = -1;
int mid = -1;
while(low <= high)
{
mid = (low + high)/2;
printf("mid:%d\n", mid);
if(a[mid] == key)
{
ret = mid;
break;
}
else if(a[mid] < key)
low = mid+1;
else if(a[mid] > key)
high = mid-1;
}
return ret;
}
2.插值查找
核心:mid = low + f(key)*(high - low)
f(x) = (x - a[low])/(a[high] - a[low])
例如:
int interpolation_search(int a[], int low, int high, int key)
{
int ret = -1;
while( (low <= high) && (a[low] <= key) && (key <= a[high]) )
{
float fx = 1.0f * (key - a[low]) / (a[high] - a[low]);
int mid = low + fx * (high - low);
if( a[mid] == key )
{
ret = mid;
break;
}
else if( key < a[mid] )
{
high = mid - 1;
}
else if( key > a[mid] )
{
low = mid + 1;
}
}
return ret;
}
- 查找算法(静态查找)
- 查找算法 二分查找
- 查找算法:二分查找
- 查找算法 - 二分法查找
- 算法--查找--二分查找
- 算法--查找--差值查找
- 查找算法:二分法查找
- 查找算法---二分查找
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法:
- v-model组件理解
- bzoj 1217: [HNOI2003]消防局的设立
- ORM的概念, ORM到底是什么
- python--leetcode442. Find All Duplicates in an Array
- 蚂蚁问题变形
- 查找算法
- 1066. 图像过滤(15)
- 最小生成树prim模板
- HDU 1171 Big Event in HDU (多重背包,可转换为01背包)+对于背包的一点认识
- Online Judge 榜单清空操作
- TCP协议怎样进行流量控制,并且怎么保证传输的可靠性
- 关于区块链的一点概述
- Spring 框架的七个模块
- centos 6.8 + pgsql 9.6 + mysql_fdw