数据结构与STL_第7章_查找_第1页
数据结构与STL_第7章_查找_第2页
数据结构与STL_第7章_查找_第3页
数据结构与STL_第7章_查找_第4页
数据结构与STL_第7章_查找_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章第七章 查找查找北京邮电大学北京邮电大学信息与通信工程学院信息与通信工程学院数据结构与数据结构与STL第七章第七章 查找查找学习内容:学习内容:1. 概述概述 2. 线性表的查找技术线性表的查找技术 3. 树表的查找技术树表的查找技术 4. 散列表的查找技术散列表的查找技术5. 查找的应用查找的应用6. STL中的相关模版类中的相关模版类2数据结构与STL1. 概述概述2021-12-201.概述概述基本概念基本概念关键码关键码 用以标识一个记录的某个数据项。如果该关键码可以唯一的标识一条记录,称为主关键码;反之为次关键码。 2021-12-203数据结构与STL1.概述概述查找查找 在

2、具有相同类型的记录集中找出满足给定条件在具有相同类型的记录集中找出满足给定条件的记录。的记录。查找结果查找结果 在查找集中找到匹配的记录,称为查找成功;在查找集中找到匹配的记录,称为查找成功;否则,称为查找不成功。一般情况下,查找需要否则,称为查找不成功。一般情况下,查找需要返回记录的位置。返回记录的位置。2021-12-204数据结构与STL1.概述概述静态查找静态查找 不涉及插入和删除操作的查找不涉及插入和删除操作的查找动态查找动态查找 有时在查询之后,还需要将有时在查询之后,还需要将“查询查询”结果为结果为“不在查找表中不在查找表中”的数据元素插入到查找表中;的数据元素插入到查找表中;或

3、者,从查找表中删除其或者,从查找表中删除其“查询查询”结果为结果为“在查在查找表中找表中”的数据元素。的数据元素。2021-12-205数据结构与STL1.概述概述查找结构查找结构 为了提高查找效率,专门为查找操作设置的数据为了提高查找效率,专门为查找操作设置的数据结构。结构。2021-12-206数据结构与STL1.概述概述本章讨论的查找结构本章讨论的查找结构 : 线性表:适用于静态查找,主要采用顺序查线性表:适用于静态查找,主要采用顺序查找技术,折半查找技术。找技术,折半查找技术。 树表:适用于动态查找,主要采用二叉排序树表:适用于动态查找,主要采用二叉排序树的查找技术。树的查找技术。 散

4、列表:静态查找和动态查找均适用,主要散列表:静态查找和动态查找均适用,主要采用散列技术。采用散列技术。2021-12-207数据结构与STL2 查找算法的性能查找算法的性能如何评价一个查找算法的优劣?如何评价一个查找算法的优劣? 查找算法中最基本的操作是:关键码和给定值查找算法中最基本的操作是:关键码和给定值的比较。的比较。 比较次数越少则算法的性能越好。比较次数越少则算法的性能越好。 使用使用ASL平均查找长度,来评价一个算法。平均查找长度,来评价一个算法。2021-12-208数据结构与STL2 查找算法的性能查找算法的性能niiiCPASL12021-12-209 其中其中: n 为表长

5、,为表长, Pi 为查找表中第为查找表中第i个记录的概率个记录的概率 Ci 为找到该记录时,曾和给定值比为找到该记录时,曾和给定值比较过的关键字的个数较过的关键字的个数数据结构与STL第七章第七章 查找查找学习内容:学习内容:1. 概述概述 2. 线性表的查找技术线性表的查找技术 3. 树表的查找技术树表的查找技术 4. 散列表的查找技术散列表的查找技术5. 查找的应用查找的应用6. STL中的相关模版类中的相关模版类10数据结构与STL2. 线性表的查找技术线性表的查找技术顺序查找顺序查找题目:题目:已知有已知有n个整数的序列,查找指定数值个整数的序列,查找指定数值key是否在是否在该序列中

6、,如果存在,找出该数值在序列中的位该序列中,如果存在,找出该数值在序列中的位置。置。2021-12-2011数据结构与STL算法实现算法实现int search(int a, int n, int key) for (int i=0; in; i+) if(ai=key)return i+1; return 0;2021-12-2012如何优化?如何优化?1. 1. 分析程序耗时的地方分析程序耗时的地方数据结构与STL分析程序耗时的关键点分析程序耗时的关键点int search(int a, int n, int key) for (int i=0; inext; j+;p = first-n

7、ext; j=1;p数据结构与STL顺序查找(单链表)顺序查找(单链表)template int SeqSearch(LinkList A, T key) Node *p=A.first-next; int j=1; while (p!=NULL & p-data!=key) p= p-next; j+; if (p=NULL) return 0; else return j;2021-12-2020数据结构与STL2. 折半查找算法折半查找算法查找查找有序表有序表使用折半查找使用折半查找基本思想:基本思想:先确定待查记录所在的范围(区间),然先确定待查记录所在的范围(区间),然后逐步

8、缩小范围直到找到或找不到该记录为后逐步缩小范围直到找到或找不到该记录为止。止。2021-12-2021数据结构与STL2. 折半查找算法折半查找算法例如例如: key = 64 的查找过程如下的查找过程如下2021-12-202205 13 19 21 37 56 64 75 80 88 92 0 1 2 3 4 5 6 7 8 9 10 11 anlowhighmidlow mid high midlow 指示查找区间的下界;high 指示查找区间的上界;mid = (low+high)/2数据结构与STL2. 折半查找算法折半查找算法int Search_Bin(int a, int n,

9、 int key) int low=1; int high=n; while(low=high) mid = (low+high)/2; if(key=amid) return mid; else if (key50 时,可得近似结果时,可得近似结果1) 1(log2nASLbs假设假设 n=2h-1 并且查找概率相等并且查找概率相等, 则则数据结构与STL性能分析:性能分析:1. 查找不成功查找不成功 假设假设 n=2h-1 并且查找概率相等并且查找概率相等, 则则 ASL = h = log2( n+1)2021-12-2026数据结构与STL2 折半查找折半查找int BinSearch

10、 (int r, int low, int high, int k) if(lowhigh) int mid = (low+high)/2; if(rmin=k) return mid; else if(rmink) return BinSearch(r, low, mid-1,k); else return BinSearch(r, mid+1, high,k); 2021-12-2027数据结构与STL3.分块查找分块查找分块查找又称索引查找,它是一种性能介于顺序分块查找又称索引查找,它是一种性能介于顺序查找和折半查找之间的查找方法。它要求在建立查找和折半查找之间的查找方法。它要求在建立顺

11、序表的同时,建立一个索引表。顺序表的同时,建立一个索引表。2021-12-202817 08 21 19 14 31 33 22 25 40 52 61 78 4621 040 578 10012345678910 11 12 13基本表基本表索引表索引表数据结构与STL3.分块查找分块查找分块查找按照索引表分块有序,即前一个子表分块查找按照索引表分块有序,即前一个子表内的所有关键字均小于后一个子表内的关键字。内的所有关键字均小于后一个子表内的关键字。基本思想基本思想首先根据索引表确定待查记录的区间首先根据索引表确定待查记录的区间;然后在确定的主表区间内采用顺序查找然后在确定的主表区间内采用顺

12、序查找或折半查或折半查找找。2021-12-2029数据结构与STL3.分块查找分块查找性能分析性能分析 一般情况下,将长度为n的主表分成b块,每块含有s条记录,即bn/s;假设查找概率相等,则每块查找的概率为1/b,块中每条记录查找的概率为1/s。索引表采用顺序查找索引表采用顺序查找索引采用折半查找索引采用折半查找 ASL=log2(b+1)-1+(s+1)/2=log2(b+1)+(s-1)/22021-12-2030数据结构与STL3.分块查找分块查找优点优点插入或删除比较容易插入或删除比较容易缺点缺点辅助数组辅助数组初始表分块排序初始表分块排序2021-12-2031数据结构与STL第

13、七章第七章 查找查找学习内容:学习内容:1. 概述概述 2. 线性表的查找技术线性表的查找技术 3. 树表的查找技术树表的查找技术 4. 散列表的查找技术散列表的查找技术5. 查找的应用查找的应用6. STL中的相关模版类中的相关模版类32数据结构与STL3. 树表的查找技术树表的查找技术树表的查找技术树表的查找技术主要内容主要内容二叉排序树二叉排序树平衡二叉树平衡二叉树*2021-12-2033二叉排序树二叉排序树主要内容主要内容 1二叉排序树的定义二叉排序树的定义 2二叉排序树的建立二叉排序树的建立 3二叉排序树的查找二叉排序树的查找 4二叉排序树的删除二叉排序树的删除2021-12-20

14、34数据结构与STL1二叉排序树的定义二叉排序树的定义定义定义 二叉排序树或者是一棵空树;或者是具有如二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:下特性的二叉树: 1. 若它的左子树不空,则左子树上所有结点的若它的左子树不空,则左子树上所有结点的值均小于根结点的值;值均小于根结点的值; 2. 若它的右子树不空,则右子树上所有结点的若它的右子树不空,则右子树上所有结点的值均大于根结点的值;值均大于根结点的值; 3. 它的左它的左. 右子树也都分别是二叉排序树。右子树也都分别是二叉排序树。2021-12-2035数据结构与STL二叉排序树二叉排序树2021-12-203650308020

15、901085403525238866是二叉排序树是二叉排序树不不数据结构与STL例:例: 63, 90, 70, 55, 67, 42, 982021-12-203763906370906355709063675570906342675570906398426755709063数据结构与STL2二叉排序树的建立二叉排序树的建立通常,可取二叉链表作为二叉排序树的存储结构通常,可取二叉链表作为二叉排序树的存储结构template class Nodepublic: T data;Node *lch;Node *rch;Node():lch(NULL),rch(NULL) ;2021-12-2038

16、数据结构与STL2二叉排序树的插入二叉排序树的插入2021-12-2039PKey = 48RRPRKey = 22RPRPRPRPR30201040352523数据结构与STL2二叉排序树的插入二叉排序树的插入如何构造一棵二叉排序树?如何构造一棵二叉排序树? 若当前结点若当前结点=NULL,则直接插入;否则将给定则直接插入;否则将给定值与当前结点进行比较值与当前结点进行比较 若若当前结点,与其左孩子比较当前结点,与其左孩子比较 否则,与其右孩子比较否则,与其右孩子比较 反复执行,直到插入。反复执行,直到插入。2021-12-2040数据结构与STL2二叉排序树的插入二叉排序树的插入void

17、InsertBST(BiNode *&r, BiNode*s) if ( r = NULL) r = s; else if (s-datadata ) InsertBST(r-lchild, s); else InsertBST(r-rchild, s);2021-12-2041数据结构与STL2二叉排序树的建立二叉排序树的建立void Create(BiNode *&R, int r, int n) for (int i=0; in; i+) BiNode * s=new BiNode ; s-data=ri; s-lch=s-rch=NULL; InsertBST(R, s

18、); 2021-12-2042数据结构与STL3二叉排序树的查找二叉排序树的查找template Node* Search(Node *R,T key) if(R=NULL) return NULL; if(key =R-data) return R; else if (keydata) return Search(R-lch,key); else return Search(R-rch,key);2021-12-2043数据结构与STL4二叉排序树的删除二叉排序树的删除 和插入相反,删除在查找成功之后进行,并且要求和插入相反,删除在查找成功之后进行,并且要求在删除二叉排序树上某个结点之后,仍

19、然保持二叉在删除二叉排序树上某个结点之后,仍然保持二叉排序树的特性。排序树的特性。可分三种情况讨论:可分三种情况讨论: a. 被删除的结点是叶子; b. 被删除的结点只有左子树或者只有右子树; c. 被删除的结点既有左子树,也有右子树。2021-12-2044数据结构与STLa. 被删除的结点是叶子被删除的结点是叶子2021-12-204550308020908540358832被删关键字被删关键字 = 20 88数据结构与STLb. 被删除的结点只有左子树或右子树被删除的结点只有左子树或右子树2021-12-204650308020908540358832被删关键字被删关键字 = 40 80

20、数据结构与STLc.被删除的结点有左子树,也有右子树被删除的结点有左子树,也有右子树算法分析:算法分析: 1. 中序遍历得到被删除结点中序遍历得到被删除结点p的前驱结点的前驱结点q是是p的的左子树的最右下结点,则左子树的最右下结点,则q必为单分支结点,或叶必为单分支结点,或叶结点结点(其右指针为空其右指针为空) 2. 将将q的值赋给的值赋给p的值域,的值域, 3. 将删除将删除p的操作转换为删除的操作转换为删除q的操作的操作2021-12-2047数据结构与STLc.被删除的结点有左子树,也有右子树被删除的结点有左子树,也有右子树2021-12-204850308020908540358832

21、4040被删结点前驱结点被删关键字被删关键字 = 50数据结构与STL例子:删除例子:删除202021-12-2049503080209010854035252388数据结构与STL5二叉排序树的删除二叉排序树的删除template void Delete(Node *&R)Node *q,*s; if(R-lch=NULL) q=R; R=R-rch; delete q; else if (R-rch=NULL) q=R; R=R-lch; delete q;else /s是是R的前驱,的前驱, q是是s的双亲的双亲q = R; s = R-lch;while(s-rch!=NULL

22、) q = s; s = s-rch;R-data = s-data;if(q!=R) q-rch=s-lch;else R-lch=s-lch; /q=R表示表示s为为R的左孩子的左孩子delete q;2021-12-2050数据结构与STL5二叉排序树的删除二叉排序树的删除template bool DeleteBST(Node *&R,T key)if(R=NULL) return false;elseif(key = R-data) Delete(R);else if (keydata) DeleteBST(R-lch,key);else DeleteBST(R-rch,ke

23、y);return true;2021-12-2051数据结构与STL二叉排序树性能分析二叉排序树性能分析 对于每一棵特定的二叉排序树,均可按对于每一棵特定的二叉排序树,均可按照平均查找长度的定义来求它的照平均查找长度的定义来求它的 ASL 值,显值,显然,由值相同的然,由值相同的 n 个关键字,构造所得的不个关键字,构造所得的不同形态的各棵二叉排序树的平均查找长同形态的各棵二叉排序树的平均查找长 度的度的值不同,甚至可能差别很大。值不同,甚至可能差别很大。 2021-12-2052数据结构与STL二叉排序树性能分析二叉排序树性能分析2021-12-205321345 由关键字序列 1,2,3

24、,4,535412由关键字序列 3,1,2,5,4ASL =(1+2+3+4+5)/ 5 = 3ASL =(1+2+3+2+3)/ 5 = 2.2数据结构与STL二叉排序树性能分析二叉排序树性能分析最坏的情况最坏的情况 排序二叉树退化成单支顺序查找排序二叉树退化成单支顺序查找ASL = (n+1)/2最优化情况最优化情况 排序二叉树近似为为折半查找的判定树排序二叉树近似为为折半查找的判定树ASL = log2(n+1)-12021-12-2054数据结构与STL第七章第七章 查找查找学习内容:学习内容:1. 概述概述 2. 线性表的查找技术线性表的查找技术 3. 树表的查找技术树表的查找技术

25、4. 散列表的查找技术散列表的查找技术5. 查找的应用查找的应用6. STL中的相关模版类中的相关模版类55数据结构与STL4. 散列表的查找技术散列表的查找技术2021-12-20散列的查找技术散列的查找技术主要内容主要内容 1什么是散列技术?什么是散列技术? 2散列函数的设计散列函数的设计2021-12-2056数据结构与STL1什么是散列技术?什么是散列技术?什么是查找?什么是查找?就是确定关键码就是确定关键码=给定值的记录在查找集合中的存给定值的记录在查找集合中的存储位置。储位置。由于存储位置与关键码之间不存在确定的对应关由于存储位置与关键码之间不存在确定的对应关系,因此,查找时必须通

26、过一系列与关键码的比系,因此,查找时必须通过一系列与关键码的比较。较。2021-12-2057 不通过比较直接定位不通过比较直接定位待查记录的存储位置?待查记录的存储位置?数据结构与STL1什么是散列技术?什么是散列技术?理想情况理想情况 在记录的存储位置和其关键码之间建立一个确在记录的存储位置和其关键码之间建立一个确定的对应关系定的对应关系H,使得每个关键码使得每个关键码key和唯一的一和唯一的一个存储位置个存储位置H(key)对应。对应。 key 关键码关键码 H(key) 存储位置存储位置 这就是散列技术,采用散列技术将记录存储在这就是散列技术,采用散列技术将记录存储在一块连续的存储空间

27、中,就是散列表。一块连续的存储空间中,就是散列表。2021-12-2058数据结构与STL1什么是散列技术?什么是散列技术?散列过程散列过程 1)存储记录)存储记录通过通过H(key)计算记录的散列地址,并按此地址存计算记录的散列地址,并按此地址存储记录储记录 2)查找记录)查找记录通过同样的通过同样的H(key)计算记录的散列地址,按此地计算记录的散列地址,按此地址访问该记录。址访问该记录。 散列不能表达记录之间的逻辑关系,所以是散列不能表达记录之间的逻辑关系,所以是不完整的存储结构,主要面向查找的存储结构不完整的存储结构,主要面向查找的存储结构2021-12-2059数据结构与STL1什么

28、是散列技术?什么是散列技术?散列的查找技术散列的查找技术 1.散列函数的设计散列函数的设计 理想情况:理想情况: key 关键码关键码 H(key) 存储位置存储位置 实际情况:实际情况: key1 != key2 但但 H(key1) = H(key2) 2.冲突处理冲突处理2021-12-2060数据结构与STL2. 散列函数的设计散列函数的设计常用的五种方法:常用的五种方法:1) 直接定址法直接定址法2) 除留余数法除留余数法3) 数字分析法数字分析法4) 平方取中法平方取中法5) 折叠法折叠法2021-12-2061数据结构与STL1) 直接定址法直接定址法哈希函数:哈希函数:h(ke

29、y) = a*key + b特点:特点: 计算简单,没有冲突;适合于关键码分布比较连计算简单,没有冲突;适合于关键码分布比较连续的情况;否则空间浪费较多。续的情况;否则空间浪费较多。2021-12-2062数据结构与STL2) 除留余数法除留余数法散列函数:散列函数:h(key) = key % p (pm)m为散列表的长度,为散列表的长度,p最好为素数或不包含小于最好为素数或不包含小于20的质因数的合数。的质因数的合数。特点:特点: 计算简单,使用范围广计算简单,使用范围广。2021-12-2063数据结构与STL2) 除留余数法除留余数法关键码关键码 25, 18, 23, 4, 57,

30、89, 19, 37, 60选择选择P值值 2021-12-2064p p2525181823233 35 57 78787191937376060111113131717131312125 510103 34 49 96 611118 817178 81 16 63 35 52 22 23 39 911113 37 71 13 31 110108 84 45 5哈希函数:哈希函数: h(key) = key % 13数据结构与STL3) 数字分析法数字分析法假设关键码集合中的每个关键码都是由假设关键码集合中的每个关键码都是由 s 位数字位数字组成组成 (u1, u2, , us),分析每位数

31、字的分布情况,分析每位数字的分布情况,从中提取分布均匀的若干位或它们的组合作为地从中提取分布均匀的若干位或它们的组合作为地址。址。特点特点适合于所有关键码已知,并对每一位的取值分布适合于所有关键码已知,并对每一位的取值分布有所分析。有所分析。2021-12-2065数据结构与STL4) 平方取中法平方取中法将关键码平方后,取中间几位作为存储地址。求将关键码平方后,取中间几位作为存储地址。求“关键字的平方值关键字的平方值” 的目的是的目的是“扩大差别扩大差别” ,同,同时平方值的中间各位又能受到整个关键字中各位时平方值的中间各位又能受到整个关键字中各位的影响。的影响。特点特点事先不知道关键码的分

32、布且关键码的位数不是很事先不知道关键码的分布且关键码的位数不是很大。大。2021-12-2066数据结构与STL5) 折叠法折叠法 将关键码从左到右分割成位数相等的若干部分,将关键码从左到右分割成位数相等的若干部分,然后取它们的叠加和为哈希地址。有两种叠加然后取它们的叠加和为哈希地址。有两种叠加处理的方法:处理的方法:移位叠加:将各部分的最后一位对齐相加移位叠加:将各部分的最后一位对齐相加间界叠加:从一端到另一端沿各部分分界来回折间界叠加:从一端到另一端沿各部分分界来回折叠后,最后一位对齐相加叠后,最后一位对齐相加特点特点适用于关键字的数字位数特别多。适用于关键字的数字位数特别多。2021-1

33、2-2067数据结构与STL例:例:设关键码设关键码 key= 25346358705,散列表表长为散列表表长为3位,则可对关键码进行三位一分割,将关键码位,则可对关键码进行三位一分割,将关键码分割如下分割如下 253 463 587 05 2021-12-2068 2 5 3 4 6 3 5 8 7+ 0 5 1 3 0 8移位叠加移位叠加 2 5 3 3 6 4 5 8 7 + 5 0 1 2 5 4间界叠加间界叠加数据结构与STL散列技术散列技术1.散列函数的设计散列函数的设计 理想情况:理想情况: key 关键码关键码 H(key) 存储位置存储位置 实际情况:实际情况: key1 !

34、= key2 但但 H(key1) = H(key2)2.冲突处理冲突处理2021-12-2069数据结构与STL2.处理冲突的方法处理冲突的方法“处理冲突处理冲突”的实际含义是:的实际含义是:为产生冲突的地址寻找下一个哈希地址为产生冲突的地址寻找下一个哈希地址三种方法三种方法1)开放定址法开放定址法2) 链地址法链地址法3) 建立公共溢出区建立公共溢出区2021-12-2070数据结构与STL1)开放定址法)开放定址法为产生冲突的地址为产生冲突的地址 H(key) ,按照某种规则产生按照某种规则产生另一个地址的方法:另一个地址的方法: 线性探测法线性探测法 平方探测法平方探测法 随机探测法随

35、机探测法2021-12-2071数据结构与STL1)开放定址法)开放定址法 线性探测法线性探测法 Hi = ( H(key) + di ) MOD m di = c i 最简单的情况最简单的情况 c=1 2021-12-2072数据结构与STL2021-12-2073例子例子25, 18, 23, 3, 56, 87, 19, 37, 59哈希函数哈希函数 h(key) = key % 11h(key) = key % 11p p2525181823233 35656878719193737595911113 37 71 13 31 110108 84 44 4地址地址0 01 12 23 3

36、4 45 56 67 78 89 91010线性探测线性探测25182335687193759哈希表哈希表:ASL = (5*1+3*2+3)/9 = 1.56数据结构与STL1)开放定址法)开放定址法 平方探测法平方探测法 Hi = ( H(key) + di ) MOD m di = 12, -12, 22, -22, ,2021-12-2074数据结构与STL2021-12-2075例子25, 18, 23, 3, 56, 87, 19, 37, 59哈希函数哈希函数 h(key) = key % 11h(key) = key % 11p p2525181823233 356568787

37、19193737595911113 37 71 13 31 110108 84 44 4地址地址0 01 12 23 34 45 56 67 78 89 91010平方探测平方探测25182335687193759哈希表哈希表:ASL2= (5*1+ 3*2+5)/9 = 1.78数据结构与STL1)开放定址法)开放定址法 随机探测法随机探测法 Hi = ( H(key) + di ) MOD m di 是一组伪随机数列是一组伪随机数列 或者或者 di=iH2(key) (又称双散列函数探测又称双散列函数探测)。比如:。比如:3. 1. 9. 2. 2021-12-2076数据结构与STL20

38、21-12-2077例子 25, 18, 23, 3, 56, 87, 19, 37, 59 哈希函数哈希函数 h(key) = key % 11h(key) = key % 11p p2525181823233 35656878719193737595911113 37 71 13 31 110108 84 44 4地址地址0 01 12 23 34 45 56 67 78 89 91010随机探测随机探测哈希表:哈希表:25182335687193759ASL3= (5*1+ 2*2+3+4)/9 =1.78数据结构与STL2) 拉链法拉链法基本思想基本思想 将所有散列地址相同的记录都存储

39、在一个单将所有散列地址相同的记录都存储在一个单链表中链表中称为同义词子表,散列表存储所有称为同义词子表,散列表存储所有同一词的头指针。同一词的头指针。2021-12-2078数据结构与STL2021-12-20796 65 54 43 32 21 10 056233738759251819p p2525181823233 3565687871919373759597 74 44 42 23 30 03 35 52 23 3ASL= (5*1+3*2+3)/9 =1.56数据结构与STL3) 公共溢出法公共溢出法基本思想基本思想散列表包含基本表和溢出表两个部分,将发生冲散列表包含基本表和溢出表两

40、个部分,将发生冲突的记录存储在溢出表中。突的记录存储在溢出表中。 查找方法查找方法通过通过H(key)函数计算散列地址,先与基本表中记函数计算散列地址,先与基本表中记录进行比较,若相等,则查找成功;否则,到溢录进行比较,若相等,则查找成功;否则,到溢出表顺序查找。出表顺序查找。2021-12-2080数据结构与STL散列查找的性能分析散列查找的性能分析性能分析性能分析散列技术中,处理冲突的方法不同,得到的散列散列技术中,处理冲突的方法不同,得到的散列表不同,散列表的查找性能也不同。表不同,散列表的查找性能也不同。决定性能的因素决定性能的因素比较次数取决于差生冲突的概率。产生的冲突越比较次数取决

41、于差生冲突的概率。产生的冲突越多,则查找效率越低。多,则查找效率越低。2021-12-2081数据结构与STL散列查找的性能分析散列查找的性能分析2021-12-2082哈希函数 h(key) = key % 11 ASL1 = (5*1+3*2+3)/9 = 1.56 ASL2= (5*1+ 3*2+5)/9 = 1.78p p2525181823233 35656878719193737595911113 37 71 13 31 110108 84 44 4地址地址0 01 12 23 34 45 56 67 78 89 91010线性探测线性探测平方探测平方探测2518233568719

42、375925182335687193759哈希表:数据结构与STL散列查找的性能分析散列查找的性能分析影响冲突的因素影响冲突的因素 1)散列函数是否均匀)散列函数是否均匀 2)处理冲突的方法)处理冲突的方法 3)散列函数的装填因子)散列函数的装填因子a a越大代表填入表中的记录越多,则产生冲越大代表填入表中的记录越多,则产生冲突的可能性就越大。突的可能性就越大。 2021-12-2083a=a=填入表中的记录个数填入表中的记录个数散列表的长度散列表的长度数据结构与STL开散列和闭散列开散列和闭散列开散列开散列采用链式方式存储同义词,不产生堆积现象。查采用链式方式存储同义词,不产生堆积现象。查找

43、找. 插入插入. 删除易于实现,但附加指针增加了存储删除易于实现,但附加指针增加了存储空间。空间。闭散列闭散列采用顺序方式,存储效率高,但容易产生堆积现采用顺序方式,存储效率高,但容易产生堆积现象。象。2021-12-2084数据结构与STL第七章第七章 查找查找学习内容:学习内容:1. 概述概述 2. 线性表的查找技术线性表的查找技术 3. 树表的查找技术树表的查找技术 4. 散列表的查找技术散列表的查找技术5. 查找的应用查找的应用6. STL中的相关模版类中的相关模版类85数据结构与STL5. 查找的应用查找的应用2021-12-205. 查找的应用查找的应用主要内容主要内容1. 文件查

44、找文件查找2. 中文中文分词技术中的词搜索算法分词技术中的词搜索算法2021-12-20861. 文件查找文件查找问题问题一个文件包含至多一个文件包含至多10,000,000条数据,每条数据条数据,每条数据都是一个都是一个7位的整数,每个整数至多出现一次,系位的整数,每个整数至多出现一次,系统只有统只有2MB的内存空间,和无限大的硬盘空间,的内存空间,和无限大的硬盘空间,如何利用利用散列表来实现存储和查找?如何利用利用散列表来实现存储和查找?2021-12-20871. 文件查找文件查找基本基本思想思想利用类似位图的方法来实现散列函数。利用类似位图的方法来实现散列函数。例如例如集合集合1,2,

45、3,5,8,13人存储方式可以是这样的人存储方式可以是这样的0 1 1 1 0 1 0 0, 1 0 0 0 0 1 0 0, 0 0 0 0 将将代表数字的代表数字的各个位各个位设置设置1,其他位全部设置,其他位全部设置0。 存储空间存储空间=10000000bit(10Mbit = 1.25MB2MB)当且仅当整数当且仅当整数i在该文件中存在,将第在该文件中存在,将第i位置位置1;否;否则置则置0。2021-12-20881. 文件查找文件查找初始化长度为初始化长度为N字符串,全部位置字符串,全部位置0,这里,这里 N=(最大整数值+1)/一个char所占用的bit数=10000000/8

46、=1250000读取文件中一条数据,把相读取文件中一条数据,把相应应bit置置1,再读下一条,再读下一条数据,直到文件结束数据,直到文件结束查找时只需按位检测查找时只需按位检测bit是否为是否为1,若待查数据对应,若待查数据对应bit为为1,则查找成功;否则查找失败;,则查找成功;否则查找失败;2021-12-20891. 文件查找文件查找模块化划分模块化划分1)构造一个空的散列表)构造一个空的散列表 unsigned char ch1250000 = 0;2)在散列表中插入一个元素)在散列表中插入一个元素 void insert_ele (unsigned char ch, int elem

47、entary);3)在散列表中查找一个元素)在散列表中查找一个元素 bool search_ele (unsigned char ch, int elementary)4)读取文件,并调用函数()读取文件,并调用函数(2生成散列表生成散列表5)读取用户输入,并调用函数()读取用户输入,并调用函数(3查找散列表查找散列表2021-12-20902. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法所谓中文分词,是指将一个汉字序列切分成一个所谓中文分词,是指将一个汉字序列切分成一个一个单独的词。一个单独的词。中文分词是自然语言处理、文本挖掘等研究领域中文分词是自然语言处理、文本挖掘等研究领域的

48、基础。的基础。2021-12-20912. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法基于字符串匹配的分词方法基于字符串匹配的分词方法它按照一定的策略将待分析的汉字串与一个它按照一定的策略将待分析的汉字串与一个“充充分大的分大的”中文词典中的词条进行匹配,若在词典中文词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个中找到某个字符串,则匹配成功(识别出一个词)。词)。扫描方向扫描方向:正向匹配:正向匹配 / 逆向匹配逆向匹配长度长度:最大(最长)匹配最大(最长)匹配 / 最小(最短)匹配最小(最短)匹配词性标注词性标注:单纯分词方法单纯分词方法 / 分词与标注相结

49、合的分词与标注相结合的一体化方法一体化方法2021-12-20922. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法问题问题判断一个汉字串是否词典中的词是必须的,如何判断一个汉字串是否词典中的词是必须的,如何快速实现其快速匹配?快速实现其快速匹配?2021-12-20932. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法基本思想基本思想散列技术进行查找效率是最高的散列技术进行查找效率是最高的,因此,如何将因此,如何将词典中的词放到一个散列表中是关键词典中的词放到一个散列表中是关键假定所有词典中的所有汉字都在假定所有词典中的所有汉字都在GB2312-80一级一级字库内,而一级字库

50、的汉字共有字库内,而一级字库的汉字共有3755个,其编码个,其编码具有一定的规则:具有一定的规则: 每个汉字占两个字节; 第一个字节(高字节)的值大于等于176; 第二个字节(低字节)的值大于等于161,但小于255。 因此每个汉字编码的二进制形式为“1xxxxxxx 1xxxxxxx”,每个字节的最高位为1。2021-12-20942. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法散列函数:散列函数:H(汉字编码汉字编码)=(汉字编码高字节汉字编码高字节-176)*94+(汉字编汉字编码低字节码低字节161)这样一级字库的汉字放到长度为这样一级字库的汉字放到长度为3755的散列表中的

51、散列表中刚好地址是唯一的,得到的散列地址从刚好地址是唯一的,得到的散列地址从0到到3754,既不会用冲突,也不会用空余。既不会用冲突,也不会用空余。“啊啊”: 编码0 xB0A1 H(“啊”)= ( 0 xB0 - 176 ) * 94 + (0 xA1 161 ) = 0; “座座”: 编码0 xD7F9 H(“座”)= ( 0 xD7 - 176 ) * 94 + (0 xF9 161 ) = 3754。2021-12-20952. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法每个词都有第一个汉字,因此可以将其作为散每个词都有第一个汉字,因此可以将其作为散列函数的关键字列函数的关键

52、字。以拉链法解决冲突。以拉链法解决冲突。2021-12-20962. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法缺点缺点散列表非常小,而每个链表相对较长,在查找链散列表非常小,而每个链表相对较长,在查找链表时只能顺序查找,因此查找速度较慢。表时只能顺序查找,因此查找速度较慢。改进改进散列表越长,关键字在表中的分布越均匀,则冲散列表越长,关键字在表中的分布越均匀,则冲突越少、匹配速度越快。突越少、匹配速度越快。一般的中文词典包含的中文词有一般的中文词典包含的中文词有20万到万到60万不等,万不等,以以60万为例,并设装填因子为万为例,并设装填因子为0.6,则散列表长度,则散列表长度设计

53、为设计为100万。万。2021-12-20972. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法空间复杂度空间复杂度采用拉链法建立散列表采用拉链法建立散列表结点:汉字个数、所有汉字、下一个同义词结点结点:汉字个数、所有汉字、下一个同义词结点地址。地址。地址占地址占4个字节;汉字个数域占个字节;汉字个数域占1个字节个字节;假设每假设每个词平均有个词平均有3个汉字,个汉字,共共6个字节。个字节。整个散列表总共的存储空间:整个散列表总共的存储空间:10000004 + 6000001110.1MByte2021-12-20982. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法存放存放

54、方法方法散散列表长度为列表长度为1M,可用,可用20个比特表示每个地址个比特表示每个地址。对于对于二字词,共有二字词,共有4个字节,考虑到每个字节的最个字节,考虑到每个字节的最高比特均为高比特均为1,实际大小实际大小4x8-4=28bit抽取抽取20个比特作为散列地址个比特作为散列地址。对于对于三字词或更高字词三字词或更高字词,仍然,仍然只需抽取只需抽取20个比特。个比特。2021-12-20992. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法抽取方法示例抽取方法示例对于含有对于含有n个汉字的词,共有个汉字的词,共有2n个字节个字节去掉每个字节的最高位,共有去掉每个字节的最高位,共有

55、14n个比特个比特每每20个分为一组。若不足个分为一组。若不足20,在后面补,在后面补“0”,构,构成成20比特。比特。各组进行异或运算,最后得到的运算结果作为散各组进行异或运算,最后得到的运算结果作为散列地址。列地址。例如对于四字词,共有例如对于四字词,共有56个比特,可分为个比特,可分为3组进行组进行异或运算,异或运算,2021-12-20100抽取方法示例抽取方法示例2021-12-201012. 中文分词技术中的词搜索算法中文分词技术中的词搜索算法性能性能该方法对该方法对31万个中文词构造长度为万个中文词构造长度为1M的散列表,的散列表,产生了大约产生了大约26万个不同的散列地址万个不

56、同的散列地址,即,即5万个词在万个词在构造散列地址时产生冲突构造散列地址时产生冲突最长的链表最长的链表为为7个词个词,即,即最坏情况比较最坏情况比较7次次平均比较次数仅为平均比较次数仅为1.21次。次。2021-12-20102第七章第七章 查找查找学习内容:学习内容:1. 概述概述 2. 线性表的查找技术线性表的查找技术 3. 树表的查找技术树表的查找技术 4. 散列表的查找技术散列表的查找技术5. 查找的应用查找的应用6. STL中的相关模版类中的相关模版类103数据结构与STL6. STL中的相关模版类中的相关模版类2021-12-206. STL中的相关模版类中的相关模版类集合集合(S

57、et)一个集合(一个集合(set)是一个容器,它其中所包含的元)是一个容器,它其中所包含的元素的值是唯一的。素的值是唯一的。内部数据结构内部数据结构 集合(set)的内部数据组织是一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,因此,set内部所有的数据是有序的。2021-12-20104集合集合(Set)1、set的构造函数的构造函数定义一个元素为整数的集合定义一个元素为整数的集合a,可以用:,可以用: set intSet;2021-12-20105集合集合(Set)数据的基本操作数据的基本操作插入元素:插入元素:intSet.insert(1);删除元素(如果

58、存在):删除元素(如果存在):intSet.erase(1);判断元素是否属于集合:判断元素是否属于集合: if (intSet.find(1) != intSet.end() .返回集合元素的个数:返回集合元素的个数:intSet.size()将集合清为空集:将集合清为空集:intSet.clear()2021-12-20106集合集合(Set)问题:如何判断一个元素是否在问题:如何判断一个元素是否在Set中?中?方法一方法一用用count函数来判定关键字是否出现,返回值是函数来判定关键字是否出现,返回值是1,则关键字在则关键字在Set中出现的情况,否则返回中出现的情况,否则返回0。比如。比

59、如查找关键字查找关键字1是否出现:是否出现: int index intSet. count(1);2021-12-20107集合集合(Set)方法二方法二用用find函数来定位数据出现位置,它返回一个迭函数来定位数据出现位置,它返回一个迭代器,当代器,当set中包含该数据,返回数据所在位置的中包含该数据,返回数据所在位置的迭代器,如果不包含,返回的迭代器等于迭代器,如果不包含,返回的迭代器等于end函数函数返回的迭代器。比如查找关键字返回的迭代器。比如查找关键字1是否出现:是否出现:if (intSet.find(1) = intSet.end() cout”Not Find ”1endl;

60、else cout” Find value ”1endl;2021-12-20108集合集合(Set)3、集合的算法、集合的算法 STL中的算法包含在中的算法包含在 头文件头文件中,集合的算法也包含在该头文件中。中,集合的算法也包含在该头文件中。集合的并:集合的并:set_union集合的交:集合的交:set_intersection集合的差:集合的差:set_difference2021-12-20109STL 通用工具通用工具pairSTL 通用工具通用工具pairclass pair 可以将两个值视为一个单元。对于可以将两个值视为一个单元。对于map和和multimap,就是用,就是用pairs来管理来管理value/key的成对元素。任何函数需要回传两个值,也需要的成对元素。任何函数需

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论