问题描述:图像压缩的问题我们是这样理解的:大家都知道计算机的图像是用灰度值序列来表示的{P1,P2......Pn},其中Pi表示像素点i的灰度值。而通常灰度值的范围是0~255,因此需要8位二进制数来表示一个像素。这个时候大家应该有了一些小的疑问:我能不能用更少的位数来表示灰度值?(因为有的灰度值并没有达到255这么大)所以我们引入了图像压缩算法来解决这个问题。

不过在引入问题之前,我要在这里介绍一些算法设计的知识——我们要将灰度值序列分组,而每一组中所有的数就有可能是<255的,所以我们就不需要用8位数字去表示像素大小了,但是分组会带来一个新的问题:我如何表示当前组中像素的个数和像素的位数呢(因为不是八位,所以要有一个数据来记录真正的位数)?这里我们引入两个固定位数的值来表示,①我们用3位数字来表示当前组的每一位像素的的位数②我们引入8来表示当前组中像素点的个数  因为我们在这里规定了一组中最多存储-->0~255个数字,而一个灰度值最多有8位(2^3),所以我们可以用即3位数字来表示当前组的像素位数(注意这里都是二进制)

算法设计:知道了这些之后剩下的问题就很好解决了。下面我们看一个例子:

{6, 5, 7,5, 245, 180, 28,28,19, 22, 25,20}这是一组灰度值序列。我们按照默认的解体方法来看----一共12个数字,所以12*8=96位来表示。

而下面我们将其进行分组:

这里我们将他们分为三组:

第一组4个数,最大是7所以用3位表示;

第二组2个数,最大是245所以用8位表示;

第三组6个数,最大是28所以用5位表示;

这个时候,我们最后得到了最后的位数结果为:4*3+2*8+6*5+11*3=91。是不是优化了??

那我们算法应该怎么做来找最优的值呢??

下面我一步一步介绍。

既然是DP问题,所以我们肯定需要数组来记录每一步的最优值。这里我们用S[n]来记录第i个数字的最优处理方式得到的最优解。l[n]中来记录第当前第i个数所在组中有多少个数。而b[n]中存的数为当前组的像素位数。

下面我写出来具体的递归过程-->

例题:  求像素序列4,6,5,7,129,138,1的最优分段。

在解体过程中,我们知道在我们求s[3]的时候,我们是分三种情况----

①前三个数为一组,这个时候我需要的存储位数是3(位数)*3(每一组中数的个数)+11(每分一组所必须的固定位数)

②s[1]为单独一组,剩下的两个数字为一组,此时我所需要的空间为s[1]+2*3+11

③前两个数字为一组,最后一个数为一组。此时我们要用s[2](前面已经计算出的最优值)+3*1+11

然后比较三个数的大小,取最小的那一种分组情况,然后记下l[3]=3(当前最优分组中是三个数在同一组中),b[3]=3(每一个像素所用的存储位数)。

递归到最后得到最优解为  58.

之后我们考虑我们的分组情况。这个时候我们就要用到l这个矩阵了。

l= [1 2 3 4 1 2 3] 在这里我们先从最后一个看,它是3,所以向前推三个数字到了4,在向前推四个数,所以我们得到了这里要分两组 即 l= [1 2 3 4 | 1 2 3] 。

写到这里图像压缩问题也就讲完了,希望给大家能带了一些帮助,大家有什么要交流的问题可以给我留言。

----------------------------------------------------------------------------------------Made By Pinging

转载于:https://www.cnblogs.com/Pinging/p/7899156.html

算法复习周------“动态规划之‘图像压缩’”相关推荐

  1. 算法复习周------“贪心问题之‘单源最短路径’”

    前几天写完了DP问题,终于把比较困难的几个部分写完了,今天开始我们进入贪心模块.贪心相对与DP来说还是很好理解的.NOW,现在开始第一部分. 算法介绍:给定一个带权有向图,其中的每一条边的权值都是非负 ...

  2. 算法复习第四章动态规划

    算法复习第四章动态规划 动态规划 TSP问题 0-1bag 动态规划 TSP问题 0-1bag 最长公共子序列不考:

  3. 算法复习——动态规划篇之最长公共子序列问题

    算法复习--动态规划篇之最长公共子序列问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 子序列:将给定序列中零个或多个元素(如字符 ...

  4. 算法复习——动态规划篇之钢条切割问题

    算法复习--动态规划篇之钢条切割问题 以下内容主要参考中国大学MOOC<算法设计与分析>,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 钢铁切割: ​ 现有一段长度为10的钢条,可以零 ...

  5. 大三寒假--算法复习

    算法 复习的一些知识点 c++ 的数组初始化 fill memset c++ 的排序 c++ 的vetor 快速幂 m&1(位运算符) dfs和bfs 逆序对(使用归并算法解决) Java 的 ...

  6. NOIP复习篇———动态规划

    NOIP复习篇---动态规划 ------------------------------------------------------------------------------------- ...

  7. 【浅记CTF(一)】复习周来袭

    文章目录 前言: [WEB]sql_checkin [杂项]easy_misc 莫斯密码解密 lsb加密隐写 栅栏密码 [杂项]Un(ix)zip unixzip Base64 [杂项]Do_you_ ...

  8. php算法学习,php算法学习之动态规划

    动态规划程序设计是对解最优化问题的一种途径.一种方法,最终问题的最优解可以通过前面子问题的最优解推导出来. 对于动态规划这个算法,自己学习的还不是很透彻,简单的总结自己学习的感受是: 动态规划思想中融 ...

  9. 算法复习第三章分治法

    算法复习第三章分治法 循环日程表 最近点对 快速排序: 循环日程表 最近点对

  10. 算法复习第六章第七章

    算法复习第六章第七章 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后问题 第七章分支限界法 0-1bag问题 TSP问题 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后 ...

最新文章

  1. MySQL中varchar类型在5.0.3后的变化
  2. 2、程序包 Packages
  3. python安装modify setup选哪-python 之禅 import this
  4. nodejs之思维导图(浅理解)
  5. 运用SQLAlchemy
  6. linux下GPRS ppp拨号默认路由问题(存在eth0)
  7. 转:shell awk
  8. loj#2143. 「SHOI2017」组合数问题
  9. Redis源码分析(二)redis-cli.c
  10. mongodb or and 条件拼凑 Query.And Query.Or
  11. 例子---JS实现钟表
  12. 值传递,指针传递,引用传递
  13. 灾难恢复! 关于做过快照的AVHD文件合并成VHD .
  14. L3_01 01背包和最小序列
  15. LBS计算两坐标的距离
  16. 软件调试实战(软件调试权威指南)
  17. python计算手机销量年增长率_「净资产增长率」Python量化数据获取:总资产同比增长率与净资产同比增长率 - seo实验室...
  18. 慕课网付费视频 linux,分享给 Linux 用户的 10 有用工具
  19. Java基础知识(十) 多线程
  20. 【超分辨率】Zoom to Learn, Learn to Zoom

热门文章

  1. C# TimeSpan 计算时间差(时间间隔)
  2. Jenkins系列二:SVN+Maven+Tomcat自动构建和部署
  3. MongoDB 学习笔记之 手动预先分片
  4. 什么时候应该避免注释代码?
  5. 《自己动手做交互系统》——1.2 制作过程
  6. 因为马云,这也许是他们过得最有意思的腊八节
  7. Java SE作业:判断一个字符串是否是视频文件
  8. 理解Virtual方法。
  9. 《Ext JS权威指南》节选:树的动态加载及节点维护
  10. 查找丢包故障点的一个好命令:pathping