如何把这个程序的复杂度降低

如何把这个程序的复杂度降低

img

img

我的解答思路和尝试过的方法
I = imread('E:\学习文档\image\1.bmp');
[m,n] = size(origin_I);
PE_I = origin_I;
for i = 2: m - 1 %不是边界像素值
    for j = 2: n - 1
        a = origin_I(i-1,j-1);
        b = origin_I(i-1,j);
        c = origin_I(i-1,j+1);
        d = origin_I(i,j-1);
        e = origin_I(i,j+1);
        f = origin_I(i+1,j-1);
        g = origin_I(i+1,j);
        h = origin_I(i+1,j+1);
        x1 = sum(a+b+c+d+e+f+g+h)/8;%把邻域 8 个像素的均值作为初始值
        x = [a,b,c,d,e,f,g,h];
        for e = 1: 8 %计算各个方向的梯度
            k(e) = x(e) - x1;
        end
        for t = 1: 8 %计算各方向梯度模的大小
            p(t) = abs( k(t)) ;
        end
            p = sort(p);
            k = sort(k);
        for f3 = 1: 8 %计算各方向的权值
            w(f3) = mse(f3) /sum(mse(f3)) ;
        end
        w = sort(w,1,'descend');%各个方向的权值进行降序排列
        for i = 1: 8 %根据权值求出预测误差
            m(i,j) = sum(w(i) * ((k(i) +x1)));
            PE_I(i,j) = origin_I(i,j) - m(i,j);
        end
    end
end

我想要达到的结果

我复现一下复杂度还是很高,有没有更好的方法

希望有相关matlab代码

对于程序,衡量其好坏的重要标准是时间复杂度和空间复杂度。在可以完成目标任务的前提下,使程序具有较低的时间复杂度和较低的空间复杂度是我们一直追求的目标。

然而有时候两者不可兼得。在减少时间复杂度的状况下,空间复杂度往往会提高,而在减少空间复杂度的状况下,时间复杂度往往会提高。想要在二者之间得到平衡,显然,这不太容易,可谓是鱼和熊掌不可兼得!

好吧,开始我们的正题!

假设我们想象这样一个场景,在我们的电脑上有一份文件,上面保存了水果名称,比如类似这样的一些数据,苹果,梨,桃子,西瓜,葡萄,苹果,西瓜......。我们的目的是统计这些名称中谁出现的次数最多。

程序实现思路很简单,也就是初始化一个字典,如果该名称不存在,则将该名称加入字典,其值设为一,如果该名称已存在,则其值加一。

降低复杂度的核心方法主要三个步骤:

第一步,暴力解法。在没有任何时间、空间约束下,完成代码任务的开发。(没有太多的套路,只要围绕你面临的问题出发,大胆发挥想象去尝试解决即)
无效操作处理。将代码中的无效计算、无效存储剔除,降低时间或空间复杂度。(需要学会并掌握递归、二分法、排序算法、动态规划等常用的算法思维)
时空转换。设计合理数据结构,完成时间复杂度向空间复杂度的转移。(需要对数据的操作进行细分,全面掌握常见数据结构的基础知识,再围绕问题,有针对性的设计数据结构、采用合理的算法思维,去不断完成时空转移,降低时间复杂度)

我提升算法速度的一般方法:

  1. 将运算矩阵化,MATLAB运算矩阵很快;
  2. 开启matlab并行运算池;
  3. 开启定时器,记录哪些步骤耗时最高,然后进行缩减。

把循环1:8的部分用数组运算替换可以降低复杂度。参考小例子:

img

>> a= [1 5 9 8 7 6]

a =

     1     5     9     8     7     6

>>  c=sum(a)/6

c =

     6

>>  b=a-c

b =

    -5    -1     3     2     1     0

给几点建议:

  • 看代码是遍历图片的像素点,每个像素点都要根据周围的八个点做计算,如果9个点都相同,应该是固定值,就不要再次计算了
  • 还可以将像素点和周围8个像素,做缓存,如果碰到一样的就直接不用再次计算,直接从缓存取

对于程序,衡量其好坏的重要标准是时间复杂度和空间复杂度。在可以完成目标任务的前提下,使程序具有较低的时间复杂度和较低的空间复杂度是我们一直追求的目标。

然而有时候两者不可兼得。在减少时间复杂度的状况下,空间复杂度往往会提高,而在减少空间复杂度的状况下,时间复杂度往往会提高。想要在二者之间得到平衡,显然,这不太容易,可谓是鱼和熊掌不可兼得!