算法设计与分析 例题 绘制Huffman树、循环赛、分治、最短路与动态规划

embedded/2024/9/25 7:43:38/

1.考虑用哈夫曼算法来找字符a,b,c,d,e,f 的最优编码。这些字符出现在文件中

的频数之比为 20:10:6:4:44:16。要求:

(1)(4 分)简述使用哈夫曼算法构造最优编码的基本步骤;

(2)(5 分)构造对应的哈夫曼树,并据此给出a,b,c,d,e,f 的一种最优编码。

解:1)、哈夫曼算法是构造最优编码树的贪心算法。其基本思想是,首先所

有字符对应n 棵树构成的森林,每棵树只有一个结点,根权为对应字符的频率。然后,重复

下列过程n-1 次:将森林中的根权最小的两棵树进行合并产生一个新树,该新树根的两个子

树分别是参与合并的两棵子树,根权为两个子树根权之和。

2)、根据题中数据构造哈夫曼树如下图所示。

由此可以得出 a,b,c,d,e,f 的一组最优的编码:01,0000,00010,00011, 1,001。

2.

设有n=2k个运动员要进行循环赛,现设计一个满足以下要求的比赛日程表:

每个选手必须与其他n-1名选手比赛各一次;每个选手一天至多只能赛一次;

循环赛要在最短时间内完成.
(1)(4分)循环赛最少需要进行( n-1 )天.

(2)(6分)当n=23=8时,请画出循环赛日程表:

1

2

3

4

5

6

7

8

2

1

4

3

6

5

8

7

3

4

1

2

7

8

5

6

4

3

2

1

8

7

6

5

5

6

7

8

1

2

3

4

6

5

8

7

2

1

4

3

7

8

5

6

3

4

1

2

8

7

6

5

4

3

2

1

3.

 请用分治策略设计递归的归并排序算法,并分析其时间复杂性(要求:分别给出divide、conquer、combine这三个阶段所花的时间,并在此基础上列出递归方程,最后用套用公式法求出其解的渐进阶)。

答 : Template <class Type>

void MergeSort (Type a[ ], int left, int right)     

{ if (left<right)                            

           { int i=left+right/2;               

            MergeSorta, left, i;               

            MergeSorta, i+1, right;            

            Merge(a, b, left, right);               

            Copy(a, b, left, right);                 

           }

 }

     Divide 阶段的时间复杂性:    O(1)          

     Conquer阶段的时间复杂性:   2T(n)          

     Combine阶段的时间复杂性:  Θ(n)          

                                               

    用套用公式法:a=2, b=2, nlog ba = n , f(n)=n,   因为f(n)与nlog ba 同阶,

   T(n) =Θ(nlogn)  

     4.

对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的贪心策略和算法的基本思想,并简要分析算法的时间复杂度。

TE={(3,4), (2,3),(1,5),(4,6)(4,5)}   

贪心策略是每次都在连接两个不同连通分量的边中选权值最小的边。

基本思想:首先将图中所有顶点都放到生成树中,然后每次都在连接两个不同连通分量的边中选权值最小的边,将其放入生成树中,直到生成树中有n-1条边。

时间复杂度为:O(eloge)  

 5.

动态规划策略求解最长公共子序列问题:

   (1)给出计算最优值的递归方程。

   (2)给定两个序列X={B,C,D,A},Y={A,B,C,B},请采用动态规划策略求出其最长公共子序列,要求给出过程。

(1)

                                        

                                        

                                       

                                          


http://www.ppmy.cn/embedded/40293.html

相关文章

【前端学习——css模块化】

https://segmentfault.com/a/1190000039772466#item-2 CSS 命名方法论 为选择器增加冗长的前缀或后缀&#xff0c;手写命名前缀后缀的方式来生成全局唯一的命名 很麻烦不方便 CSS Modules 在外部管理 CSS&#xff0c;然后将类名映射到组件内部&#xff0c;他会为每个 class 都…

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复

经过两个月的筹备&#xff0c;我们在2.3.4版本基础上进行了新一轮的迭代&#xff0c;本次更新不仅修复了多个关键问题&#xff0c;还引入了若干重要功能增强和性能优化。 在此&#xff0c;我们先提前感谢社区成员的贡献和支持&#xff0c;如果你想升级最新的版本&#xff0c;快…

Linux和Windows修改动态库的名字

一、概述 有时候我们创建windows的Dll或者Linux下的So库时候&#xff0c;在已经生成的产物里面我们又不想重新修改工程来修改我们动态库的名字&#xff0c;这个应该怎么做呢&#xff0c;windows跟linux两个平台使用的工具不一样。比如我们有一个TestA.Dll和TestA.lib或者 TestA…

c++实现数据库连接池

介绍 为提高mysql的访问性能&#xff0c;可增加连接池。为什么他能提高性能&#xff1a; mysql是基于C/S架构&#xff0c;从客户端到服务器&#xff0c;一条sql的执行流程&#xff1a;tcp三次握手->mysql连接认证->执行sql->关闭mysql连接->tcp四次挥手 每次数据库…

使用函数波动性优化 PostgreSQL 查询:Volatile, Stable, and Immutable

文章目录 1.overview2. Volatile函数3. Stable函数4. Immutable 函数结论 1.overview 在 PostgreSQL 中&#xff0c;函数的不同波动性选择——即 Volatile&#xff08;易变&#xff09;、Stable&#xff08;稳定&#xff09;和Immutable&#xff08;不可变&#xff09;——在查…

【玩转Google云】GCP 制品管理:Artifact Registry 使用详解

本篇博文将带您深入了解 Google Cloud Platform (GCP) 的 Artifact Registry,一个功能强大的统一制品仓库,用于存储、管理和保护您的软件制品。我们将详细介绍 Artifact Registry 的核心概念、优势以及使用步骤,帮助您轻松上手并将其集成到您的开发流程中。 目录 一、Arti…

Kubernetes最小单元Pod的生命周期

1.1 Pod生命周期 1.1.1 过程及状态 Pod 的生命周期管理是 Kubernetes 集群中非常重要的一部分&#xff0c;它涉及到 Pod 从创建到销毁的整个过程。下面是 Pod 生命周期中各个阶段的简要说明&#xff1a; Pod 创建过程&#xff1a;当一个 Pod 被创建时&#xff0c;Kubernetes 会…

【Go语言初探】(一)、Linux开发环境建立

一、操作系统选择 选择在Windows 11主机上运行的CentOS 7 Linux 虚拟机&#xff0c;虚拟化平台为VMWare Workstation. 二、安装Go语言环境 访问Go语言官网&#xff0c;选择Linux版本下载&#xff1a; 解压&#xff1a; tar -xvf go1.22.3.linux-amd64.tar.gz检验安装结果&…