一、线性表的查找
1、顺序查找:
typedef KeyType int;//这个根据具体情况去定义;在这里定义为int; typedef struct{ KeyType key; InfoType otherinfo;//这个根据具体情况去改,这里只是抽象的说成还要添加这些类型。 }ElemType; typedef struct{ ElemType *R; int length; }SSTable;
①查找过程:按顺序一个一个比对,直到找到为止;若全部对比完都没找到,则意味着查找失败。
②设置哨兵与没有设置哨兵的区别:时间复杂度同样是O(n),但是从比较次数来看,设置哨兵的时间复杂度为O(2n),而没有设置哨兵的时间复杂度为O(n)。
2、二分查找:
int Search_Bin(SSTable ST,KeyType key) {//在有序表ST表中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0; int low = 1 ,high = ST.length;//置查找区间初值。 int mid; while(low<=high) { mid = (low+high)/2; if(key==ST.R[mid].key) //找到待查找元素; return mid; else if(key<ST.R[mid].key) high = mid - 1;//继续在前一子表进行查找; else low = mid + 1;//继续在后一子表中进行查找; } return 0; //表中不存在待查元素; }
①要求表中的元素按关键字有序排列
②查找过程:从表的中间记录开始,如果与中间记录的关键字相同,则查找成功;若大于或小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,重复操作,
直到查找成功,或者在某一步中查找区间为空,则代表查找失败。
③边界问题:
a)剩余3个数:从中间记录开始比对,最终转化成剩余1个数的问题。
b)剩余2个数:假设取上,那么mid=l,如果a[mid]>x,则r=l-1,l>r。
c)剩余1个数:与剩余两个数一样。
(因此,当l>=r,都是在搜索范围内)
④应用场景:
a)当找不到时,返回l或者r。
b)多条相同关键字记录时,根据mid往前往后找相同关键字的记录。
⑤注意:
a)对于数组a使用二分查找法查找:首先排序,然后查找,T(n)=O(nlog2(n))。
b)链表不能以时间复杂度O(log2(n))实现折半查找,因为链表不能随机存取。
二、树表的查找
1、二叉排序树
①性质:若左子树不为空,左子树上所有结点的值均小于根结点的值;若右子树不为空,右子树上所有结点的值均大于根结点的值;他的左、右子树也分别为二叉排序树。
②查找:
a)若key=T->data.key,说明查找成功。
b)若大于,则递归查找右子树。
c)若小于,则递归查找左子树。
③插入:若小于则插入左子树,若大于则插入右子树
④删除:当删除结点左右不为空时,找左子树的最右结点,找右子树的最左结点。
2、平衡二叉树:平衡因子定义为该结点左子树和右子树的深度之差,平衡二叉树上所有结点的平衡因子只能是-1、0和1.只要二叉树上有一个结点的平衡因子的绝对值大
于1,则该二叉树不平衡
3、B-树:多叉树,一层有多个关键字。可减小高度,避免内外存反复的交换。
4、B+树:类似B-树,可实现区间查找。
三、散列表
1、构造方法:计算简单;分布应均匀,尽可能减少冲突。
①数字分析法:仅适用于事先知道关键字集合。
②平方取中法:适用于不能事先了解关键字的所有情况,或难于直接从关键字中找到取值较分散的几位。
③折叠法:适用于散列地址的位数较少,而关键字的位数较多。
④除留余数法:最常用的构造散列函数的方法,选p为小于表长的最大质数。
2、处理冲突的方法
①开放地址法:
a)线性探测法:从冲突地址的下一单元顺序寻找空单元,如果最后一个位置也没找到空单元,则回到表头开始继续查找。
如果找不到空位,说明散列表已满,需要进行溢出处理。
b)二次探测法:正增量为往后查找,负增量为往前查找
c)伪随机探测法
②链地址法:类似邻接表,将所有冲突的地址以链式存储的形式放在相应位置的后面。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我觉得这一章学得不够好,这一章几乎把前面的知识点都用上了,看来我还是需要再对前面的知识点捣一捣,不过还好,csdn上有需要知识点可以学到,可以补充了解,再接再励,学期要结束了,期末考来了,得复习了。