1. 实践题目
4-3 最优合并问题
2.问题描述
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
3.算法描述
循环k次:向后查找,找到a[i] > a[i+1]的,删除a[i]并把后面一串向前移动一格。若最大的在最后一位,删除最后一位。
若前面有00……0的情况,删除0留下有效字符:用指针i遍历直到找到非'0'。
若删除后全为0,判断指针i与length,输出0。
从i开始向后输出结果。
#include<iostream>
using namespace std;
int main(){
string a;
int k;
int i,length;
cin >> a >> k;
length = a.size();
if(k >= length) {
cout << "error: 0" << endl;
}
while(k-- > 0){
i=0;
length = a.size();
while(a[i] <= a[i+1] && i <length) i++;
while(i < length)
{
a[i] = a[i+1];
i++;
}
}
length = a.size();
i = 0;
while(a[i] == '0') {
i++;
}
if(i > 0 && i == length - 1 ) {
cout << "0" << endl;
}
while(i < length)
{
cout << a[i];
i++;
}
}
4.算法时间及空间复杂度
时间复杂度:删除k个数,进行k次扫描,时间复杂度为O(n)。
空间复杂度:运用了一个字符型数组进行存储,为O(n)。
5.心得体会
需要考虑更多特殊情况的输入输出,简化不必要的重复判断。
浙公网安备 33010602011771号