当前位置: 首页 > news >正文

数据结构与算法分析--c语言描述(原书第二版)练习自答(第八章)

文章目录

    • 8.1
    • 8.2
    • 8.3
    • 8.4
    • 8.5
    • 8.6
    • 8.7
    • 8.8
    • 8.9

8.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

8.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

8.3

参考8.2

8.4

 我们可以证明一个高H的树至少有 2 H 2^H 2H个节点。通过归纳法,很显然,当树高度为0时最少有一个节点,当树高度为1时,最少有2个节点。设T是高度为H的树的最少的节点数。那么在通过union形成这棵树的前一步,则树必然高为H-1,因为如果不是这样的话,那么这棵树的高为H二拥有的节点数比T少,与假设矛盾。同时,因为这一次union导致树的高度更新为H,所以union的另一棵树的高位也是H-1。根据归纳假设,高度为H-1的树,至少有 2 H − 1 2^{H-1} 2H1个节点,那么两棵树union之后则至少有 2 H 2^H 2H个节点,得证。因此,拥有N个节点的树最多深度为 O ( l o g N ) O(logN) O(logN)

8.5

待完成

8.6

1
2
3
4
5
6
7
8
9

8.7

//在第一行输入一个正整数作为网络中计算机的数量,接下来每一行输入如I 1 3,代表输入编号1与编号3的计算机的连接。输入C 1 3,代表检查编号1与编号3的计算机的连接。S代表程序结束,程序结束时会输出网络中存在几个联通分支。
#include <stdio.h>
#include <limits.h>
#define MaxSize 10000
int Array[MaxSize+1];
void DeleteWrap(void);
int Find(int index);
void Union(int val1,int val2);
int main(void)
{
        char opt;
        int index,N,val1,val2,count=0;
        for(index=0;index<MaxSize+1;index++)
                Array[index]=INT_MIN;
        scanf("%d",&N);
        DeleteWrap();
        for(index=1;index<=N;index++)
                Array[index]=-1;
        opt=getchar();
        while(opt!='S')
        {
                scanf("%d %d",&val1,&val2);
                DeleteWrap();
                if(opt=='C')
                {
                        if(Find(val1)==Find(val2))
                                puts("yes");
                        else
                                puts("no");
                }
                else if(opt=='I')
                {
                        Union(Find(val1),Find(val2));
                }
                else
                        fprintf(stderr,"Program error!\n");
                opt=getchar();
        }
        for(index=1;index<=N;index++)
        {
                if(Array[index]<0)
                        count++;
        }
        if(count==1)
                printf("The network is connected.\n");
        else
                printf("There are %d components.\n",count);
        return 0;
}
void DeleteWrap(void)
{
        char ch;
        while((ch=getchar())!='\n')
                ;
}
int Find(int index)
{
        while(Array[index]>=0)
                index=Array[index];
        return index;
}
void Union(int val1,int val2)
{
        int root1,root2;
        root1=Find(val1);
        root2=Find(val2);
        if(Array[root1]>Array[root2])
        {
                Array[root1]=root2;
        }
        else if(Array[root1]<=Array[root2])
        {
                if(Array[root1]==Array[root2])
                        Array[root1]--;
                Array[root2]=root1;
        }
}

8.8

  1. 只需要一个栈,每次union时就将两个根以及它们的值压栈,在执行Deunion时就出栈,并恢复两个根的值就好。
  2. 因为路径压缩会让元素移出它原本所在的子树。
  3. 待完成

8.9

待完成

相关文章:

  • Selenium--定位页面上的元素
  • JTAG、SWD调试原理简析
  • cmake语法:option,add_definition,add_dependencies的基本作用
  • Nmap详细使用
  • CREO:CREO软件之工程图【注释】之尺寸、注解、表面粗糙度、符号、几何公差的简介及其使用方法(图文教程)之详细攻略
  • FastAPI 学习之路(三十)中间件
  • Springboot整合redis
  • Python对象序列化
  • Linux-Linux内核-进程调度
  • LabVIEW重入:允许同时调用同一子VI
  • 『网易实习』周记(五)
  • 【glib】vs2022 v163 debug win32: meson构建 glib-2.67.6
  • JlinkV9的Vtref详解
  • Thinkphp5.1对接ueditor(自定义上传接口)
  • “双非”渣本投岗爱奇艺(Java),三轮技术面等消息,侥幸通过!
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • css选择器
  • Java读取Properties文件的六种方法
  • js正则,这点儿就够用了
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python学习笔记 字符串拼接
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue的全局变量和全局拦截请求器
  • 服务器之间,相同帐号,实现免密钥登录
  • 诡异!React stopPropagation失灵
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端路由实现-history
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一天一个设计模式之JS实现——适配器模式
  • 移动端解决方案学习记录
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​MySQL主从复制一致性检测
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.9) MSP (version 4.2)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4) PIVOT 和 UPIVOT 的使用
  • (7)STL算法之交换赋值
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)http协议
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ./和../以及/和~之间的区别
  • .NET Standard 的管理策略
  • .NET 跨平台图形库 SkiaSharp 基础应用