第7章 查找
一、查找的基本概念
(1)查找表:查找表是由同一类型的数据元素(或记录)构成的集合。
(2)关键字:关键字是数据元素(或记录)中某个数据项的值,用它可以标识一个数据元素(或记录)。
(3)查找:查找是指根据给定的某个值,在查找表中确定一个其关键字等于给定值得记录或数据元素。
(4)动态查找表和静态查找表:若在查找的同时对表作修改操作(如插入和删除),则相应的表称之为动态查找表,否则称之为静态查找表。
(5)平均查找长度(ASL):为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值,成为查找算法在查找成功时的平均查找长度。
二、设置监视哨的顺序查找
“哨兵”就是用一个特殊值来作为数组的边界,使用“哨兵”可以少用一条判断语句,所以可以提高程序的效率。
三、折半查找
优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序顺序表,且插入删除困难;
折半查找方法适用于不经常变动而查找频繁的有序列表。
四、分块查找
分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。
五、二叉排序树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
(2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
(3)它的左、右子树也分别为二叉排序树。
为什么要引入二叉排序树
在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势
六、B-树
一棵m阶的B+树和m阶的B-树的差异在于:
(1)有n棵子树的节点中含有n个关键字;
(2)所有的叶子结点中包含了全部关键字的信息,以及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序连接;
(3)所有的非终端节点可以看成是索引部分,节点中仅含有其子树中的最大(或最小)关键字
八、散列表
(2)散列函数的构造方法:
数字分析法;平方取中法;折叠法;除留余数法 (假设散列表表长为m,选择一个不大于m的数p,用p去除关键字,除后所得余数为散列地址)
(3)处理冲突的办法
开放地址法:线性探测法;二次探测法;伪随机探测法
链地址法
九、QQ帐户的申请与登陆
使用map的方法
#include<iostream> #include<string> #include<map> using namespace std; int main(){ int N; char A; string S1,S2; map<string, string>QQ; cin>>N; while(N--){ cin>>A>>S1>>S2; if(A=='N'){ if(QQ.find(S1)==QQ.end()){ QQ[S1]=S2; cout<<"New: OK"<<endl; }else{ cout<<"ERROR: Exist"<<endl; } } if(A=='L'){ if(QQ.find(S1)==QQ.end()) cout<<"ERROR: Not Exist"<<endl; else if(QQ[S1]!=S2) cout<<"ERROR: Wrong PW"<<endl; else cout<<"Login: OK"<<endl; } } return 0; }
map的STL
其中find函数的运用
用hash来写的方法我还没弄出来,弄懂后应该会进行补充
下一阶段:
还是要巩固最基础的编程能力吧;
贴合课本内容,迎接期末考试的同时,多学习别人好的编程思想。