算法 最优合并问题
来源:互联网 发布:零基础网络美术培训班 编辑:程序博客网 时间:2024/06/05 02:39
题目
给定k个排好序的序列s1,s2,…,sk,用2路合并算法将这k个序列合并成一个序列。
假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。
试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少。
测试用例: 4(序列数)
5 12 11 2(序列中的元素数)
输出:78(最差情况)\52(最优情况)
分析
贪心算法
#include<stdio.h>#define n 4int a[n]={5,12,11,2};int getmin(int *a){ int number=n,result=0,s[n]; int i,j,temp; for(i=0; i<n; i++){ s[i]=a[i]; } while(number>1){ for(i=0;i<number;i++){ for(j=i+1;j<number;j++){ if(s[i]>s[j]){ temp=s[i];s[i]=s[j];s[j]=temp; } } } s[0]=s[0]+s[1]; result+=s[0]-1; number--; for(i=1;i<number;i++) s[i]=s[i+1]; } return result;}int getmax(int *a){ int number=n,result=0,s[n]; int i,j,temp; for(i=0;i<n;i++){ s[i]=a[i]; } while(number>1){ for(i=0;i<number;i++){ for(j=i+1;j<number;j++){ if(s[i]<s[j]){ temp=s[i];s[i]=s[j];s[j]=temp; } } } s[0]=s[0]+s[1]; result+=s[0]-1; number--; for(i=1;i<number;i++) s[i]=s[i+1]; } return result;}int main(){ printf("最优情况:%d\n",getmin(a)); printf("最差情况:%d\n",getmax(a)); return 0;}
0 0
- 算法 最优合并问题
- 算法笔记 //08_最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 最优合并问题
- 【贪心】最优合并问题
- 算法 最优分解问题
- 南邮 OJ 1250 最优合并问题
- 最优装载问题 回溯算法
- 最优分解问题-贪心算法
- 贪心算法:最优分解问题
- 贪心算法 最优装载问题
- 算法 最优服务次序问题
- 最优布线问题(普里姆算法)
- 【JavaScript】 Object.defineProperty
- 如何在/etc/apt/sources.list添加新内容
- windows学习历程-IPC之共享内存
- oracle锁相关
- 整数排序II-lintcode
- 算法 最优合并问题
- JDK和JRE的区别
- Spring DI(依赖注入)
- empty()函数应用中遇到的问题
- Java访问目录与文件的相关方法
- 渗透学校某系统
- mysql配置远程连接
- bzoj 4719: [Noip2016]天天爱跑步 线段树合并
- Muscial Theme_usaco 5.1_dp||暴力