数据结构课程的内容课件.pptxVIP

  • 2
  • 0
  • 约5.24千字
  • 约 28页
  • 2023-10-26 发布于江苏
  • 举报
数据结构课程的内容 1 第8章 查找 8.1 基本概念 8.2 静态查找表 8.3 动态查找表 8.4 哈希表 教材第8、11和12章省略,因《操作系统》课程会涉及。 2 查找不成功 ——否则,称查找不成功(也应输出失败标志或失败位置) 静态查找 —— 只查找,不改变集合内的数据元素。 动态查找 —— 既查找,又改变集合内的数据元素。 关键字 ——记录中某个数据项的值,可用来识别一个记录 ( 预先确定的记录的某种标志 ) 主关键字 ——可以唯一标识一个记录的关键字 次关键字 ——识别若干记录的关键字 3 8.1 基本概念 是一种数据结构 查找表 —— 由同一类型的数据元素(或记录)构成的集合。 查 找 ——查询(Searching)特定元素是否在表中。 查找成功 ——若表中存在特定元素,称查找成功,应输出该记录; 例如“学号” 例如“女” v 查询某个“特定的”数据元素是否在表中; v 查询某个“特定的”数据元素的各种属性; v 在查找表中插入一元素; v 从查找表中删除一元素。 (3) 有哪些查找方法? 例如查字典 查找方法取决于表中数据的排列方式; 针对静态查找表和动态查找表的查找方法也有所不同。 讨论: (1)查找的过程是怎样的? 给定一个值K,在含有n个记录的文件中进行搜索,寻找 一个关键字值等于K的记录,如找到则输出该记录,否则输出 查找不成功的信息。 (2)对查找表常用的操作有哪些? “特定的”=关键字 4 8.2 静态查找表 静态查找表的抽象数据类型参见教材P216。 针对静态查找表的查找算法主要有: 一、 顺序查找(线性查找) 二、 折半查找(二分或对分查找) 三、 静态树表的查找 四、 分块查找(索引顺序查找) 6 v对非线性树结构如何顺序查找?可借助各种遍历操作! (1) 顺序表的机内存储结构: typedef struct { ElemType *elem; int length; //表长,即表中数据元素个数 }SSTable; 7 一、顺序查找 ( Linear search,又称线性查找 ) 顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最 直接的办法。 v对顺序结构如何线性查找? 见下页之例或教材P216; v对单链表结构如何线性查找?函数虽未给出,但也很容易 编写;只要知道头指针head就可以“顺藤摸瓜”; //表基址, 0号单元留空。表容量为全部元素 如何计算ASL? 分析: 查找第1个元素所需的比较次数为1; 查找第2个元素所需的比较次数为2; …… 查找第n个元素所需的比较次数为n; 总计全部比较次数为: 1+2+… +n = (1+n)n/2 讨论①查不到怎么办? ——返回特殊标志,例如返回空记录或空指针。前例中设立了“哨 兵”,就是将关键字送入末地址ST.elem[0].key使之结束并返回 即: ASL=(1+n ) /2 ,时间效率为 O(n) 思考不成功的计算 这是查找成功的情况 i=0。 讨论② 查找效率怎样计算? ——用平均查找长度ASL衡量。 讨论③ 未考虑查找不成功的 情况:查找哨兵所需 的比较次数为n+1 若求某一个元素的平均查找次数,还应当除以n (等概率), 9 与正中元素相比,若key小,则缩小至左半部内查找;再取其中 值比较,每次缩小1/2的范围,直到查找成功或失败为止。 v 对顺序表结构如何编程实现折半查找算法? ——见下页之例,或见教材(P219) v 对单链表结构如何折半查找? ——无法实现! 因全部元素的定位只能从头指针head开始 v 对非线性(树)结构如何折半查找? ——可借助二叉排序树来查找(属动态查找表形式)。 10 讨论④ 顺序查找的特点: 优点: 算法简单,且对顺序结构或链表结构均适用。 ? 二、折半查找 (又称二分查找或对分查找) 这是一种容易想到的查找方法。 先给数据排序 (例如按升序排好),形成有序表,然后再将key 缺点: ASL 太长,时间效率太低。 如何改进 解: ① 先设定3个辅助标志: low,high,mid, 显然有: mid= L(low+high)/2」 ② 运算步骤: (1) low =1,high =11 ,mid =6 ,待查范围是 [1,11]; (2) 若 ST.elem[mid].key key,说明 key= [ mid+1,high] , 则令: low =mid+1;重算 mid= L(low+high)/2」;. (3) 若

文档评论(0)

1亿VIP精品文档

相关文档