C语言博客作业05--查找

| 这个作业属于哪个班级 | 数据结构--网络2011,2012(集美大学) |
| ---- | ---- | ---- | ---- |
| 这个作业的地址 | C语言博客作业05--查找
| 这个作业的目标 | 学习查找的相关结构 |
| 姓名 | 张官德 |

0.PTA得分截图

1.本周学习总结

1.1 查找的性能指标

平均查找长度(ASL),在查找运算中,因为需要花费时间在关键字的比较上,
所以把平均需要和待查找值比较的关键字次数成为平均查找长度。定义ASL:

一个算法的ASL越大,说明时间性能差,反之,时间性能好。

1.2 静态查找

  • 顺序查找
    查找方式为从头扫到尾,找到待查找元素即查找成功,若到尾部没有找到,说明查找失败。

ASL成功 = (n+1)/2
ASL失败 = n
可以看出,顺序查找方法查找成功的平均 比较次数约为表长的一半。当待查找元素不在查找表中时,也就是扫描整个表都没有找到,即比较了n次,查找失败
因此平均时间复杂度为O(n)。

  • 二分查找
    在折半查找中,用二叉树描述查找过程,查找区间中间位置作为根,左子表为左子树,右子表为右子树,
    因为这颗树也被成为判定树或比较树。查找方式为(找k),先与树根结点进行比较,
    若k小于根,则转向左子树继续比较,若k大于根,则转向右子树,递归进行上述过程,直到查找成功或查找失败。

1.3 二叉搜索树

1.3.1 如何构建二叉搜索树(操作)

  • 创建一棵二叉排序树是从一个空树开始的,每插入一个关键字,就调用一次算法
    将它插入到当前已生成的二叉排序树中。

  • 如一组数据{25,18,46,2,53,39,32,4,74,67,60,11},其二叉搜索树构建图
    以及ASL成功与不成功计算如下图

  • 二叉搜索树做插入操作
    若二叉排序树为空,则创建一个key域为k的节点。将它作为根结点;否则将k和
    根结点的关键字比较,若俩者相同,则说明树中已有该关键字,无需插入;若k<key,
    则将它插入根结点的左子树中,否则插入右子树中。

  • 二叉搜索树做删除操作如图

1.3.2 如何构建二叉搜索树(代码)

  • 创建
BSTNode* CreatBST(KeyType a[], int n) {
    BSTNode* bt = NULL;//初始时bt为空树
    int i = 0;
    while (i < n) {
        InsertBST(bt, a[i]);//将关键字a[i]插入二叉树bt中
        i++;
    }
    return bt;//返回根指针
}
  • 插入
bool InsertBST(BTSTNode*& bt, KeyType k) {
    if (bt == NULL) {
        bt = (BSTNode*)malloc(sizeof(BSTNode));
        bt->key = k;
        bt->lchild = bt->rchild = NULL;
        return ture;
    }
    else if (k == bt->key) {
        return false;
    }
    else if (k < bt->key) {
        return InsertBST(bt->lchild, k);
    }
    else {
        return InsetBST(bt->rchild, k);
    }
}
  • 删除
bool deletek(BTSTNode*& bt, KeyType k) {
    if (bt != NULL) {
        if (k == bt->key) {//查找到了被删除节点bt
            deletep(bt);//调用deletep删除结点bt
            return true;
        }
        else if (k < bt->key) {
            deletek(bt->lchild, k);//左子树中查找
        }
        else {
            deletek(bt->rchild, k);//右子树中查找
        }
    }
    else return false;
  
}

AVL树

平衡二叉搜索树又被称为AVL树,且具有以下性质:
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)
失衡做法

有一组数据{16,3,7,11,9,26,18,14,15}一个个插入后失衡调节方法如下:

  • AVL树的高度和树的总节点数n的关系?
    设N(h)为高度为h的AVL树的最小节点数目,则N(h)=N(h-1) + N(h-2) +1; N(0)=0, N(1)=1; 类似斐波那契数列; 插入、查找和删除的性能均为log(n)
  • 介绍基于AVL树结构实现的STL容器map的特点、用法
    STL总共实现了两种不同结构的管理式容器:树形结构和哈希结构。
    Map是STL的一个关联容器,翻译为映射,数组也是一种映射。
    map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
    红黑树是一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)。
    通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,通常使用红黑树。
    特点:map提供关键字到值的映射 ,其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值。

1.5 B-树和B+树

  • 1)B-树和AVL树区别,其要解决什么问题?
    B-树是一棵多叉平衡搜索树,旨在比AVL树能够拥有更低的树高,提高查找的效率,但是同AVL树一样,面对插入和删除数据的操作后需要维持平衡,这可能带来一些得不偿失的情况。
    其次B-树可以被采用在外存的数据查询上,因为树高比较低,这样就可以减少磁盘的I/O次数
  • 2)B-树定义。结合数据介绍B-树的插入、删除的操作,尤其是节点的合并、分裂的情况。

B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。

一颗m阶的B树定义如下:

1)每个结点最多有m-1个关键字。

2)根结点最少可以只有1个关键字。

3)非根结点至少有Math.ceil(m/2)-1个关键字。

4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。

5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。

  • B树的插入
    对高度为h的m阶B树,新结点一般是插在第h层。通过检索可以确定关键码应插入的位置。然后分两种情况讨论:

(1)若该结点中关键码个数小于m-1,则直接插入。

(2)如该结点中关键码个数等于m-1,则将引起结点的分裂。以中间关键码为界将结点一分为二,产生一个新结点, 并把中间关键码插入到父结点(h-1层)中。

(3)向父亲结点插入中间关键字的时候,重复以上两个步骤最坏情况一直分裂到根结点,建立一个新的根结点,整个B树增加一层

例如:

当试着向左上图中一个4阶的B树插入S时,插入后结点NPQS的关键字个数大于4-1,所以进行分裂,分裂为NP和S,
并将中间关键字Q加入父亲结点,在这是发现父亲结点的关键字个数也超了,再次分裂,使得Q结点成为新的根结点,使得树的高度+1。

  • B树的删除
    删除操作是指,根据key删除记录,如果B树中的记录中不存对应key的记录,则删除失败。

1)如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,

然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步

2)该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。

3)如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。

否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,

指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。

例如:

  • B+树的定义
    每个节点最多可以有 m 个元素;

除了根节点外,每个节点最少有 (m/2) 个元素;

如果根节点不是叶节点,那么它最少有 2 个孩子节点;

所有的叶子节点都在同一层;

一个有 k 个孩子节点的非叶子节点有 (k-1) 个元素,按升序排列;

某个元素的左子树中的元素都比它小,右子树的元素都大于或等于它;

非叶子节点只存放关键字和指向下一个孩子节点的索引,记录只存放在叶子节点中;

相邻的叶子节点之间用指针相连。

  • B+树的用途:
    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。
    B+树的磁盘读写代价更低,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多

散列查找

  • 1)哈希表的设计主要涉及哪几个内容?
    哈希表(hash table)又称散列表,其基本思路是,设要存储的元素个数为n.设置一一个长度为m(m≥n)的连续内存单元,以每个元素的关键字k;(0≤i≤<n-1)为自变量,通过一个称为
    称为哈希函数(hash function)的函数h(ki)把k;映射为内存单元的地址(或下标)h(ki),并把该元素存储在这个内存单元中,h(k.)也称为哈希地址(hash adress)。把如此构造的线
    性表存储结构称为哈希表。

  • 2)哈希表的构造及ASL成功、不成功的计算

  • 3)哈希链的构造及ASL成功、不成功的计算

2.PTA题目介绍

2.1 是否完全二叉搜索树

伪代码:

定义一个二叉树T;
定义一个队列Q;
定义数组A;
If(树为空)返回真 end if;
定义节点p且指向树根节点;
初始化队列;
p入队;
While(队列不为空){
出队;
                  对头元素赋值给p;
                  If(p为空) break;end if
                  p的左子树入队;
                  p的右子树入队;
}end 
While(队列不为空){
出队;
                  队头指针指向p;
                  数值赋给数组A;
                  If(p)为空  返回错误;end if
}
If(数组为升序)
     返回真;
Else
     返回假;
End if


知识点:树与队列的运用

2.2航空公司VIP客户查询

伪代码:

声明一个map容器且对应类型都是long long的名称为vip
声明一个迭代器ster
定义整型变量IDNum存省份证号
定义字符型变量tail存身份证最后一位
定义distance存里程数
输入n,k//n代表n组数,k代表最低里程
while n-- do
    输入IDNum,tail,distance
    若tail为x则将IDNum置为负数
    iter为IDNum在map中的位置
    if 此IDNum不在vip中 do
        若distance小于最低里程k,则置为k
        将IDNum和distance的对应存入vip中
    else do    //IDNum存在
        若distance小于最低里程k,则置为k
        在该用户拥有的里程数基础上加上distance
    end if
end while
输入m
while m-- do//查找身份证所包含的里程数
    输入IDNum和tail
    若tail为x则将IDNum置为负数
    找IDNum在vip中的位置
    找到输出里程数,找不到输出No Info
end while

知识点:
的运用

2.3基于词频的文件相似度

posted @ 2021-06-14 21:58  此处应该有名字  阅读(110)  评论(0编辑  收藏  举报