哈夫曼编码贪心算法
① 哈夫曼编码码长怎么算
设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。
霍夫曼编码是变长编码,思路:对概率大的编的码字短,概率小的编的码字长,这样一来所编的总码长就小,这样编码效率就高。上面那样求是不对的,除非你这6个码字是等概率的,各占1/6。应该用对应的概率*其对应得码长,再求和。
实际应用中
除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。
按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。
② 用动态规划解决钢条切割问题时它的最优子结构是什么
1、两种重要算法思想: 动态规划,贪心算法
2、动态规划:
基本原理:动态规划英文名dynamic programming。其中pogramming指的是表格法,而非编写计算机程序。因此,可以初步得出动态规划的基本思想:将一个具有最优子结构性质的问题分成若干个子问题,在求解过程中,记录下子问题的结果,存储在一个表格中,使得公共的子问题只需要计算一次。书中给出的基本原理:动态规划将问题分成若干个相互重叠的子问题,递归的求解子问题,保存子问题的解,再将它们的解组合起来,求出原问题的解。
从基本原理中可以看出动态规划需要满足两个条件,最优子结构和子问题重叠。
最优子结构:书中定义:问题的最优解由相关子问题的最优解组合而成,一个问题的最优解包含其子问题的最优解。典型的有背包问题和钢条切割我问题。所谓子问题就是一中组合,将一个问题分成许多子问题的集合。某个子问题转化为问题时,所需要的代价是固定的。
一般这类问题的解题过程:(自己总结)
画出子问题图(类似于逆拓扑排序的图,子问题必须在问题前面完成)
用数学表达式构建出问题的最优解和子问题最优解之间的代数表达式
通常采用自底向上的方法进行递归地求解问题的解,自底下上的含义是从最小的子问题求起。
保存每一步求出的子问题的最优解
利用计算出的信息构造一个最优解
3、贪心算法:
基本原理:从初始状态出发,每步都经过贪心选择,最终得到问题的最优解。
含义: 将每一步都看成是当前最佳的选择,做到局部最优化,直到无法选择为止。寄希望于局部最优的选择能够导致全局最优解。
两个实例:最小生成树算法和单源最短路径算法,以及集合覆盖问题的贪心启发式算法。
prim算法:将集合A看成是一棵树,每次选择剩余的节点中与这棵树形成的边的权值最小的点加入到集合A中形成新的树,循坏调用该过程,知道所有的点都已经放入到集合A中。初始时随机选择一个节点放入到集合A中。
kruskal算法:在所有连接森林中两颗不同树的边里面,找到权重最小的边(u,v),并将其加入到集合A中,循环调用该过程,直到所有的点已经放入到集合A中
贪心选择:当进行选择时,我们直接作在当前问题看来是最优的选择,而不必考虑子问题的解。这与动态规划不同,动态规划当前问题依赖于较小的子问题。而贪心算法中做当前问题最优选择,这样每步之后只需要做一个子问题的解。
也必须满足最优子结构的性质,即一个问题的最优解包含其子问题的最优解。
那么,如何区分什么时候使用动态规划,什么时候使用贪心算法呢?
典型的两个问题,0-1背包和分数背包。两者都具有最优子结构性质,但是贪心算法只能用来求分数背包的问题,而不能用来求0-1背包的问题。即只有分数背包具有贪心选择性。
我得总结(不一定对):具有贪心选择性的一类问题是:每次做选择时只有性能不同,而代价是一样的。那么这样每次的选择都是最好的,最终会得到最好的结果。
哈夫曼编码也使用贪心选择算法。每次选择待编码的字符都选择在剩余的字符中出现次数最多的
③ 霍夫曼编码用c语言实现
儿子放假回家没带课本,无法完成作业。谁能帮我传一份冀教版小学三年级语文下册生字表啊?关于冀教版就是:第一课,春的消息。第二课,燕子。第三课,柳笛和榆钱。第四课,古诗二首。。。。。。。。我要1-30课的生字表。谢谢
④ huffman编码算法可以使用贪心算法吗
设字符集合M={A,B,C,D,E,F}在文本中出现的频率分别为{8,1,3,10,6,5},画出字符集合M的Huffman编码树,并给出各字符的Huffman编码
⑤ 在编程和算法领域,有哪些经典问题
新手查询实操V出生地
⑥ 几种经典算法回顾
今天无意中从箱子里发现了大学时学算法的教材《算法设计与分析》,虽然工作这么几年没在什么地方用过算法,但算法的思想还是影响深刻的,可以在系统设计时提供一些思路。大致翻了翻,重温了一下几种几种经典的算法,做一下小结。分治法动态规划贪心算法回溯法分支限界法分治法1)基本思想将一个问题分解为多个规模较小的子问题,这些子问题互相独立并与原问题解决方法相同。递归解这些子问题,然后将这各子问题的解合并得到原问题的解。2)适用问题的特征该问题的规模缩小到一定的程度就可以容易地解决该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题3)关键如何将问题分解为规模较小并且解决方法相同的问题分解的粒度4)步骤分解->递归求解->合并 divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }google的核心算法MapRece其实就是分治法的衍生5)分治法例子:合并排序规约过程:动态规划1)基本思想将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的,如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算2)适用问题的特征最优子结构在递归计算中,许多子问题被重复计算多次3)步骤找出最优解的性质,并刻划其结构特征。递归地定义最优值。以自底向上的方式计算出最优值。根据计算最优值时得到的信息,构造最优解。贪心算法1)基本思想贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择2)适用问题的特征贪心选择性质,即所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。最优子结构性质3)步骤:不断寻找局部最优解4)例子:找硬币,哈夫曼编码,单源最短路径,最小生成树(Prim和Kruskal) 最小生成树图示:回溯法1)基本思想在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索2)适用问题的特征:容易构建所解问题的解空间3)步骤定义问题的解空间 确定易于搜索的解空间结构以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索 4)回溯法例子:N皇后问题分支限界法1)基本思想分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。2)分支限界法例子:单源最短路径问题问题描述:在下图所给的有向图G中,每一边都有一个非负边权。
⑦ 刘汝佳的算法艺术与信息学竟赛13页1.2.2节贪心法例一:钓鱼!分析部分第一段话怎样理解
贪心法(Greedy algorithm)是一种在每一步选择中都采取在当前状态下最好/优的选择,从而希望导致结果是最好/优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市, 那这就是一种贪心算法。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它每对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
贪心法可以解决一些最优性问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。
贪心法解题特点
贪心法有一个共同的点就是在最优求解的过程中都采用一种局部最优策略,把问题范围和规模缩小最后把每一步的结果合并起来得到一个全局最优解。
贪心法解题的一般步骤
(1)从问题的某个初始解出发;
(2)采用循环语句,当可以向求解目标前进一部时,就根据局部最优策略,得到一个部分解,缩小问题的范围和规模;
(3)将所有部分解综合起来,得到问题最终解。
⑧ 哈夫曼编码/译码器的实现用C++面向对象,用CLASS封装(不要C语言,用顺序表存储)
参考这个:
http://..com/link?url=qfz0NyWy_cNy2__AMhFOxD9_mslghqVqd-uVzp53fpjdD2yCgpQRl9a
大约这些功能:
void prin(){ //终端输出选择菜单
cout<<"----------------------------------------------------\n\n"
<<" ∣ I---创建哈夫曼树 ∣\n"
<<" ∣ ∣\n"
<<" ∣ E---文件编码 ∣\n"
<<" ∣ ∣\n"
<<" ∣ D---文件译码 ∣\n"
<<" ∣ ∣\n"
<<" ∣ P---打印代码文件 ∣\n"
<<" ∣ ∣\n"
<<" ∣ T---印哈夫曼树 ∣\n"
<<" ∣ ∣\n"
<<" ∣ O---哈夫曼树的存储结构 ∣\n"
<<" ∣ ∣\n"
<<" ∣ Q---退出 ∣\n"
<<"\n-----------------------------------------------------\n\n";
printf("选择菜单功能选项:");
⑨ 请教一些C++(算法与数据结构)的题目
一 就是斐波那契数列 用递归
二 是贪心算法,先把队列中每个当做一棵树,每次选择权值最小的两棵树组成一新树加进队列,重复上述过程至到只有一个树,即为所求赫夫曼树