2018.3.1-2 huffman code and dynamic programming

这周先是huffman code,这东西是一种对数据进行二进制编码的方式,这样子编码可以压缩空间,算是一种压缩算法。比如一串数据里只有a,b,c,d四个字节,一般可能会觉得就00,01,10,11来指代这四个了,然而这里可能a出现的概率超过60%,其余三个都是百分之十几,那么像0,10,110,111这种编码就更好一些。构造赫夫曼编码的方式算是一种贪心算法,实际上是一个构造二叉树的过程,实际就是先找出出现概率最低的两个点,把它们作为最底层的叶子,然后合并它们的概率,再把它们当做一个点与其他点比较,重复这一过程。实际上我隐约记得离散数学里面好像讲过类似的东西,不过当时是完全不知道这是用来干啥的。

然后是dynamic programming,这是一种算法思想,和二分法或者贪心算法对应的,他基本是一个求最优解的方法,通常涉及到1.搞清楚一个最优解的结构特征。2.以这个结构特征制定方案,递归这个方案。3.求最优解的值,通常是bottom-up的求以避免重复计算。其实挺抽象的,不是太好理解。需要结合具体例子来理解。

光头哥讲的dynamic programming的栗子是一个“求一个直线图的不相临点(每个点都带一个权值)的最大权值之和”的问题。我最开始还以为他说的不相邻的点只能是两个点,想了半天都没想明白他的算法是干啥的,后来才发现原来是所有可能的不相邻点都算在里面的。。。这里具体算法就是:把问题分为两种可能性,一种的最优点集是包括最后一个结点(是指这个一串直线排列的图的最右边的结点),那么倒数第二个结点就不包括,那就对排除最右两个结点的图递归求解;另一种是不包括最后一个结点,那么对除最后一个点的图递归求解。最后比较这两种可能性得出的结果哪个更大,就选取哪个。基本上肯定是一个结果有最后一个点,一个没有,就是按这个区分的。

不过这样的解法,是up-bottom,就有很多重复求值,实际上还是brutal的。优化的办法是把它颠倒过来变成bottom-up,从左向右开始求,先求最左边0个结点和1个结点的最大权值之和,然后向右推进,这样相当于是cach了每一步的结果用于下一步的计算的,就快了很多,只有O(n)了。

当然这样也只能求出最大权值之和,后面还有进一步求出具体的点集的方法。是要在上一步基础之上,先cach了每一步的结果,然后再从右向左判断最开始讲的那两种可能是实际是哪种(就是比较两种可能性的权值之和的大小),然后判断每一步的结点(最开始是最右边的)在不在点集之内。

说实话这算法感觉。。。真的很难。而且过于具体了,感觉不是特别有普适性,学了之后对dynamic programming好像理解也没有更深入(-_-||),总感觉最近光头哥讲的东西越来越变态了。。。

另一门课开始啦——duke的sql,过两天deadline,先上完第一周的,正好换换脑子~

原文地址:https://www.cnblogs.com/dynasty919/p/8495486.html

时间: 2024-10-12 01:59:03

2018.3.1-2 huffman code and dynamic programming的相关文章

[C++]二叉树应用--Huffman code

二叉树应用–Huffman code 赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树. 背景知识 首先我们先讨论何为Huffman code. Max-Path of Tree Given a binary tree, every node has a weight, then you need to find out the path that can make the total weight of all nodes it go through is

动态规划 Dynamic Programming

March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的

Dynamic programming:from novice to advanced【动态规划】

动态规划:从新手到专家 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的一些理解.水平有限,还望指摘.

Dynamic Programming 动态规划

Dynamic Programming DP 的历史渊源: Richard E. Bellman (1920-1984) Richard Bellman received the IEEE Medal of Honor, 1979. "Bellman . . . explained that he invented the name 'dynamid programming' to hide the fact that he was doing mathe-matical research at

[LintCode] 395. Coins in a Line 2_Medium tag: Dynamic Programming, 博弈

Description There are n coins with different value in a line. Two players take turns to take one or two coins from left side until there are no more coins left. The player who take the coins with the most value wins. Could you please decide the first

[LeetCode] 877. Stone Game == [LintCode] 396. Coins in a Line 3_hard tag: 区间Dynamic Programming, 博弈

Alex and Lee play a game with piles of stones.  There are an even number of piles arranged in a row, and each pile has a positive integer number of stones piles[i]. The objective of the game is to end with the most stones.  The total number of stones

[Algorithms] Using Dynamic Programming to Solve longest common subsequence problem

Let's say we have two strings: str1 = 'ACDEB' str2 = 'AEBC' We need to find the longest common subsequence, which in this case should be 'AEB'. Using dynamic programming, we want to compare by char not by whole words. we need memo to keep tracking th

[LeetCode] 97. Interleaving String_ Hard tag: Dynamic Programming

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Example 1: Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" Output: true Example 2: Input: s1 = "aabcc", s2 = "dbbca", s3 =

Minimum Edit Distance with Dynamic Programming

1. Question / 实践题目 2. Analysis / 问题描述 3. Algorithm / 算法描述 3.1. Substitution 3.2. Insertion 3.3. Deletion 3.4. Sepcial Cases 3.5. Equation 4. Fill the table / 填表 4.1. Dimention 4.2. Range 4.3. Order 4.4. Related Code 5. Show Me the Code / 完整代码 6. T(n)