《算法和数据结构高级教程》报告

发布 2021-05-02 14:38:28 阅读 2979

题目:1. 表中求区间最小值的问题(线性结构)

2. 序列和的前n小元素(二叉堆)

3. 丑数(优先队列)

学院计算机。

专业计算机科学与技术

年级班别。学号。

学生姓名。指导教师。

成绩。2023年12月。

报告:内容详细完整不完整。

设计方案: □非常合理 □合理较差。

实现全部实现 □部分实现 □未实现。

文档格式: □规范基本规范 □不规范

答辩:理解题目透彻,问题回答流利。

理解题目较透彻,回答问题基本正确。

部分理解题目,部分问题回答正确。

未能完全理解题目,答辩情况较差。

总评成绩:优 □良 □中 □及格 □不及格。

1.表中求区间最小值的问题(线性结构)

1.1问题描述。

实现一个含n个元素的线性表a ,n>=1 。

基本操作:修改其中一个元素的值;

查询闭区间[p, q]中元素的最小值,1<=p, q<=n。

1.2算法分析。

1.21利用二级检索的“分块查找”思想。

设块长为l, 则一共有n/l个块。

维护数组b, 保存每个块的最小值。

1.22 modify(x, y)的两步骤:

a[x]=y

重算x所在块的最小值,将对应b数组值修改

min操作。

min(a, b)

把区间[a, b]分成若干部分。

中间完整块: 一共最多n/l-2个块,这些块每块的最小值已在数组b中。

首尾块:分为非完整块和完整块。

1.3 关键**。

求数组a中每块的最小值存入数组b中:

for(i=0;i<20;i

j=i*ll为块长。

block_min=i*l;

for(j;jif(a[block_min]>a[j+1])

block_min=j+1;

b[i]=a[block_min];

重算所在块最小值:

if((a+1)%l!=0)

else if((a+1)%l==0)

b[a/l]=a[new_min];

求区间内最小值:

scanf("%d%d",&left,&right);

if(right-left>l-1左右端点不在同一块中。

if(left%l==0)

k1=b[left/l];

elseelse

1.4运行测试。

运行环境:windows 10

测试数据:运行结果;

1.5思考和小结。

通过此题的训练,更加熟悉了对二级检索的分块查找的应用。

2.序列和的前n小元素(二叉堆)

2.1问题描述。

给出两个长度为n的有序表a和b, 在a和b中各任取一个元素, 可以得到n2个和。 求这些和中最小的n个。

2.2算法分析。

可以把这些和看成n个有序表:

a[1]+b[1]

a[2]+b[1]

a[n]+b[1]

类似刚才的算法, 每次o(logn), 共取n次最小元素,共o(nlogn)

2.3 关键**。

每个元素的结构体:

struct node

node[10][10],heap[10];

往上调整,插入元素时使用:

void swim(int p)

heap[p] =a;

2.4运行测试。

运行环境:windows 10

测试数据和运行结果;

2.5思考和小结。

在此题中应用了上课所学的二叉堆,效率比单纯的暴力算法好得多,但我还想到另一种算法,分别取对a,b数组取前根号n个数一一求和,再取这些和的前n个,这n个应该大部分满足题目所求,再对a,b之后的元素与b,a前根号n个数一一求和,若有比之前的前n个数小则插入进去。

3.丑数(优先队列)

3.1问题描述。

素因子都在集合内的整数称为丑数ugly number

求前n大的丑数。

3.2算法分析。

初始:把1放入优先队列中。

每次从优先队列中取出一个元素k,把2k, 3k, 5k, 7k放入优先队列中; 取出1,放入2,3,5,7

从1开始算,取出的第n个元素就是第n大的丑数;取出2,放入4,6,10,14;碰到相同的数,再取。

每取出一个数,插入4个数,因此任何堆里的元素是o(n)的,时间复杂度为o(nlogn)

3.3 关键**。

每个元素的结构体:

struct {

int bool;//标记数组元素是否有存放数据。

int key;

queue[1000];

输出前n大的丑数:

for(i=1;i<=n;i++)

for(j=1;j<999;j++)从下标1开始查找数组中第一个未存放数据的元素下标。

if(queue[j].bool==0) break;

数据结构常用算法数据结构算法

void union list la,list lb union void mergelist list la,list lb,list lc else while i la len while j lb len mergelist status initlist sq sqlist l elemt...

数据结构与算法报告

合肥学院。计算机科学与技术系。课程设计报告。2011 2012 学年第二学期。20 12年 6 月。一,题目。1 名称 幸运数组。2 内容 doraemon有一个幸运数字k,并且对于一个数组,若其和能被k整除,则称该数组为幸运数组。现在他想知道,给定一个长度为n且由正整数构成的数组,它有多少个子数组...

数据结构与算法实习报告

课程设计报告。学号 2010100 班级序号 114103 姓名 刘洋 指导教师 陈启浩 成绩。中国地质大学信息工程学院空间信息工程系。2012年 2 月。课程设计报告。一 软件压缩 解压缩软件 szip huffman算法及应用 利用哈夫曼编码对一个现有文件进行重新编码行成新的文件,可以减小文件大...