查找技术——平衡二叉树、散列表

1、平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:
⑴ 根结点的左子树和右子树的深度最多相差1;
⑵ 根结点的左子树和右子树也都是平衡二叉树。
平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。
在平衡树中,结点的平衡因子可以是1,0,-1。
最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。
构造时,边构造边检查。
2、
设结点A为最小不平衡子树的根结点,对该子树进行平衡调整归纳起来有以下四种情况

  1. LL型
  2. RR型
  3. LR型
  4. RL型

LL型:

 B=A->lchild;
 A->lchild=B->rchild; 
 B->rchild=A;
 A->bf=0;   B->bf=0;
 if  (FA==NULL)   root=B; 
 else  if(A==FA->lchild)    FA->lchild=B; 
 else  FA->rchild=B; 

RR型:

 B=A->rchild;
 A->rchild=B->lchild;
 B->lchild=A;
 A->bf=0;   B->bf=0;
 if  (FA==NULL)   
		root=B; 
else  if  (A==FA->lchild) 
		  FA->lchild=B; 
else
		  FA->rchild=B;

LR型:

  B=A->lchild;C=B->rchild;
  B->rchild=C->lchild;
  A->lchild=C->rchild;
  C->lchild=B;    C->rchild=A;

RL型:

 B=A->rchild;    C=B->lchild;
  B->lchild=C->rchild;
  A->rchild=C->lchild;
  C->lchild=A;  C->rchild=B;

综上所述, 在一个平衡二叉排序树上插入一个新结点S时,主要包括以下三步:
(1) 查找应插位置, 同时记录离插入位置最近的可能失衡结点A(A的平衡因子不等于0)。
(2) 插入新结点S, 并修改从A到S路径上各结点的平衡因子。
(3) 根据A、 B的平衡因子, 判断是否失衡以及失衡类型, 并做相应处理。
3、散列表的查找技术
散列函数的构造:
直接定址法:H(key) = a * key + b (a,b为常数)
除留余数法:H(key)=key mod p (p为小于或等于表长(最好接近表长)的最小素数)
数字分析法:事先知道关键码的分布,关键码的分布均匀
平方取中法:事先不知道关键码的分布且关键码的位数不是很大。
折叠法(分段叠加法):关键码位数很多,事先不知道关键码的分布。
冲突处理方法:
①开放定址法(闭散列方法):
用开放定址法处理冲突得到的散列表叫闭散列表。
如何寻找下一个空的散列地址?
(1)线性探测法
Hi=(H(key)+di) % m (di=1,2,…,m-1)

int HashSearch1(int ht[ ], int m, int k) 
{
     j=H(k);  
     if (ht[j]==k) return j;   //没有发生冲突,比较一次查找成功
     i=(j+1) % m;
     while (ht[i]!=Empty && i!=j)  
     {
         if (ht[i]==k) return i;  //发生冲突,比较若干次查找成功
         i=(i+1) % m;    //向后探测一个位置
     }
     if (i==j) throw "溢出";
     else ht[i]=k;   //查找不成功时插入
}

(2)二次探测法:Hi=(H(key)+di)% m
(di=12,-12,22,-22,…,q2,-q2且q≤m/2)
(3)随机探测法:Hi=(H(key)+di)% m
(di是一个随机数列,i=1,2,……,m-1)
(4)再hash法

②链地址法(拉链法、开散列方法)
用拉链法处理冲突构造的散列表叫做开散列表。

Node<int> *HashSearch2(Node<int> *ht[ ], int m, int k)
{     
     j=H(k);
     p=ht[j];
     while (p && p->data!=k)
           p=p->next;
     if (p->data= =k) return p;
     else { 
         q=new Node<int>; q->data=k;
         q->next= ht[j];
         ht[j]=q;  
     }
}

③建立公共溢出区
散列表包含基本表和溢出表(顺序存放)两部分(通常溢出表和基本表的大小相同)

  • 散列的基本思想:在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。
  • 散列表:采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表。
  • 散列函数:将关键码映射为散列表中适当存储位置的函数。
  • 散列地址:由散列函数所得的存储位置址 。
  • 散列既是一种查找技术,也是一种存储技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值