python实现LZW算法
python实现LZW算法
原理
①原理: 提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。
②编码过程:
伪代码 Pseudo code:
初始化:扫描所有字符,将所有的单个字符,按字母顺序初始化,并放入字典中初始化:扫描所有字符,将所有的单个字符,按字母顺序初始化,并放入字典中 初始化:扫描所有字符,将所有的单个字符,按字母顺序初始化,并放入字典中
读入第一个字符赋值S1读入第一个字符赋值S1 读入第一个字符赋值S1
step:{读入下一个输入字符→S2step:\left\{读入下一个输入字符→S2\right. step:{读入下一个输入字符→S2
ifS2为空if \ S_2为空 if S2为空
{扫尾:输出S1的index,结束}\left\{扫尾:输出S1的index,结束\right\} {扫尾:输出S1的index,结束}
ifS1+S2已存在字典中if\ S_1+S_2已存在字典中 if S1+S2已存在字典中
{S1+S2→S1repeat,step}\left\{S_1+S_2→S_1\right. \left.\ repeat,step \right\} {S1+S2→S1 repeat,step}
else{输出S1的indexelse\left\{输出S1的index\right. else{输出S1的index
S2→S1S_2→S_1 S2→S1
将S1+S2顺序添加到字典末尾将S1+S2顺序添加到字典末尾 将S1+S2顺序添加到字典末尾
repeat,step}\left. repeat,step\right\} repeat,step}
}\left.\right\} }
③解码过程:
根据输出的index,在字典中查找相应的字符按顺序输出,即可解码
代码实现
# 江南大学 物联网18级——MH
# python pandas库用于展示字典内容,不需要自己使用format进行格式规范了
import pandas as pd
# _flatten用于展平二维列表→一维元组,list(dict.values())得到的是二维列表
from tkinter import _flatten# LZW解码
def lzw_decoding(list_index_out, dict_syb_idx):list_index = list(dict_syb_idx.values())list_index = list(_flatten(list_index))list_syb = list(dict_syb_idx.keys())print("\n>>>LZW解码为:")for index_lp_o in range(0, len(list_index_out)):for index_lp_i in range(0, len(list_syb)):if list_index_out[index_lp_o] == list_index[index_lp_i]:print(list_syb[index_lp_i], end=' ')# 初始化操作,将单个字符按一定顺序排列,放入字典中
def initialization(str_input):# 符号列表、存储index和符号的字典、index列表初始化list_symbol, list_index = [], []dict_symbol_index = {}# 遍历输入的字符序列,对于截止当前下标,只出现一次的单个符号,放入字典;出现多次已经在字典中,不必重复for index_loop in range(0, len(str_input)):if str_input.count(str_input[index_loop], 0, index_loop + 1) == 1:list_symbol.append(str_input[index_loop])list_symbol.sort()for index_loop in range(0, len(list_symbol)):dict_symbol_index[list_symbol[index_loop]] = hex(index_loop)print("\n>>>遵循Python符号排序规则,对输入符号排序如下")print(list_symbol)del list_symbol, list_index, index_loopprint("\n>>>得到初始化字典为:")vertical_printing1 = pd.Series(dict_symbol_index)print(vertical_printing1)return dict_symbol_index# LZW编码,格式化输出
def lzw_coding(dict_symbol_index, str_input):# 初始化操作s_1 = str_input[0]print("\n>>>编码过程:")list_idx_out = []# 进入编码循环for index_loop in range(1, len(str_input)):s_2 = str_input[index_loop]print("S1 ——>{:>8}".format(s_1), " S2 ——>{:>8}".format(s_2), end='')# 判断是否已经存储过符号组合S1+S2,若在flag==Trueif s_1 + s_2 in dict_symbol_index:s_1 = s_1 + s_2print(" >> S1+S2{:>13} >> S1 + S2 → S1".format("IN DICT"), " S1next = {:<8}".format(s_1))continue# 如果未存储过S1+S2,输出用list_idx_out存储else:list_idx_out.append(dict_symbol_index[s_1])len_dict = len(dict_symbol_index)dict_symbol_index[s_1 + s_2] = hex(len_dict)s_1 = s_2print(" >> S1+S2{:>13} >> ".format("NOT IN DICT"), "{:>11}".format("S2 → S1"), " S1next = {:<8}".format(s_1))list_idx_out.append(dict_symbol_index[s_1])del s_1, s_2, index_loopreturn dict_symbol_index, list_idx_outif __name__ == '__main__':str1_input = input(">>>请输入字符序列\n")dict_end, list_idx_out = lzw_coding(initialization(str1_input), str1_input)vertical_printing = pd.Series(dict_end)print("\n>>>字典更新为:")print(vertical_printing)print("\n>>>输出为:\n", list_idx_out)lzw_decoding(list_index_out=list_idx_out, dict_syb_idx=dict_end)
python实现LZW算法相关推荐
- 【数据压缩】C++实现LZW算法编解码
一.实验目的 掌握词典编码的基本原理,用C/C++/Python等语言编程实现LZW解码器并分析编解码算法. 选择十种不同格式类型的文件,使用LZW编码器进行压缩得到输出的压缩比特流文件.对各种不同格 ...
- python数据结构与算法总结
python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...
- 数学推导+纯Python实现机器学习算法:GBDT
Datawhale推荐 作者:louwill,Machine Learning Lab 时隔大半年,机器学习算法推导系列终于有时间继续更新了.在之前的14讲中,笔者将监督模型中主要的单模型算法基本都过 ...
- 以图搜图Python实现Hash算法
以图搜图(一):Python实现dHash算法 http://yshblog.com/blog/43 以图搜图(二):Python实现pHash算法 http://yshblog.com/blog/4 ...
- em算法python代码_EM 算法求解高斯混合模型python实现
注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...
- Python:SMOTE算法——样本不均衡时候生成新样本的算法
Python:SMOTE算法 直接用python的库, imbalanced-learn imbalanced-learn is a python package offering a number ...
- Python基于聚类算法实现密度聚类(DBSCAN)计算
本文实例讲述了Python基于聚类算法实现密度聚类(DBSCAN)计算.分享给大家供大家参考,具体如下: 算法思想 基于密度的聚类算法从样本密度的角度考察样本之间的可连接性,并基于可连接样本不断扩展聚 ...
- NLP之ASR:基于python和机器学习算法带你玩转的语音实时识别技术
NLP之ASR:基于python和机器学习算法带你玩转的语音实时识别技术 导读 带你玩转python实现的语音实时识别技术(包括音频混音.回声消除.噪音滤除.杂音消除.静音检测等方法) 视频观看: 软 ...
- python文字识别算法_Python图像处理之图片文字识别(OCR)
OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几 ...
- LZW算法PHP实现方法 lzw_decompress php
LZW算法PHP实现方法 lzw_decompress php 博客分类: Php / Pear / Mysql / Node.js LZW算法简介 字符串和编码的对应关系是在压缩过程中动态生成的,并 ...
最新文章
- 一小时讲懂图神经网络在分子上的应用
- f(f(x)) = -x
- Scrum联盟发布《2016年度Scrum状态调查报告》
- [原创]同一页面无法多次使用XmlHttp发起Ajax请求的真实原因
- 正确使用cookie中的domain
- Java8 拼接字符串 StringJoiner
- 特征编码2 - 无监督一维编码(序数编码、计数编码)及python示例
- 2.Hadoop HDFS 安装配置
- 华为系统移动数据连接到服务器,怎样设置手机数据连接到服务器配置
- openstack创建虚拟机
- 最大子序列和算法C语言,最大子序列和O(N)算法简单分析『神兽必读』
- C语言程序——标准输出格式
- BT5的 U盘启动 制作
- 获取webshell的方法
- 你走后 爱情的遗址像是空城
- Sublime的tab键失效
- STC89C52RC特点及引脚介绍
- 人工智能以及图形图像处理领域CCFA类期刊汇总与个人评价
- 阿里负责人揭秘面试潜规则【转】
- SpringCloudAlibaba实现<实名认证-身份证二要素>
热门文章
- 常用的计算机硬件软件英语,计算机英语常用词汇.ppt
- 用PS为背景图片添加文字抠图
- Win10系统新款便笺便签居然可以这么好用
- 微信为什么收不到服务器的红包,收不到别人的微信红包是怎么回事?该怎么办?...
- MyBatis和Hibernate的区别
- mysql生成连续数字或日期
- Vitalik:ETH2.0 之后,协议层会稳定下来
- pimple idiom C++
- learn the python in hard way习题16~20的附加习题
- opensuse12.2 KDE 使用环境配置