导航:首页 > 程序命令 > 硬核程序员压缩算法

硬核程序员压缩算法

发布时间:2023-02-07 07:31:47

‘壹’ 大家都知道高级程序员很吃香,那么高级程序员和黑客到底谁更厉害

非从业人员对于程序员和黑客的外在形象就存在着不一样的认知,因为电视电影和网络上的段子,普通的程序员一般都是有才能却一点不风趣的男性,常年一件格子衬衣,几根稀疏的头发,虽然赚的钱不少,却不会花钱装扮自己;而黑客的形象就完全是另一种,他们很神秘,可能我们身边随便一个人在暗地里都可以是黑客,黑客还喜欢穿黑衣服,带黑色的帽子,不喜欢以真面目示人。

相对的,普通程序员也不会关注黑客关注的很多点,比如CAPTCHA这种可能就直接引入个第三方的来防御了,并不会自己去实现一遍。还有加密算法这种,也几乎只有黑客才会去研究。普通程序员可能研究的就是压缩算法。黑客的攻击手段多种多样,有的甚至不会写代码,比如《我是谁–没有绝对安全的系统》里就有一位,根本不写代码,通过翻垃圾桶,开锁偷看资料这类操作搜集很多有用的信息,从而发起攻击。一般称这种为手段‘社工攻击’。

‘贰’ 7z命令行问题

7z和winrar就是典型的开源软件和商业软件的区别。功能和定位都差不多,可以解压大部分的压缩包,只可以压缩自己的格式和zip。算法也都是字典压缩算法,用来作为通用无损压缩。作为同时代的产物,算法就就在那放着呢,具体的实现性能的区别不是很大。也就是说,rar设置为固实,字典大小设置为一样,结果只比7z大一丁点,速度比稍快7z快。rar的默认不固实,和较小的字典,牺牲压缩率,换取较快的速度和文件的随机访问。新推出的rar5格式,支持更大的字典(rar原先最大4M;rar5默认32M,最大1G;7z默认16M,最大1.5G),缩小了和7z的压缩率差距,应该是随着硬件的进步,对速度和压缩率的又一次平衡。

由于一般用户往往使用默认参数,于是rar和7z的区别就是,固实与非固实的却别,字典大小的区别。这样看区别还是很大的。作为一般用户,rar的默认参数应该更适合。非固实的随机访问,方便修改。较快的速度,不心烦(虽然真差不太多)。

但作为一个压缩工具,在近似的速度下对压缩率的追求,是压缩的意义。不过这仅仅是理科的思维。写开源软件的人都是是计算机专业人士,更在乎的是功能,更希望可以自己控制软件的行为。既然是开源,都不要报酬了,为了心目中的理想,当然写出的软件当然是程序员们认为的理想中的样子了。拥有强大的功能,大量的自定义设置(灵活的、分类的、多种压缩算法的叠加),简洁的界面(个人很喜欢win8的窗口风格,简洁)。结果往往对新手不够友好,就更不用说外行了。7z还至少有图形界面,大量的开源项目都是命令行接口的。命令行可以节省开发时间,而且使用范围广,体积还小。

7z真是一个神器的工具,他可以解包一些平常想不到的东西。比如world,excel文件,xlsx可以解开为一堆xml。有些打包的exe安装程序,可以直接看到打包的软件。于是可以直接解压,就不用安装了,尤其是各种打包的盗版游戏。当然大型工具大都不可以这么干,因为往往牵扯到系统组件的祖册,注册表的安装,等等。而盗版游戏的破解往往和打包不是同一伙人,于是打包的exe往往带有各种广告,而没有真正的安装行为。7z是开源软件,对开源世界的linux下的许多包格式支持更好。

其实就和windows和linux的关系类似。linux取代windows,还有很遥远的路要走。ubuntu的界面已经和win区别不大,用户上手难度已经很小了。而且免费,开源(公开,尊重用户),系统开销的win少。随着跨平台的编程语言,使得软件支持更好。比如mono代替.net。以及神器wine。甚至可以跨平台的qemu,exagear。我相信linux的占有率会越来越高的。现在主要是win有着庞大的现有用户,现实必须要和他人交互。而libreoffice和msoffice不能完美兼容等等问题。linux一旦突破成为主流,win的收场只能是雪崩。

‘叁’ LZSS算法名称的由来

LZSS是一种由LZ77改进的基于字典压缩的编码,LZSS编码的原理是搜索目前未压缩的数据是否在前面出现过,如果出现过则利用前面出现的位置和长度代替现在的未压缩数据。
LZ77算法是由 Lempel-Ziv 在1977发明的。LZ77算法有许多变种算法,LZSS算法是LZ77其中一种变形,虽然LZ77有多种变形算法,但是这些基于LZ77变形的算法背后的原理都是一样的。
请原谅我复制了上面俩段
我只是想告诉你 加上我自己的认知和我在网上能搜索到的所有内容来告诉你
LZSS 后SS是一种算法 不代表意义
不是人名 就象LZ77一样
它是演变过来的 区别LZ77 以LZSS算法的形式
后面SS 是代表这种算法的规律和变化
所以就象加减乘除 它仅代表一种运算方式
看到LZSS你就想到了这 LZ77又是另一种
不知道我的浅薄解释您满意不?

‘肆’ 算法解析:哈夫曼(huffman)压缩算法

本篇将介绍 哈夫曼压缩算法(Huffman compression)

众所周知,计算机存储数据时,实际上存储的是一堆0和1(二进制)。

如果我们存储一段字符:ABRACADABRA!

那么计算机会把它们逐一翻译成二进制,如A:01000001;B: 01000010; !: 00001010.

每个字符占8个bits, 这一整段字符则至少占12*8=96 bits。

但如果我们用一些特殊的值来代表这些字符,如:

图中,0代表A; 1111代表B;等等。此时,存储这段字符只需30bits,比96bits小多了,达到了压缩的目的。

我们需要这么一个表格来把原数据翻译成特别的、占空间较少的数据。同时,我们也可以用这个表格,把特别的数据还原成原数据。

首先,为了避免翻译歧义,这个表格需满足一个条件: 任何一个字符用的值都不能是其它字符的前缀

我们举个反例:A: 0; B: 01;这里,A的值是B的值的前缀。如果压缩后的数据为01xxxxxx,x为0或者1,那么这个数据应该翻译成A1xxxxxx, 还是Bxxxxxxx?这样就会造成歧义。

然后,不同的表格会有不同的压缩效果,如:

这个表格的压缩效果更好。

那么我们如何找到 最好的表格 呢?这个我们稍后再讲。

为了方便阅读,这个表格是可以写成一棵树的:

这棵树的节点左边是0,右边是1。任何含有字符的节点都没有非空子节点。(即上文提及的前缀问题。)

这棵树是在压缩的过程中建成的,这个表格是在树形成后建成的。用这个表格,我们可以很简单地把一段字符变成压缩后的数据,如:

原数据:ABRACADABRA!

表格如上图。

令压缩后的数据为S;

第一个字符是A,根据表格,A:11,故S=11;

第二个字符是B,根据表格,B:00,故S=1100;

第三个字符是R,根据表格,R:011,故S=1100011;

如此类推,读完所有字符为止。

压缩搞定了,那解压呢?很简单,跟着这棵树读就行了:

压缩后的数据S=11000111101011100110001111101

记住,读到1时,往右走,读到0时,往左走。

令解压后的字符串为D;

从根节点出发,第一个数是1,往右走:

第二个数是1,往右走:

读到有字符的节点,返回此字符,加到字符串D里。D:A;

返回根节点,继续读。

第三个数是0,往左走:

第四个数是0,往左走:

读到有字符的节点,返回此字符,加到字符串D里。D:AB;

返回根节点,继续读。

第五个数是0,往左走:

第六个数是1,往右走:

第七个数是1,往右走:

读到有字符的节点,返回此字符,加到字符串D里。D:ABR;

返回根节点,继续读。

如此类推,直到读完所有压缩后的数据S为止。

压缩与解压都搞定了之后 我们需要先把原数据读一遍,并把每个字符出现的次数记录下来。如:

ABRACADABRA!中,A出现了5次;B出现了2次;C出现了1次;D出现了1次;R出现了2次;!出现了1次。

理论上,出现频率越高的字符,我们给它一个占用空间越小的值,这样,我们就可以有最佳的压缩率

由于哈夫曼压缩算法这块涉及内容较多 ,文章篇幅很长;全文全方面讲解了Compose布局的各方面知识。更多Android前言技术进阶,我自荐一套《 完整的Android的资料,以及一些视频课讲解 现在私信发送“进阶”或者“笔记”即可免费获取



最后我想说:

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

Android 架构师之路还很漫长,与君共勉

‘伍’ 数据压缩软件是用什么语言编写的 有这方面的书籍吗(数据压缩技术) (麻烦说具体的,谢谢!)

java 能啊。。。JDK 中 java.util.zip 就提供了 zip 压缩组件,就是一个压缩/解压缩的实现例子
javax.imageio 组件就有多种图片压缩的实现,比如: jpg 有损压缩, gif , png 无损压缩

如果你有其它的压缩算法什么的,也可以用 java 来实现。

--------------------------

数据压缩的书有好多的,只要去当当网,卓越网等网站搜索一下“数据压缩”就会看到很多结果。。
当然,这里头还涉及到很多针对性的压缩,比如 视频压缩, 图像压缩, 音频压缩。。。根据自己需要查找

-------------------------

开发程序一般情况下都是不限于语言的,重点都是在算法上
不管你用什么语言,只要通过一定方式(编绎执行, 解析执行, .. )能驱动电脑为你做事,就行了。
只不过在不同的环境下,有时候实现起来比较麻烦,或者不合适。。。
比如说解析性的脚本语言 (javascript, vbscript, ... 等)用来做数据压缩这种大运算量的事情就不合适。。。性能不好

---------------------------------------------------
一般使用越高级的语言,越难开发出高性能的软件。 比如用动态的脚本语言
使用越低级的语言,越有提升性能的空间,比如 汇编,或者直接写cpu指令,(前提是程序员够牛B)
还有,如果算法烂的话,用什么语言都不能写出高性能的应用

推荐用于开发 压缩应用 的程序语言:C, C++, Pascal, VB, Java, .Net , ...
甚至一些脚本语言也仍然可以用用,像 ActionScript, Python 等
不过多数都是借助其它组件实现,并没有直接通过脚本程序去压缩(解压缩)数据

‘陆’ 程序员必须掌握哪些算法

一.基本算法:

枚举. (poj1753,poj2965)

贪心(poj1328,poj2109,poj2586)

递归和分治法.

递推.

构造法.(poj3295)

模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)

二.图算法:

图的深度优先遍历和广度优先遍历.

最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成树算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓扑排序 (poj1094)

二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)

最大流的增广路算法(KM算法). (poj1459,poj3436)

三.数据结构.

串 (poj1035,poj3080,poj1936)

排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)

简单并查集的应用.

哈希表和二分查找等高效查找法(数的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼树(poj3253)



trie树(静态建树、动态建树) (poj2513)

四.简单搜索

深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)

广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)

简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)

五.动态规划

背包问题. (poj1837,poj1276)

型如下表的简单DP(可参考lrj的书 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学

组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(POJ3252,poj1850,poj1019,poj1942)
数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(poj2635, poj3292,poj1845,poj2115)
计算方法.
1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)
七.计算几何学.

几何公式.

叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)

多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)

中级(校赛压轴及省赛中等难度):
一.基本算法:

C++的标准模版库的应用. (poj3096,poj3007)

较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)

二.图算法:

差分约束系统的建立和求解. (poj1201,poj2983)

最小费用最大流(poj2516,poj2516,poj2195)

双连通分量(poj2942)

强连通分支及其缩点.(poj2186)

图的割边和割点(poj3352)

最小割模型、网络流规约(poj3308)

三.数据结构.

线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)

静态二叉检索树. (poj2482,poj2352)

树状树组(poj1195,poj3321)

RMQ. (poj3264,poj3368)

并查集的高级应用. (poj1703,2492)

KMP算法. (poj1961,poj2406)

四.搜索

最优化剪枝和可行性剪枝

搜索的技巧和优化 (poj3411,poj1724)

记忆化搜索(poj3373,poj1691)

五.动态规划

较为复杂的动态规划(如动态规划解特别的旅行商TSP问题等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
记录状态的动态规划. (POJ3254,poj2411,poj1185)

树型动态规划(poj2057,poj1947,poj2486,poj3140)

六.数学

组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
4.递推关系和母函数.
数学.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率问题. (poj3071,poj3440)
3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)
计算方法.
1.0/1分数规划. (poj2976)
2.三分法求解单峰(单谷)的极值.
3.矩阵法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
随机化算法(poj3318,poj2454)
杂题(poj1870,poj3296,poj3286,poj1095)
七.计算几何学.

坐标离散化.

扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多边形的内核(半平面交)(poj3130,poj3335)

几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)

高级(regional中等难度):
一.基本算法要求:

代码快速写成,精简但不失风格

(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)

保证正确性和高效性. poj3434

二.图算法:

度限制最小生成树和第K最短路. (poj1639)

最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最优比率生成树. (poj2728)

最小树形图(poj3164)

次小生成树.

无向图、有向图的最小环

三.数据结构.

trie图的建立和应用. (poj2778)

LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法(RMQ+dfs)).(poj1330)
双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的). (poj2823)
左偏树(可合并堆).

后缀树(非常有用的数据结构,也是赛区考题的热点).(poj3415,poj3294)
四.搜索

较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)

广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)

深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)

五.动态规划

需要用数据结构优化的动态规划.(poj2754,poj3378,poj3017)
四边形不等式理论.

较难的状态DP(poj3133)

六.数学

组合数学.
1.MoBius反演(poj2888,poj2154)
2.偏序关系理论.
博奕论.
1.极大极小过程(poj3317,poj1085)
2.Nim问题.
七.计算几何学.

半平面求交(poj3384,poj2540)

可视图的建立(poj2966)

点集最小圆覆盖.

对踵点(poj2079)

‘柒’ RAR的压缩方式

p Katz)被人发现倒毙在美国威斯康星州密尔沃基的一家汽车旅馆里,据说死因是慢性酒精中毒引起的并发症。被人发现时,卡兹的手中仍握着一个烈性酒的酒瓶,在同一个房间里还发现了另外5个空酒瓶。这个噩耗很快就通过Internet传遍了世界,很多认识和了解卡兹的人们以不同的方式对这个不幸的消息发表评论,寄托哀思。你一定会好奇地问,这个菲利普·卡兹究竟是何方神圣?
说起菲利普·卡兹这个名字,很多人可能都茫然不知;但是相信一提到电脑里、Internet上那比比皆是的ZIP压缩文档,不知道的人就很少了。菲利普·卡兹正是ZIP这个大名鼎鼎的压缩文档格式的发明人,他开发的ZIP压缩软件PKZip在DOS时代已风行世界,成为人们使用最频繁的工具软件之一。今天,人们从Internet下载的文件几乎百分之百是用卡兹发明的ZIP压缩算法压缩过的。卡兹的这个发明和贡献,在使电脑之间交换信息的方式变得更加方便的同时,也大大降低了成本。特别是在今天这个Internet大行其道而通讯速度和带宽又很难令人满意的情况下,ZIP压缩软件得到世界各地的电脑爱好者的欢迎和喜爱就是极其自然的事情。看看身边有多少人在使用PKZip和Winzip,你就能真切地体会到菲利普·卡兹对于我们今天使用计算机的方式带来的巨大影响。

压缩软件的争斗

现在回忆起来,ZIP压缩文档标准和PKZip压缩软件的问世颇有几分戏剧性的传奇色彩。
时光要回溯到1988年,那时候的Internet还处在蒙昧的“原始时代”的后期,当时网上的信息远远没有今天丰富,只是极少数大学、研究机构和美国军方才能够享用的“特权”,一般电脑爱好者很难有机会接触。那个时代,风靡北美大地的是通过电话线接入的老式“电子公告牌”(BBS)系统。热衷于电脑的“发烧友”们就通过这些现在几乎已经绝迹的方式来交换信息、交流思想和共享软件。由于电话线的数据通讯带宽很低、干扰大、稳定性很差,再加上当时流行的调制解调器(Modem)的速率也只有14.4Kbps,通过BBS传输体积较大的软件一直是让人头疼的难题。正是基于这种原因,文档压缩技术就变得极为有用。压缩后的文档一般只有原来体积的几分之一,可以大大减少传输的时间,也提高了可靠性。
当时流行的文档压缩技术有好几种,比较流行的一种是新泽西州的SEA((Systems Enhanced Associates)公司开发的ARC压缩技术,压缩生成的文档的后缀是.ARC。ARC能很好地工作,但是你必须花钱去向SEA公司购买。1988年的时候,20岁出头的菲利普·卡兹和很多同时代的年轻人一样,穿梭于BBS的自由空间,沉迷于狂热的编程体验里。由于深受断线的困扰,经常出没于BBS的卡兹索性自己开发了一个与SEA的ARC完全兼容的共享压缩软件,取名PKARC。PKARC推出以后,很快就在BBS上广为流传,深受电脑爱好者们的喜爱。它和SEA ARC一样工作得很不错,最要命的是,由于是以共享软件形式发布,人们可以随意地使用,如果觉得满意的话,才给作者付上很小的一笔注册费用。有了近乎免费的PKARC,人们当然不会再为SEA的ARC付出不菲的代价。直接的后果是,很多人都转向了PKARC——这个菲利普·卡兹的“业余作品”,SEA的ARC则销量巨减。这无异于放倒了SEA的“摇钱树”。恼羞成怒的SEA把卡兹告上了法庭,声称ARC压缩标准是它的***,要求法庭禁止卡兹继续传播与其竞争的PKARC。虽然大多数的电脑爱好者都站在卡兹这边,但法庭最终还是作出了不利于卡兹的判决。这个结果对卡兹是一个不小的打击,他被迫放弃了PKARC这个心爱的软件项目。最让卡兹气愤的是,他感觉自由创新的权利被人剥夺了。在朋友和同好们的鼓励之下,憋足了一口气的卡兹发誓要写出一个更好的压缩软件,堂堂正正地击败SEA,而且要让它输得心服口服。这一次,卡兹的编程天才再次展露无遗。在短短的几周以后,卡兹就拿出了后来统治整个BBS世界乃至Internet的ZIP。这个全新的PKZIP,使用卡兹发明的ZIP压缩算法,比SEA的ARC速度快了将近一倍,压缩率也有一定的提高。卡兹继承了PKARC的做法,将PKZIP免费发放,使其很快成为人见人爱的“杀手应用”(Killer Appliction)。没有任何号召,遍及美国的各大BBS的管理员们都先后自发地将原有的.Arc压缩文档转换成卡兹的.ZIP格式。经过不到半年时间,原来风光无限的SEA的ARC就几乎绝迹了!取而代之的就是免费而且性能更加出众的PKZIP。在失去众多的用户的支持以后,SEA迅速沉沦,最终销声匿迹。有人在后来对此事的评论中说道,“菲利普·卡兹无疑扮演了ARC掘墓人的角色,他为ARC的棺材钉上了最后一颗钉子!”
有关ZIP打败强大的ARC和SEA的事迹成为了电脑爱好者们津津乐道的传奇故事,疾恶如仇而又身手不凡的菲利普·卡兹也成为那些热衷于编写非凡程序的青年人的偶像。此后,卡兹一直继续着对PKZIP的开发和维护工作。
PKZIP及其“克隆”作品Winzip成为Internet历史上最有名的共享软件之一,ZIP压缩格式也成为压缩文档的事实标准,建立起一个统治Internet的“ZIP王朝”。菲利普·卡兹为世界贡献了一个伟大的共享软件,而他自己却几乎没有从中获得任何好处!

意外的结局

菲利普·卡兹的突然去世,对于他本人,对于他的家庭,乃至整个计算机界都是一个令人扼腕的悲剧。人们从此失去了一个才华横溢的程序员,失去了一个传奇英雄。噩耗传出以后,在着名的IT网站ZDNET的新闻反馈页面上,许许多多的网友留言体现了人们对卡兹早逝的惋惜和他生前成就的褒扬。正像来自南美洲巴拉圭的一位系统分析员在留言中写到的那样:“菲利普·卡兹和他的.ZIP压缩格式必将得到永生。每一个.ZIP文件都将永远记住菲利普·卡兹,因为每个ZIP文件的开头都嵌有他姓名的字头缩写字母‘PK’……”
也有报道指出,菲利普·卡兹的英年早逝除了与长年编写软件的巨大压力有关外,也与其不良的个人生活方式关系密切。卡兹的直接死因,无疑是其长期酗酒恶习的悲剧结局。作为一名程序员,菲利普·卡兹获得了巨大成功。但于之形成鲜明对比的是,在个人生活方面,卡兹却一直很不顺利。郁闷的结果让卡兹觉得只能求助于酒精才能获得解脱,而这最终让他付出了生命的代价!数据压缩和程序设计占据了卡兹短暂的生命历程的绝大部分。他的杰作让世界各地的人们从“压缩”中获益匪浅,然而,不幸的是,菲利普·卡兹的生命似乎也被令他得意非凡的压缩软件压缩得那样短暂。不知道这是不是造物弄人?

他们是程序员

人生如戏,戏如人生。对生活在无比精彩的计算机时代乃至互联网时代的一代又一代和菲利普·卡兹一样的天才程序员们来讲,这句话如果改成“人生如程序,程序如人生”可能会更加贴切一些。这些在常人眼中聪明绝顶、特立独行的古怪“家伙”简直就将程序看作了自己的生命,写不出好用的软件,对他们无疑是一场灾难。在很大程度上,程序已经成为他们生命中不可割舍的一个最重要的组成部分了。这些充满灵性的程序不再仅仅是玄妙无匹的0和1的排列组合体,它们根本就是呕心沥血的程序员们的人生哲学甚至整个人生的写照。菲利普·卡兹或许只是一个极端的例子而已。
在这个剧烈变革的大时代中,我们并不缺乏伟大的程序员。他们中的绝大部分睿智、热情、乐观、无私,由于他们的天才与杰作,我们的生活和工作变得从未有过的精彩、丰富、刺激、舒适。被誉为“自由之神”的自由软件阵营的精神领袖理乍得·斯托曼(Richard Stallman)极力倡导的GNU计划,吹响了计算机软件进军“共产主义社会”的号角;永远拥有一张“娃娃脸”的比尔·盖茨经过20多年的奋斗,成了不可企及的“微软帝王”,每个人的桌上摆上一台PC的梦想很快就将成为现实;发明免费操作系统Linux的莱纳斯·托沃兹(Linus Torvalds)让人们看到了打破微软霸权的希望曙光;被美誉为Internet上的“孤独骑士”的拉里·沃(Larry Wall)因为偷懒而发明的Perl语言,成为目前Internet上使用最广的编程语言……这些出色的程序员的故事,写下来都是一段让人不忍释卷的传奇。然而,使我们这个对信息的依赖日甚一日的世界良好运转的是更多默默无闻地分布在世界各地的辛勤的程序员们。没有这些忘我工作的人们,数字化社会就只能永远是美好而遥远的幻梦!有人将编程看成是一种艺术而并非技术,这在一定程度上不无道理。那是一种艺术家一般的灵感和激情的产物,美妙的程序是要用心、用血去书写的。现在虽然时时听到身边的程序员悲叹“我们吃的可是时光短暂的青春饭”,但真正因此“金盆洗手”而罢手不干的还是少之又少。挑战困难、勇于创新已经成为融入了每一个真正的程序员血液的特质,成为他们生命中不可分割的部分。他们也因为这些而赢得人们的尊敬。
在可敬、可爱有时甚至是可恨的程序员们的身上或许还存在这样、那样的问题,或许还远远谈不上完美,但是我们不能对他们苛求太多。毕竟,他们和我们一样,也是普普通通有血有肉的人。我们为他们创造的杰作和奇迹欢呼,为他们面对的失败和失意惋惜,为他们遭遇的不幸和悲惨流泪,就因为他们是程序员!在这里,我们没有任何夸耀或是贬低的潜台词,因为那是世界上一部分真实人群的真实的生存状态和生活方式,我们很难给其贴上对与错或是好与坏的“标签”,况且,我们也许根本就没有这样的权力。是非功过的评说,最有说服力的是时间……

‘捌’ 程序员必须掌握哪些算法

  1. 集束搜索(又名定向搜索,BeamSearch)——最佳优先搜索算法的优化。

  2. A*搜寻算法——图形搜索算法,是最佳优先搜索的范例,从给定起点到给定终点计算出路径。

  3. 数据压缩——采取特定编码方案,使用更少的字节数(或是其他信息承载单元)对信息编码的过程,又叫来源编码。

  4. 离散微分算法(Discretedifferentiation)

  5. 哈希算法(Hashing)

  6. 堆排序(Heaps)

  7. 合并排序(MergeSort)

  8. 梯度下降(Gradientdescent)——一种数学上的最优化算法。

  9. 牛顿法(Newton'smethod)——求非线性方程(组)零点的一种重要的迭代法。

  10. 欧几里得算法(Euclideanalgorithm)——计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。

  11. Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。

  12. 动态规划算法(DynamicProgramming)——展示互相覆盖的子问题和最优子架构算法。

  13. Diffie-Hellman密钥交换算法——一种加密协议,允许双方在事先不了解对方的情况下,在不安全的通信信道中,共同建立共享密钥。该密钥以后可与一个对称密码一起,加密后续通讯。

  14. Dijkstra算法——针对没有负值权重边的有向图,计算其中的单一起点最短算法。

  15. 二分查找(BinarySearch)——在线性数组中找特定值的算法,每个步骤去掉一半不符合要求的数据。

  16. 合并查找算法(Union-find)——给定一组元素,该算法常常用来把这些元素分为多个分离的、彼此不重合的组。

  17. 期望-最大算法(Expectation-maximizationalgorithm,又名EM-Training)——在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。

  18. 快速傅里叶变换(FastFouriertransform,FFT)——计算离散的傅里叶变换(DFT)及其反转。

  19. 最大流量算法(Maximumflow)——该算法试图从一个流量网络中找到最大的流。

  20. LLL算法(Lenstra-Lenstra-Lovaszlatticerection)——以格规约(lattice)基数为输入,输出短正交向量基数。

  21. 两次筛法(QuadraticSieve)——现代整数因子分解算法,在实践中,是目前已知第二快的此类算法(仅次于数域筛法NumberFieldSieve)。

  22. RANSAC——是“RANdomSAmpleConsensus”的缩写。该算法根据一系列观察得到的数据,数据中包含异常值,估算一个数学模型的参数值。

  23. 求解线性方程组()——线性方程组是数学中最古老的问题,它们有很多应用,比如在数字信号处理、线性规划中的估算和预测、数值分析中的非线性问题逼近等等。求解线性方程组,可以使用高斯—约当消去法(Gauss-Jordanelimination),或是柯列斯基分解(Choleskydecomposition)。

  24. Q-learning学习算法——这是一种通过学习动作值函数(action-valuefunction)完成的强化学习算法,函数采取在给定状态的给定动作,并计算出期望的效用价值,在此后遵循固定的策略。

  25. Schönhage-Strassen算法——在数学中,Schönhage-Strassen算法是用来完成大整数的乘法的快速渐近算法。其算法复杂度为:O(Nlog(N)log(log(N))),该算法使用了傅里叶变换。

  26. RSA——公钥加密算法。首个适用于以签名作为加密的算法。RSA在电商行业中仍大规模使用,大家也相信它有足够安全长度的公钥。

  27. Strukturtensor算法——应用于模式识别领域,为所有像素找出一种计算方法,看看该像素是否处于同质区域(homogenousregion),看看它是否属于边缘,还是是一个顶点。

  28. 单纯型算法(SimplexAlgorithm)——在数学的优化理论中,单纯型算法是常用的技术,用来找到线性规划问题的数值解。

  29. 奇异值分解(Singularvaluedecomposition,简称SVD)——在线性代数中,SVD是重要的实数或复数矩阵的分解方法,在信号处理和统计中有多种应用,比如计算矩阵的伪逆矩阵(以求解最小二乘法问题)、解决超定线性系统(overdeterminedlinearsystems)、矩阵逼近、数值天气预报等等。

  30. 维特比算法(Viterbialgorithm)——寻找隐藏状态最有可能序列的动态规划算法,这种序列被称为维特比路径,其结果是一系列可以观察到的事件,特别是在隐藏的Markov模型中。

‘玖’ 什么是zip格式zip格式的创造者

zip格式由于提供了免费的压缩工具而逐渐在更多的领域得到应用,那么你对zip格式了解多少呢?以下是由我整理关于什么是zip格式的内容,希望大家喜欢!

zip格式的简介
ZIP,是一个计算机文件的压缩的算法,原名Deflate(真空),发明者为菲利普·卡兹(Phil Katz)),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为 application/zip 。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7-Zip格式。从性能上比较,RAR格式较ZIP格式压缩率较高,但是它的压缩时间远远高于Zip。
windows下支持zip的软件
WinMount

简要说明:WinMount是一款功能强大的Windows小工具,具备压缩软件的压缩、解压、浏览等功能,也具备挂载DVD,CD,虚拟机硬盘镜像的功能。WinMount最大特色在于,首创读取压缩包新理念-Mount:直接将压缩包Mount到虚拟盘,无需解压,打破压缩包解压才能使用的传统。

winzip

WinZip 是一款功能强大并且易用的压缩实用程序, 支持 ZIP、CAB、TAR、GZIP、MIME, 以及更多格式的压缩文件. 其特点是紧密地与 Windows 资源管理器拖放集成, 不用留开资源管理器而进行压缩/解压缩. 包括 WinZip 向导 和 WinZip 自解压缩器个人版本. 被 PC Magazine 杂志授予最佳精品实用程序大奖、被Vector Capital收购的Winzip,近日发布了新的Winzip 10 beta.Vector Capital。新版支持计划任务和视图风格切换。

winrar

WinRAR 是一款功能强大的压缩包管理器,它是档案工具RAR 在 Windows 环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从 Internet 上下载的 RAR、ZIP 2.0 及 其它 文件,并且可以新建 RAR 及 ZIP 格式的文件。
Zip格式的创始者——菲利普·卡兹
2000年4月14日,在美国威斯康星州密尔沃基的一家汽车旅馆里,人们发现了一具年轻人的尸体,检查得知这个人的死因是酗酒、饮酒过量导致的死亡。死者被发现的时候,手中还握着一个空酒瓶,房间中还有五个空酒瓶。这样一个酒徒的死也许在平时只是地方小报上的一条不起眼的新闻,但这个人的死却在互联网上掀起了轩然大波。无数人在网上发表评论与 文章 ,纪念他的离开,寄托人们的哀思,因为他不是一个普通人,他叫菲利普·卡兹(Philip Katz),几乎全世界的每一台个人电脑上都有用他创造的压缩算法生成的文档,这种文档的后缀是“.zip”,这些文档的的开头都嵌有他姓名的字头缩写字母‘PK’。这位在全世界的电脑中留下痕迹的天才程序员终年仅37岁。

在DOS时代就开始使用电脑的玩家可能都会记得,那时候的处理器速度与存储介质的容量与现在相比简直不可同日而语,为了COPY(拷贝)一个游戏我们常常要更换数张软盘。从那个时候起,我们认识了ZIP文件,在没有Windows的年代,使用字符界面和命令行方式压缩的程序主要有PKZIP和ARJ两种,直到过渡到Windows时代,WinZip的出现才使压缩软件的规格得到了统一。互联网上无数的文件都以“.zip”的格式进行存储,压缩文件使用户能在最短的时间里将文件从网上下载回自己的硬盘中,在没有宽带,连MODEM都仅仅是14.4K的速率的那个年代,ZIP文件为我们节省了大量的宝贵时间与金钱。但很少有人知道ZIP文件的由来,很少知道它的创造者菲利普·卡兹。

在互联网刚萌芽之时,也就是公元1988年,那时候互联网还刚刚开始有了雏形,而最流行的是一种使用电话线拨号登陆别人在家里搭建的服务平台——交换信息的电子公告牌(BBS)系统。这种系统有些类似现在的论坛和新闻组,由于站长之间互相转信也成为了一个庞大的信息网络(惠多网)。老一点的玩家可能都有印象,在没有Internet的年代,中国大地上也曾有几十个这样的BBS存在,着名的字处理软件WPS的作者求伯君和CCED的作者朱崇君当年都是非常有名的个人站长。这种方式不但可以传递文本信息,也可以由用户上传文件到站点的计算机以供其他用户下载。由于电话线的接入速度慢的可怜,通过BBS传输较大文件实在是叫人痛苦的一件事。于是,使用文件压缩技术减小文件的体积并将多个文件压缩到一个封包中就成为了BBS用户的一项必须掌握的技巧。当时的美国BBS上,比较流行的是一种叫做ARC的压缩技术,由于它是一家商业公司开发的压缩技术,使用这种软件进行工作是需要付费的。那时候的菲利普·卡兹是一个沉迷于BBS上的毛头小伙,由于经常混迹于BBS上,对于ARC的收费非常不满的他自己开发了一个程序叫PKARC,这个程序于ARC完全兼容,可以压缩和解压缩ARC文件。这样一来,大批的ARC用户自然转而使用菲利普·卡兹的免费软件。ARC的制作公司一怒之下将菲利普·卡兹告上了法庭,法庭自然判决菲利普·卡兹禁止继续开发和传播PKARC。这种判决并没有磨灭菲利普·卡兹的斗志,而是激起了他要与ARC斗争到底的决心。在虚拟的世界中,自由、平等永远是真正的程序员永久的追求。他放弃了PKARC的开发,发誓要写出一款比ARC更好的压缩软件来打败ARC。这一场官司造就了一名编程天才的横空出世,也造就了一个后来在互联网时代的文件标准。几周以后,后来统治整个BBS世界乃至Internet世界的ZIP在菲利普·卡兹手中发出了第一声响亮的啼哭!

不鸣则已,一鸣惊人,这种名为PKZIP的程序可以将一个或多个文件压缩到一个后缀为“.zip”的文件中,无论从压缩比、压缩速度方面都超过了商业软件ARC。卡兹将PKZIP作为自由软件免费发放,使其如同草原上的星星之火般在全美的各大BBS上蔓延开来,用户以几何级数的增长,各大BBS的站长自发将原来使用ARC格式压缩的文件转换成ZIP格式,卡兹用他天才的头脑和顽强的毅力堂堂正正的击败了ARC,ARC的制作公司在PKZIP的强大攻势下很快就销声匿迹了。用自由软件打败商业公司的传奇 故事 很快传遍了整个BBS世界,疾恶如仇而又身手不凡的菲利普·卡兹如同数字世界的大侠般仗剑江湖,劫富济贫,以一人之力擎起了压缩软件的大旗。这段被人们津津乐道的传奇故事使菲利普·卡兹成为了很多热衷于编程的年轻人心中的偶像。此后卡兹一直继续着对PKZIP的开发和维护工作,PKZIP建立和统治了DOS时代的压缩标准。直到Windows的诞生,使用卡兹创造的压缩算法的软件Winzip的出现更使ZIP格式成为Internet的传输标准,ZIP压缩格式也成为压缩文档的事实标准。试问当今的电脑用户,谁敢说自己的电脑中没有ZIP文件?

可惜,这位天才程序员却从未在ZIP身上得到半点好处,坚持信念的结果往往是潦倒的生活,糟糕的个人生活和长期编写软件的巨大压力使卡兹染上了酗酒的恶习,最终断送了他那年轻的生命。他为世界贡献了一个伟大的免费软件,更为重要的是他缔造了一种大众化的压缩格式,然而却过早地离开了这个世界。他的名字也许多年后会被人们忘怀,但他创造的ZIP将在网上生生不息的流传,他的名字缩写嵌在了全世界数以千万的电脑中,他的传奇故事将永远流传……

看过“zip格式的创造者”的人还看了:

1. Linux如何添加zip压缩文件的操作命令

2. Win8怎么打开rar格式的文件

3. zip怎么解除密码

4. 怎么处理压缩打包OS文件

5. 常见的视频格式

6. ppt2010如何压缩文件

‘拾’ png格式的图片怎么样压缩,要求压缩后格式不变,图片质量损失小,要用到那些软件

png压缩大小可以用这个在线图片压缩工具,想把png图片文件的大小减到多少都行,比如你直接设置一下压缩数值到500Kb,马上瞬间就能把图片的文件大小压缩到500Kb搞定,你设定压缩到多少kb,他压缩完输出的图片就是多少kb,非常快捷。在线智能压缩图片大小,图片压缩体积

在线图片智能压缩使用步骤:

一、首先点击加号添加需要压缩的图片。目前已知支持对jpg、png等多种常见的图片格式进行压缩,如果上传图片并压缩成功,则代表支持该图片格式。
二、可以自行修改图片需要被压缩到的最大宽高尺寸,默认为图片原始的宽高尺寸,且宽高比例是自动锁定的。
三、必须设置图片被压缩后,期望输出的图片文件的最大占用空间。(必填项)
四、选择图片生成的算法。默认为混合优先算法,绝大多数情况下使用默认算法即可。
五、压缩的设定值不能小于1Kb,但图片压缩的最终效果可以小于1Kb。

butterpig

阅读全文

与硬核程序员压缩算法相关的资料

热点内容
美国所有恐怖露点电影 浏览:864
手机nfc刷全加密ic卡 浏览:775
51单片机24小时 浏览:880
数控左右r怎样编程 浏览:990
电影过时了能换票吗 浏览:349
php获取远程json 浏览:439
一个男的一个女的在河边被一箭射穿的恐怖电影 浏览:76
有部小说女主叫温暖 浏览:977
linux命令app 浏览:792
土方标高计算法 浏览:593
家教高级教程女演员叫什么 浏览:360
日本日本翻译汉语电影 浏览:491
言情动漫免费 浏览:40
安卓手机图像变黑白色了怎么办 浏览:279
linux查看用户和密码 浏览:976
穿书荒岛:女主把我奶上天小说 浏览:156
主角能看见别人气运的小说 浏览:577
求一个不用下载播放器的网址 浏览:686
免费在线国产小电影 浏览:544
尺度大的女同电影 浏览:371