本文介绍 JPEG 编解码过程(附简单的cpp
实现)。JPEG 中常用到的熵编码是变长编码:Huffman 编码,本文也对算术编码(附cpp
实现)、LZW 编码(附py
实现)两种熵编码进行介绍。
你永远流淌在我的记忆里?River flows in you
No results found
本文介绍 JPEG 编解码过程(附简单的cpp
实现)。JPEG 中常用到的熵编码是变长编码:Huffman 编码,本文也对算术编码(附cpp
实现)、LZW 编码(附py
实现)两种熵编码进行介绍。
加密方法可以分为两大类:一类是对称密码体制,又称单钥或私钥密码体制(private key cryptography);还有一类是非对称密码体制,也称双钥或公开密钥体制(public key cryptography)。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码。
在单钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要,一旦秘钥泄露,密文也就被破解了;在双钥加密的情况下,秘钥有两把,一把是公开的公钥,还有一把是不公开的私钥,公钥与私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。此外,①同时生成公钥和私钥应该是相对比较容易的:所有的公钥、私钥对都不同,用公钥可以解开私钥加密的信息,反之用私钥也可以解开公钥加密的信息;但是②从公钥推算出私钥,应该是很困难或者是不可能的。
目前,通用的单钥加密算法有 DES(Data Encryption Standard),通用的双钥加密算法为 RSA(Rivest-Shamir-Adleman),本文主要介绍三种常用的单钥加密算法:DES、3DES(Triple DES) 以及 AES(Advanced Encryption Standard)。
一些计算机程序设计中常用的线性数据结构:Array
、ArrayList
、LinkedList
、List
、Stack
、Queue
、Hashtable
和Dictionary
。为了更高效的进行数据的查找和访问,例如避免普通数据查找的 $O(N)$ 线性时间复杂度,常用树这种数据结构保存数据。
树(Tree)是由多个节点(Node)的集合组成,每个节点又有多个与其关联的子节点(Child Node);子节点就是直接处于节点之下的节点,而父节点(Parent Node)则位于节点直接关联的上方;树的根(Root)指的是一个没有父节点的单独的节点。所有的树都呈现了一些共有的性质:①只有一个根节点;②除了根节点,所有节点都有且只有一个父节点;③无环。将任意一个节点作为起始节点,都不存在任何回到该起始节点的路径(正是前两个性质保证了无环的成立)。
更高效同时也相对更加复杂的树型数据结构包括 BST(二叉查找树)、R-B Tree(红黑树)、AVL Tree(平衡二叉树:父节点的左子树和右子树的高度之差不能大于1)、Treap(树堆:满足①二叉查找树的性质;满足②堆的性质)、Splay Tree(伸展树:在一次搜索后,会对树进行一些特殊的操作,这些操作的理念与AVL树有些类似,即通过旋转,来改变树节点的分布,并减小树的深度;伸展树并没有AVL树的平衡要求,任意节点的左右子树可以相差任意深度)、B-Tree(B树:多叉平衡查找树,B$^{+}$-Tree(B+树)是B树的变体)等。
本文主要介绍基础的 BST(二叉查找树)以及提升搜索效率的更高级的数据结构:R-B Tree(红黑树)。
1 | // 定义(定义性声明) |
extern int x;
只是告诉编译器变量x
是整型,已经在其它地方定义了。 本文是关于C/C++语言中常见的五个修饰符:static
、const
、extern
、inline
、volatile
的含义和用法,在阅读本文前,建议先通过《声明/定义/初始化/赋值》了解有关C/C++中定义、声明等概念以及变量声明和定义的区别。
size
的一维向量,二位向量1 | vector<what-type> var-name(what-size); |
1 | int rowSize = ?; |