数据结构(c语言)--查找算法
8.1 基本概念与基本运算 8.2 静态查找表 8.3 动态查找表1——树表 8.4 动态查找表2——哈希表查找 问题1:老师想从在座的同学中找到身高1.813米、1.752米和身高1.675的同学 分析: 显然,查找有快慢之分 查找的快慢与什么有关呢? 查找的对象怎么组织 查找所用的方法 随意排队让老师挨个测量 所有同学从高到低排好队,让老师从中间开始选择性的测量; 自报身高,按<1.7 的、1.7~1.8 的和 >1.8的分块站一排,挨个测量。 题问2. 学校国旗班同学有身高档案,怎么建立可以快速找到身高在某些档次的队员?新队员加入时如何将信息准确插入档案? 建立二叉排序树 1 查找表 查找的对象,或者要查找的数据元素的集合称为查找表。 集合中的数据元素的逻辑结构是松散的数据结构。 2.关键码 标识数据元素的数据项称为关键码,该数据项的值称为关键码值,简称键值。 能唯一标识数据元素的数据项为主关键码,否则称为次关键码。 3 平均查找长度ASL 查找的过程一般是用“给定关键码值与数据元素的关键码值比较”,显然比较的次数越少越好,因此一般用“关键码值的比较次数”来衡量查找算法的时间性能, “关键码值的比较次数”称为查找长度。 平均查找长度ASL是指为确定数据元素在表中的位置所进行的关键码比较次数的期望值(平均值)。 ASL分为两种:查找成功时的ASL和查找不成功时的ASL。对一个含n个数据元素的表,查找成功时: 4 静态查找与动态查找 静态查找表:一个查找表只进行查询某个特定的数据元素或某个特定数据元素的各种属性的操作。 动态查找表:一个查找表若在查找的同时对查找表进行插入或删除某个数据元素的操作 8.2 静态查找表 存储方法:顺序存储或链式存储的静态查找表均可。 #define MAXNODENUM 1000 typedef struct{ KeyType key; /*关键码*/ …… /*其他数据项*/ }RecNode; typedef struct{ RecNode elem[MAXNODENUM]; /* 数据元素 */ int length; /* 顺序表中数据元素的个数 */ }Sq_Table; 查找方法: 顺序查找(线性查找) 从表的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者符合,查到所要找的元素为止。否则就是表中没有要找的元素,检索不成功。 int search_sqtable(Sq_Table st,KeyType kx) { /*在表st中查找关键码值为kx的数据元素,若找到返回该元素在数组中的下标,否则返回0 */ int i = 1; while( i <=st.length && st.elem[i].key != kx) i++; /* 从顺序表 的前端向后找*/ if ( i > st.length) return 0; else return i; } 不足之处:每次比较的时候都要判断 i <=st.length 可不可以不做这个判断,以减少比较次数? 算法8-2 设置监视哨的顺序查找算法 int search_sqtable(Sq_Table st,KeyType kx) { /*在表st中查找关键码值为kx的数据元素,若找到返回该元素在数组中的下标,否则返回0 */ int i=st.length; st.elem[0].key = kx;/* 设置监视哨*/ while( st.elem[i].key != kx) i--; /* 从顺序表的尾端向前找,监视哨保证了查找不成功时,i的值为0,并退出循环*/ return i; } 顺序查找的平均查找长度为 8.2.2 折半查找 对于一个顺序表,如果表中所有元素都按照关键码值大小的次序排列,则称为有序表。 在有序表中,查找运算可以用效率更高的折半查找来实现。有序表可以按照关键码值升序或降序排列,下面论述假定有序表按关键码值升序排列。 折半查找的思想为:在有序表中,取中间元素作为比较对象,若给定值与中间元素的关键码相