本文主要是介绍查找算法系列之简单查找:顺序查找、二分查找、分块查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法。
废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(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;elseif(x[mid] < keyword)low = mid + 1;elsehigh = 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;
}
完整代码下载点击:
查找算法代码C++——包括顺序、二分、BST、哈希
http://download.csdn.net/detail/u010025211/8841123这篇关于查找算法系列之简单查找:顺序查找、二分查找、分块查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!