标签:哈夫曼 [] 没有 一个 算法 code 整数 return 很多
1.实践题目
7-1 最优合并问题
2.问题描述
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
3.算法描述
定义两个整型变量max和min进行记录最少和最多的比较次数,一开始先排序
用了两个函数分别返回最少和最多的比较次数,最多的比较次数只需要把最长的两个序列合并起来放到数组的最后,再进行寻找当前序列最长的两个序列进行合并,最后得到的结果即为最大值,核心代码如下:
int maxen(int a[],int n){ sort(a,a+n); int max=a[n-1]+a[n-2]-1; int temp = a[n-2] + a[n-1]; for(int i=n-3;i>=0;i--){ max+= temp + a[i]-1; temp= temp + a[i]; } return max;
}
最小比较次数利用了哈夫曼的思想,一开始先将最小的两个序列和并,合并后放回原序列,再进行排序,再寻找最小的两个序列进行合并,最后即找到最少的比较次数,核心代码如下:
int minex(int a[],int n){ int min=0; while(n>1){ sort(a,a+n); min+=a[0]+a[1]-1; a[0]=a[0]+a[1]; for(int i=1;i<n-1;i++){ a[i]=a[i+1]; } n--; } return min; }
4.算法时间及空间复杂度分析
计算最小和并次数,合并了(n-1)次,每次合并完都要进行一次排序,由于是快排所以时间复杂度是O(nlogn),复杂度即为O((n-1)*nlogn),即O(n2logn),对于最大合并次数,只需要进行一次排序,即复杂度为O(nlogn),所以总的来说时间复杂度为O(n2logn)。
申请了一个数组存储,空间复杂度为O(n)
5.心得体会
这次实践看到第三题一下就做出来了,就和队友商量一人写一题,结果在第二题卡住了,想了很多种思路,但都觉得太复杂,后来想到用字符来表示这个位置是被删除的,输出的时候跳过字符,就解决了这道题,对于第一题,其实就是运用了哈弗曼树的思想,需要注意的是在计算最小比较次数的时候把两个序列合并放到数组里面需要再进行一次排序,第一题我因为没有输入正整数k一直没过,后来细心的队友发现了这个问题,和队友的讨论过程也是收获颇丰。
标签:哈夫曼 [] 没有 一个 算法 code 整数 return 很多
原文地址:https://www.cnblogs.com/Lzyyy/p/10054406.html