数据结构笔记整理第8章:查找
2016-06-07 22:20
302 查看
第8章 查找
本章内容
本章主要介绍多种查找的算法,包括它们的查找过程、查找复杂度以及实现等等,本章在考研中仍然是重点内容。8.1 查找的分类
8.2 平均查找长度ASL
查找算法的基本操作是比较,通常把查找过程中对关键字的平均比较次数(平均查找长度)作为衡量一个查找算法的优劣标准,平均查找长度为ASL:Pi代表查找第i个元素成功的概率,Ci代表找到第i个元素所需的比较次数。
8.3 顺序查找
思路:按顺序逐个比较,直到找到或者找不到为止。代码:
int Search(int a[], int n, int x) { for (int i = n-1; i >=0; i--) { if (a[i] == x) { return i; } } return -1; }
分析:
查找成功的ASL:(n+1)/2
时间复杂度:O(n)
8.4 折半查找
思路:待查找的表必须是有序的,先从中间开始比较,比较一次至少抛弃一半的元素,逐渐缩小范围,直到查找成功或者失败。代码:
int BinarySearch(int a[], int n, int x) { int low = 0, high = n-1; int mid; while(low <= high) { mid = (low + high) / 2; if (a[mid] == x) { return mid; } else if (x < a[mid]) { high = mid - 1; } else { low = mid + 1; } } return -1; }
分析:
速度很快,要求查找表是有序的,而且随机访问。
查找成功的ASL:logn
时间复杂度:O(logn)
二叉树:描述折半查找的判定树。对一个有序表所建立的折半查找判定树的树形与原始序列的关键字值无关,只与原始序列中关键字的个数有关,即:关键字个数相同的有序表可以产生同形的判定树。
8.5 索引顺序表
分块:块间有序+块内无序,对应索引表有序+顺序表无序。第一步采用二分查找确定待查元素属于哪一块,第二步采用顺序查找具体的块内位置。
分块的最佳长度:假设表长为n,等分成b块,则b = n^(1/2)
8.6 二叉排序树与平衡二叉树
思路:二叉排序树:若二叉树为空,则找不到;先与根比较,相等则找到,否则若小于根则在左子树上继续查找,否则在右子树上继续查找。代码:
BTNode BstSearch(BTNode bst, int x) { if (bst == null) { return null; } else if (bst->data == x) { return bst; } else if (x < bst->data) { return BstSearch(bst->lchild, x); } else { return BstSearch(bst->rchild, x); } }
分析:
二叉排序树:
查找成功的ASL:(n+1)/2
时间复杂度:O(n)
平衡二叉树:
时间复杂度:O(logn)
8.7 散列表
思路:根据设定的哈希函数和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集上,并以关键字在地址集中的象作为记录在表中的存储位置。**哈希函数:**H,关键字key,H(key)为地址。哈希函数经常使用除留余数法:H(key) = key mod p
冲突:当:H(key1) = H(key2),且key1≠key2的时候,称为发生了冲突。
处理冲突的方法:
1.开放定址法:H(key)⊕di即:Hi(k) = (H(k)+i) mod m (1 <= i <= m-1)
(1)线性探查法:H(key)⊕1,H(key)⊕2……易产生堆积问题。
(2)平方探查法:H(key)⊕(1^2),H(key)⊕-(1)^2,H(key)⊕(2^2),H(key)⊕-(2^2)……不能探查哈希表所有单元。
(3)伪随机探查法:H(key)⊕f(1),H(key)⊕f(2)……
2.再哈希法:H1(key)冲突,尝试H2(key),H3(key)……
3.链地址法:发生冲突的记录链成单链表。
4.建立公共溢出区:所有冲突记录存入溢出区。
装填因子:α=n/m,n个记录,m个地址空间。哈希表的平均查找长度与记录个数n不直接相关,而是取决于装填因子和处理冲突的方法。装填因子就是关键字个数与表长度的比值。
【例子1】:已知一组关键字{19,14,23,1,68,20,85,9},采用哈希函数H(key) = key mod 11,请分别采用以下处理冲突的方法构造哈希表,并计算各自的平均查找长度。
(1)采用线性探查法;
(2)采用伪随机探查法,伪随机函数f(n) = -n;
(3)采用链地址法。
参考资料
1.严蔚敏《数据结构与算法分析》:清华大学出版社,2011相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#数据结构之顺序表(SeqList)实例详解
- Redis中实现查找某个值的范围
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 批量文件查找替换功能的vbs脚本
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- WinForm实现按名称递归查找控件的方法
- C#数据结构之单链表(LinkList)实例详解
- 一个用vbs查找硬盘所有分区中的指定程序的代码
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析