码迷,mamicode.com
首页 > 编程语言 > 详细

算法第四章上机实践报告

时间:2019-11-13 22:05:19      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:调试   代码规范   实体   合并   nbsp   数组元素   个数   键盘   形式   

算法第四章上机实践报告

  • 实践题目

    给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。

    输入格式:

    第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。

输出格式:

输出最多比较次数和最少比较次数。

输入样例:

在这里给出一组输入。例如:

4

5 12 11 2

输出样例:

在这里给出相应的输出。例如:

78 52

 

  • 问题描述

    对k个长度已知的序列进行合并,题目中指定采用的二路合并算法在合并两个序列时,所需要的比较次数仅与两个序列的长度有关,即若两个序列的长度为m和n,则合并这两个序列所需的比较次数为m+n-1,那么问题就转化为如何决定合并这k个序列的顺序先后问题来保证整个合并的过程中比较的次数最少和最多。

  • 算法描述

  1. 本问题的贪心策略:每次选最小的序列合并得到最少比较次数,即最优合并顺序;每次选最大的序列合并得到最多比较次数,即最糟合并排序。

  2. 在主函数中动态申请两个一维整形数组空间a[k]和b[k],用于存放键盘输入的k个待合并的序列长度,两个数组的初始存储的内容相同,都是键盘录入的k个数据,其中a[k]用于求最优合并算法,b[k]用于求最糟合并算法。

  3. 根据贪心策略,所以在求最少比较次数时,首先对a[k]数组里的元素进行非降序排序,然后定义min_mark为相应数组元素的指针下标,初始值为0,而后在while循环里执行语句,循环执行条件为min_mark < k-1(ps:保证执行到最后一次循环时,不会出现数组越界的情况)若满足条件,则在原有min_sum的基础上加a[min_mark]+a[min_mark+1]-1,而后将a[min_mark]的值变为a[min_mark]+a[min_mark+1](即保存合并完的序列长度),而后令a[min_mark+1]=0,数组元素下标指针后移,再次调用sort执行排序(再次执行循环体语句时,a[min_mark]刚好是序列里0的后一个非零元素)。同理,对于b[k],则是用排完序的最后两个数组元素的值max_sum += b[k-1] + b[k-2] – 1,而后执行思想和最优合并算法一致。

  4. 反证法:该算法问题的子问题就是在相应循环里每一次剩余待合并的子序列,而假设贪心算法的最优合并序列得到的比较次数不是最少的,那么子问题中我们每次都选择长度最小的两个待合并序列进行二路合并求得最少的比较次数,如此子问题的规模一步步扩大,到最后求得的合并算法的比较次数一定是最少的,最优的,这与假设相矛盾,所以假设并不成立,最糟合并算法同理。

  • 算法空间复杂度及时间复杂度分析

  1. 算法时间复杂度:整个算法中最优合并算法采用的是while循环,而最糟合并算法采用的是for循环,但二者执行循环的次数均为k-1次,对于问题规模为n时,所以T(n)=O(n)

  2. 空间复杂度:各个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)

  • 心得体会

此次上机实验其实主要的一个目的就是在学习了贪心算法之后的相关练习,学习如何使用一定的贪心策略来解决算法问题,在本次结队编程的过程中,我作为设计算法的一方,发现自己在应用贪心算法时,对于子问题的分析不够细致,比如本次上机实践的删除数问题,自己对于某些测试点出现的最高位为0,如何删除的情况欠缺考虑,没有考虑到此时的大位整数是以字符串的形式,所以判断是否擦除开头的0字符的条件应写为n[0]==‘0‘&&n[1],从而保证不会删到尾,再者,自己在编程时的代码规范有所懈怠,一直负责算法思路的设计,真正进行代码实现时,往往会出现细小漏洞,导致需要后期花时间寻找调试。在本次上机实践中其实体会到了贪心算法在解决算法问题时可以将算法的时间复杂度由普通降到很小。再者在编程时,其实这一次也学习到了一些良好的代码编写规范,比如动态申请二维数组空间,在函数运行完之后,进行释放空间。

算法第四章上机实践报告

标签:调试   代码规范   实体   合并   nbsp   数组元素   个数   键盘   形式   

原文地址:https://www.cnblogs.com/cyjbetter/p/11853268.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!