查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法。

废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等。

顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等。

1.顺序查找

关键字与数组中的数顺序比较,时间复杂度O(n).

template<class T>
int OrderSearch(T *x, int N, T keyWord)
{
	for(int i = 0; i < N; i++)
	{
		if(x[i] == keyWord)
			return i;
	}
	return -1;
}

2.二分查找

二分查找的条件是原数组有序,在查找时,将关键字与数组中间的数比较,若等于则找到,若大于则在其右边寻找,若小于则在其左边寻找,然后递归的进行二分查找。

时间复杂度O(logn)。

若有较频繁的插入操作,对于维护二分查找需要的有序结构,需要付出一定的时间代价。

template<class T>
int binarySearch(T *x, int low, int high, T keyword)//递归
{
	if(low > high)
		return -1;
	int mid = (low + high)/2;
	if(x[mid] == keyword)
		return mid;
	if(x[mid] < keyword)
		return binarySearch(x, mid+1, high);
	if(x[mid] > keyword)
		return binarySearch(x, low, mid-1);
}
template<class T>
int binarySearch(T *x, int N, T keyword)//无递归
{
	int low = 0, high = N-1,mid;
	while(low <= high)
	{
		mid = (low + high)/2;
		if(x[mid] == keyword)
			return mid;
		else
			if(x[mid] < keyword)
				low = mid + 1;
			else
				high = mid -1;

	}
	return -1;
}

3.分块查找

分块查找是顺序查找的一种改进方法。首先需要对数组进行分块,分块查找需要建立一个“索引表”。索引表分为m块,每块含有N/m个元素,块内是无序的,块间是有序的,例如块2中最大元素小于块3中最小元素。

先用二分查找索引表,确定需要查找的关键字在哪一块,然后再在相应的块内用顺序查找。分块查找又称为索引顺序查找。

时间复杂度:O(log(m)+N/m)

//分块查找
template<class T>//索引表
struct INDEXTable
{
	T key;
	int link;
};

template<class T>  IndexOrderSearch(INDEXTable<T> *indexTable,T *x, int N, int m, T keyword)// indexTable为索引表,x为原数组,N为数组大小,m为块大小
{
	int L = (N+m-1)/m;
	int i = 0;
	while(i < L && indexTable[i].key < keyword)
		i++;
	if(i == L)
		return -1;
	else
	{
		int j = indexTable[i].link;
		for(j; j<indexTable[i].link + m;j++)
			if(x[j] == keyword)
				return j;
	}
	return -1;
}
时间: 2024-11-05 12:36:11

查找算法系列之简单查找:顺序查找、二分查找、分块查找的相关文章

算法系列15天速成——第四天 五大经典查找【上】

原文:算法系列15天速成--第四天 五大经典查找[上] 在我们的生活中,无处不存在着查找,比如找一下班里哪个mm最pl,猜一猜mm的芳龄....... 对的这些都是查找. 在我们的算法中,有一种叫做线性查找. 分为:顺序查找. 折半查找. 查找有两种形态: 分为:破坏性查找,   比如有一群mm,我猜她们的年龄,第一位猜到了是23+,此时这位mm已经从我脑海里面的mmlist中remove掉了. 哥不找23+的,所以此种查找破坏了原来的结构. 非破坏性查找, 这种就反之了,不破坏结构. 顺序查找

算法系列15天速成——第五天 五大经典查找【中】

原文:算法系列15天速成--第五天 五大经典查找[中] 大家可否知道,其实查找中有一种O(1)的查找,即所谓的秒杀. 哈希查找: 对的,他就是哈希查找,说到哈希,大家肯定要提到哈希函数,呵呵,这东西已经在我们脑子里面形成 固有思维了.大家一定要知道“哈希“中的对应关系. 比如说: ”5“是一个要保存的数,然后我丢给哈希函数,哈希函数给我返回一个”2",那么此时的”5“ 和“2”就建立一种对应关系,这种关系就是所谓的“哈希关系”,在实际应用中也就形成了”2“是key,”5“是value. 那么有的

9.算法之顺序、二分、hash查找

9.算法之顺序.二分.hash查找 一.查找/搜索 - 我们现在把注意力转向计算中经常出现的一些问题,即搜索或查找的问题.搜索是在元素集合中查找特定元素的算法过程.搜索通常对于元素是否存在返回 True 或 False.有时它可能返回元素被找到的地方.我们在这里将仅关注成员是否存在这个问题. - 在 Python 中,有一个非常简单的方法来询问一个元素是否在一个元素列表中.我们使用 in 运算符. >>> 15 in [3,5,2,4,1] False >>> 3 in

查找算法系列之复杂算法:哈希查找

眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/details/46635325 http://blog.csdn.net/u010025211/article/details/46635183 今天这篇博文将介绍哈希查找. 1.为什么要用哈希查找 之前所讲的查找方法都是须要比較待查找元素与线性表或者树中的元素才干实现. 这种时间复杂度为O(n)或者O(log n),那么有没有可能当给

查找算法系列之复杂算法:二叉排序树BST

前面总结了顺序查找,二分查找,分块查找算法,此篇博文将详解介绍二叉排序算法(Binary Sort Tree). 在介绍二叉排序算法之前,首先介绍什么事二叉排序树(BST). 首先从二叉树讲起: 1.二叉树的概念 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(leftsubtree)和"右子树"(rightsubtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有

查找一,基于ST的顺序与二分 总结关键字

顺序: for(Node x = first: x !=null,x=x.next){ if(key.equals(x.key)) { return x.val;(x.val = val;) } } 二分: (基于有序数组) 迭代 rank int mid ; int cmp; while(lo>=hi){ mid = lo+(hi-lo)/2; cmp =  key.compareTo(keys[mid]); if(cmp <0)  hi=mid-1; else if (cmp>0)

查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找. 查找算法通常需要两个输入: 1.被查找的序列 2.要查找的关键词 查找算法的输出参数和返回值: 1.返回类型为 Error_co

大话数据结构 - 查找算法总结

1. 顺序表查找(Sequential Search) 1> 算法思想:顺序表查找应该是查找算法中最简单的了.顺序表中所有的记录都是无序的,因此在查找时,没有对查找对象范围的可能线索,唯一的方法就是沿着一个方向一直比较,直到和查找对象相等.完成查找的过程.这里一个优化点是设置一个哨兵,放在顺序表的开始或者结束,每次在搜索顺序表的时候就不必考虑索引是否越界,减少了比较的过程,性能得到提高. 2> 时间复杂度:最好的情况是第一次比较就找到了,时间复杂度是O(1),最坏情况是到最后一个记录才找到,或

[Data Structure &amp; Algorithm] 七大查找算法

查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找都可以归为一类——插值查找.插值查找和斐波那契查找是在二分查找的基础上的优化查找算法.树表查找和哈希查找会在后续的博文中进行详细介绍. 查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找算法分类: 1)静态查找和动态查找: 注:静态或者动态都是针对查找表而言