查找
因为排序排序的过程有查找的过程,故而查找这期代码代码不多,主要是定义,计算和概念
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)
哈希函数:思想:根据关键字值来决定其存储地址;冲突:对不同的关键字可能得到同一哈希地址;
构造哈希函数的方法:直接定址法,数字分析法,平方取中法,折叠法,除留余数法(地址分配最均)