1 条题解

  • 0
    @ 2025-5-26 22:22:53

    题解:Wavelet Compression(小波压缩)

    题目分析

    本题要求对经过简单小波变换压缩的一维信号进行解压缩。简单小波变换是通过计算每对连续样本的和与差,并递归处理和的部分,直到信号长度为11来实现压缩。解压缩则是反向操作,根据和与差逐步还原原始信号。

    复杂度分析

    1. 时间复杂度
      • 输入数据的时间复杂度为O(n)O(n),其中nn是样本数量。
      • 解压缩过程中,外层whilewhile循环最多执行O(logn)O(log n)次(因为每次mm翻倍),内层两个forfor循环每次的时间复杂度为O(m)O(m),综合起来解压缩过程的时间复杂度为O(n)O(n)
      • 输出数据的时间复杂度为O(n)O(n)
      • 总体时间复杂度为O(n)O(n)
    2. 空间复杂度:使用了两个大小为maxNmaxN的数组aabb,空间复杂度为O(maxN)O(maxN),在本题中maxNmaxN260260,空间占用相对固定。

    代码实现分析

    #include <iostream>
    #include <cstdio>  
    using namespace std;
    
    const int maxN = 260;
    int a[maxN], b[maxN];
    
    int main() {
        int i, n, m;
        while (scanf("%d", &n) == 1 && n) {  
            for (i = 1; i <= n; ++i)
                scanf("%d", &a[i]);
            
            m = 1;
            while (m <= n / 2) {
                for (i = 1; i <= m; ++i) {
                    b[2 * i - 1] = (a[i] + a[i + m]) / 2;
                    b[2 * i] = (a[i] - a[i + m]) / 2;
                }
                for (i = 1; i <= 2 * m; ++i)
                    a[i] = b[i];  
                m *= 2;  
            }
            
            for (i = 1; i <= n; ++i)
                printf("%d ", a[i]);  
            printf("\n");
        }
        return 0;
    }
    

    该代码通过合理的循环结构和反向计算逻辑,正确实现了对小波压缩信号的解压缩,满足题目要求。

    • 1

    信息

    ID
    2445
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    5
    已通过
    1
    上传者