WEB开发之Haffman编码译码

Posted by 1nhann on 2020-12-13
Page views

菜鸡最近要写数据结构课设,要写个简单的haffman编码译码系统,数据结构是用c教的,但是菜鸡很想写web,所以用java写了,以下小记一下开发的过程。


点击我跳转到应用http://inhann.top:25555/haffman/

点击我跳转到源码https://github.com/1nhann/haffman-encoder-decoder


应用功能简介

哈夫曼编码

哈夫曼编码是什么?众所周知,一个字符在计算机中对应一个01序列。一个字符集中,每个字符有不同的权重(通常以在文本中出现的频率为权重),而为了使得$\sum l_i w_i (01序列的长度和字符权重的乘积之和 )$最小,于是使用哈夫曼编码算法,根据字符的权重,计算出每个字符对应的01序列。理论上,使用经哈夫曼编码后的01序列传递信息,可以使得总数据传输量最小。

应用

  1. 使用默认权重

    点击use default weights,自动填充权重(权重参考自wiki百科

  2. 使用自定义权重

    直接写就行。注意格式为(字符,小数/整数),(字符,小数/整数)

  3. 编码(encode)

    字符 —> 01序列

    在左边的框,输入字符,点击Encode ,在右边的框中,就能得到对应的01序列

  4. 解码(decode)

    01序列 —> 字符

    在右边的框,输入01序列,点击Decode,在左边的框中,就能得到对应的字符,同时还能看到一个简单的哈夫曼树

开发

概要

Java写的后端,用到maven开发,因为是数据结构课设,所以每个用到的数据结构都是自己实现的,包括但不限于BinTree(二叉树)ComplBinTree(完全二叉树)Map(哈希表)PQueue(优先队列)Deque(双端队列)List(链表)Vector(向量)Entry(项)

用的MVC 模式,因为简单,所以用JSP-Servlet开发,前端写在JSP中,里面有必要的javascript代码,html代码,也写了必要的css文件

写完的代码最后打成 war 包,放菜鸡服务器上的一个配备了tomcatdocker 容器当中,并映射到了宿主机的端口,使得可以远程访问(http://inhann.top:25555/haffman/)

Java后端

代码量还是很多的,毕竟每个数据结构都得自己写,心血来潮把不必要的功能也写了,所以代码量更多了

代码的细节看我的github

前端

就一页jsp,很简单,顺便把前端巩固了一遍,javascript用得更熟练了

encode的时候展示树这个功能,参考了xieranmaya的博客

代码的细节看我的github

部署

部署到菜鸡服务器的docker里面,这一步菜鸡研究了好久,对docker 的使用有了更深的理解。

实际上也很简单

  1. pull 最新的tomcat的容器

    docker pull tomcat

  2. 把文件复制到服务器中

    菜鸡把haffman.war文件,放到了haffman这个文件夹下面

  3. 运行一个容器,把haffman.war映射进去

    docker run -d -p 25555:8080 --name tom -v /home/inhann/haffman:/usr/local/tomcat/webapps tomcat

  4. 好了,浏览器访问

总结

这个web应用,算是菜鸡第一个正经开发的web了,这个过程学到了很多。