查找算法
来源:互联网 发布:python 相似度 编辑:程序博客网 时间:2024/05/29 10:43
(0)测试代码:
int arr[] = {0, 2, 4, 6, 8, 10, 12, 14};int idx[] ={Search(arr, 8, -15), //-1Search(arr, 8, 0), //0Search(arr, 8, 5), //-1Search(arr, 8, 6), //3Search(arr, 8, 14), //7Search(arr, 8, 15), //-1};
(1)顺序查找:最原始最通用
template<typename TYPE>int SequentialSearch(TYPE arr[], int num, TYPE key){int found = -1, idx;for (idx = 0; idx < num; ++idx){if (arr[idx] == key){found = idx;break;}}return found;}
(2)二分查找(折半查找):
据说,只有10%的程序员能完全正确地实现二分查找算法!
优点是,比较次数少,查找速度快;缺点是,要求待查表为有序表,导致插入和删除困难。
适用于,不经常变动,但经常查找的有序表。算法复杂度为 log2(n)
template<typename TYPE>int BinarySearch(TYPE arr[], int num, TYPE key) //假设已为升序{if (num <= 0) return -1;int found = -1;int low = 0, high = num - 1, idx;while (low <= high) //注意此处:等于也可,否则两端元素找不到{idx = (low + high) / 2;if (arr[idx] == key) //找到{found = idx;break;}else if (arr[idx] > key) //当前值偏大{high = idx - 1;}else //arr[idx] < key //当前值偏小{low = idx + 1;}}return found;}
(3)二叉树查找:
NODE *BinarySortTreeSearch(NODE *node, int key){NODE *found = NULL;while (node){if (node->key == key){found = node;break;}else if (node->key < key){node = node->right;}else //node->key > key{node = node->left;}}return found;}
(4)分块查找(索引查找):
是顺序查找的改进。不常用,知道流程即可。
(a)将 arr[n] 划分为 m 块(m <= n),每块内结点不必有序,但块与块间必须有序(前块中任意元素必须小于后块中任意元素);
(b)选取各块中首结点索引、块内最大关键字,构成一个索引表;
(c)二分查找,确定待查记录在哪一块中;
(d)在该块中顺序查找指定的元素。
(5)哈希表查找:
使用一个下标范围比较大的数组来存储元素。
设计一个哈希函数(散列函数),使得 hash(key) = idx,该函数的设计是关键。
哈希冲突是指不同的 key 却生成了相同的 hash(key),导致多个元素要存储在同一位置。
(a)除余法(最常用):选择一个适当较大的正整素数p, h(k) = k % p
(b)数字选择法:选择关键字中数字分布比较均匀的若干位,所组成的新值作为哈希值。
哈希查找虽然看上去有些离谱,但它非常实用,压缩程序、磁盘高速缓存程序都使用它。
- 查找算法(静态查找)
- 查找算法 二分查找
- 查找算法:二分查找
- 查找算法 - 二分法查找
- 算法--查找--二分查找
- 算法--查找--差值查找
- 查找算法:二分法查找
- 查找算法---二分查找
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法
- 查找算法:
- iQQ 学习笔记2 :借助新浪微博输入验证码、远程控制退出
- ubuntu 12 忘记密码重设
- 文件操作之标准I/O函数库
- JS操作select下拉框动态变动
- 数据结构:链表操作之反转链表
- 查找算法
- 迄今见过的最好的职业规划文章
- Ubuntu 下搭建 Android 开发环境
- CMUX协议理解
- oracle 练习3
- gallery图片展示(图片间隔)
- 子类化QWidget IconEditor实现
- ubuntu环境下android开发连接手机
- devcpp5.0设置gtk+开发环境