算法第四章上机实践报告
一、程序存储问题
1.实践题目
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50
2 3 13 8 80 20
输出样例:
在这里给出相应的输出。例如:
5
2.问题描述
参数:n 表示文件个数;L表示磁带的长度。
输入:第一行 n L ;第二行 n个程序放在磁带上的长度
输出:最多可以存储的程序个数
3.算法描述
1.用一个数组保存输入的n个程序在磁带上的长度
2.对数组进行从小到大的排序
3.从左往右,用temp保存选中的程序在磁带上的长度
4.如果temp<L,则证明可以选择这个程序,于是选中程序个数cnt+1
5.直到temp>L,输出cnt的值
贪心策略:每次都选择磁带长度最小的那个程序
证明:假设最优子结构里不包括一个最小的程序,但是把最有子结构里的一个程序与最小的程序替换,结果反而更好,说明最优子结构包括最小的程序,假设不成立
4.算法时间及空间复杂度分析
1.时间复杂度:基本运算输入数组为n, sort方法的时间复杂度为nlogn, 后面的时间是6n,综合起来就是 O(nlogn)
2.空间复杂度:开辟了空间为n的数组,为常数,所以空间复杂度为O(1)
二、 删数问题
1.实践题目
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543
4
输出样例:
在这里给出相应的输出。例如:
13
2.问题描述
参数:a表示正整数;k表示要删掉的个数
输入:第一行 a;第二行 k;
输出:剩下数字组成的新数最小的数
3.算法描述
1.先得出a的长度len
2.把a的每一位保存在数组arr里
3.res保存剩下的位数
4.把指针位于start=0,end=start+n 找出最小的数来确定最左的位数保存在数组ans(例如一个数有个十百千位,先确定最小千位,其次确定百位,十位,个位)
5.把指针移到start=刚选中的数字的后一位,end++;选出下一位,直到end+len
6.最后删掉前面的0;如果结果为0,保留一位0;
7.输出结果
贪心策略:选择数字每一位最小的数,先选最高位,其次是最低位
证明:假设最优子结构,不包括,有一位数选择最小的,那么这个最有子结构比选择了最小的数还要大,矛盾,所以假设不成立,最优子结构包括每一位数最小的
4.算法时间及空间复杂度分析
1.时间复杂度:输入数组用了常数时间,其他为一次方,所以时间复杂度为O(n)
2.空间复杂度:开辟了空间为a ,和空间为a-k的数组,为常数,所以空间复杂度为O(1)
三、最优合并问题
1.实践题目
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
输入格式:
第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。
输出格式:
输出最多比较次数和最少比较次数。
输入样例:
在这里给出一组输入。例如:
4
5 12 11 2
输出样例:
在这里给出相应的输出。例如:
78 52
2.问题描述
参数:k 表示待合并序列的长度;
输入:第一行:k; 第二行:k个要合并的序列
输出:两个数:最多比较次数和最少比较次数
3.算法描述
1.从队列中选出两个最小的数进行合并
2.在队列中删除选出的两个数
3.把新合成数加入队列中
4.不断合并,直到合并完
贪心策略:每次选择最小的两个数
4.算法时间及空间复杂度分析
1.时间复杂度:O(nlogn)
2.空间复杂度:开辟了两棵树O(n)
四、心得体会(对本次实践收获及疑惑进行总结)
对贪心算法有更深的体会,能更好地对贪心策略和最优子结构进行证明。对哈夫曼树还不是很了解,多看书,做题,继续努力
浙公网安备 33010602011771号