查找、二叉查找树、平衡二叉树

查找

因为排序排序的过程有查找的过程,故而查找这期代码代码不多,主要是定义,计算和概念

1:分为静态查找表和动态查找表,区别,动态查找表插入不存在的数据元素or删除已存在的数据元素
2:其关键字和给定值进行过比较的记录个数的平均值,他的期望ASL=∑Pi*Ci,Ci表示已经找到给定值时候,和给定值已经进行过比较的关键字的次数,Pi为查找表中第i个记录的概率

静态查找表

3:顺序表的查找:每个查找概率相同的顺序表进行顺序查找的ASL=∑(n-i+1)/n,此时的顺序查找是从表尾开始的。
4:有序表的查找;1折半查找:查找成功的关键字比较次数:𠃊log2N𠃎+1,相当于树深(把有序表变成二叉树,根结点为有序表的中间元素),查找成功的平均查找长度ASL=log2(n+1)-1,(n较大时);
5:索引顺序表的查找:思想:分块有序的思想,该顺序表分为多个子表,比如:第个子表中所有记录的关键字大于个子表的最大关键字

动态查找表

1:二叉排序树/查找树(BST):每一个树结点,若其左子树不空,则其左子树上所有结点的值均小于根结点的值,若他的右子树不空,则右子树所有结点的值均大于他的根结点的值,他的左,右子树也分别为二叉排序树。
在这里插入图片描述final
1:折半查找和二叉排序树的时间性能:有时会不相同
2:m阶B树是指:m叉高度的平衡查找树
3:B+树支持顺序查找(因为有链),B树整体来说不支持
4:哈希表的ASL与处理冲突的方法有关,与表长无关

创建二叉排序树
#define Max_Size  10
#define Error -1
#define ok    0
#define True  1 
#define Elemtype  int
#define KeyType   int
int a[Max_Size];
int i;//全局变量 
typedef struct BSTNode{
	Elemtype data;
	struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

typedef struct QNode{//层次遍历所需要的辅助
	BSTNode  T;
}QDataNode,*QDataPtr;
typedef struct BiHNode{
	QDataNode *front;//front就有个成员变量 :T 
	QDataNode *rear;
}BSTQueue,*BSTQueueLink;

//----------创立二叉排序树(不同的输入序列会得到不同的树)-----//
BSTree CreateBinarySortTree(BSTree *T,int data){
       if(*T==NULL){//头结点
       *T=(BSTree)malloc(sizeof(BSTNode));
       (*T)->data=data;
       (*T)->lchild=NULL;
       (*T)->rchild=NULL;
       return *T;
       }
       if(data<(*T)->data){
       (*T)->lchild=CreateBinarySortTree((*T)->lchild,data)
       }
       else if(data>(*T)->data){
       (*T)->rchild=CreateBinarySortTree((*T)->rchild,data)
       }
      return *T;
}
//------------------------二叉排序树的层次遍历---------------//
void LevelOrder(BSTree T){
	BSTQueue  Q;	
	InitBSTQueue(&Q);
	EnBSTQueue(&Q,T);
	while(!IsBSTQueueEmpty(&Q)){
		DeBSTQueue(&Q,&T);//一直输出就行啦
		printf("-->%d",T->data);
		if(T->lchild!=NULL) EnBSTQueue(&Q,T->lchild);
		if(T->rchild!=NULL) EnBSTQueue(&Q,T->rchild);
	}
}

void BinarySortTreeTest(){
	int num=0,k=0;
	BSTNode *T=NULL;//指向树结构体指针
	BSTree t=NULL;
//	*T=(BSTree)malloc(sizeof(BSTNode));
	printf("输入结点数目:");
	scanf("%d",&num);
	printf("\n随机输入顶点信息(名):");
	for(k=0;k<num;k++){
		scanf("%d",&a[k]);
	}
	printf("--------------\n");
	for(k=0;k<num;k++){
		printf("a[%d]=%d",k,a[k]);
		CreateBinarySortTree(&T,a[k]);
	}
	printf("\n create over"); 
    LevelOrder(T);


}

在这里插入图片描述性能分析
该树查找成功的平均查找长度ASL=(1x1+2x2+3x3+4x2+5x1+6x1)/10
在这里插入图片描述平衡二叉树(AVL树)
1:性质:或是空树,或是其左子树和右子树都是平衡二叉树,左右子树深度之差的绝对值不能超过1。平衡因子BF的值只能是-1,0,1。
在这里插入图片描述2:AVL树的ASL和log2N同数量级
3:哈希表:其平均查找长度:O(1)
哈希函数:思想:根据关键字值来决定其存储地址;冲突:对不同的关键字可能得到同一哈希地址;
构造哈希函数的方法:直接定址法,数字分析法,平方取中法,折叠法,除留余数法(地址分配最均)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值