数据压缩与霍夫曼编码
数据压缩能够实现是因为多数现实世界的数据都有冗余。无损数据压缩通常利用了统计冗余,这样就能更加简练地、但仍然完整地表示发送方的数据,如行程长度编码(Run-length encoding)、霍夫曼编码(Huffman coding)。而在很多情况下,数据会包含比必要的还多的信息。例如,一张分辨率过高的照片,其中的细节肉眼可能已无法识别。若舍弃这些人类无法察觉的细节,就可以用更小的数据量来提供与原始数据相差无几的感官体验,这属于有损压缩。
数据压缩能够实现是因为多数现实世界的数据都有冗余。无损数据压缩通常利用了统计冗余,这样就能更加简练地、但仍然完整地表示发送方的数据,如行程长度编码(Run-length encoding)、霍夫曼编码(Huffman coding)。而在很多情况下,数据会包含比必要的还多的信息。例如,一张分辨率过高的照片,其中的细节肉眼可能已无法识别。若舍弃这些人类无法察觉的细节,就可以用更小的数据量来提供与原始数据相差无几的感官体验,这属于有损压缩。
提到数据库索引,我们并不陌生,在日常工作中会经常接触到。比如某一个 SQL 查询比较慢,分析完原因之后,我们可能就会说『给某个字段加个索引吧』之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就一起来聊聊这个话题吧。
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务是在引擎层实现的。虽然 MySQL 是支持多引擎的系统,但不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。
假设你有个最简单的表 test,表里只有一个 id 字段,在执行 select * from test where id=3 这个查询语句时。我们只看到『输入一条语句,返回了一个结果』,却不知道这条语句在 MySQL 内部的执行过程。所以今天我想和你一起把 MySQL 拆解一下,看看里面都有哪些『零件』。
我们知道,数据结构和算法本身解决的是『快』和『省』的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是一个非常重要的考量指标。那如何来衡量你编写的算法代码的执行效率呢?这就是我们今天要介绍的内容:时间、空间复杂度分析。
因为 Java 代码到机器码之间还存在着字节码,所以 Java 语言的『编译期』其实是一段不确定的过程。它可能是指一个前端编译器把 *.java 文件转变成 *.class 文件的过程;也可能是指虚拟机的运行期编译器(JIT 编译器,Just In Time Compiler)把字节码转变成机器码的过程;还可能是指使用提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java 文件编译成机器码的过程。
JVM 在 new 一个对象的时候,会先查看对象所属的类有没有被加载到内存。如果没有的话,就通过类的全限定名来加载,等类加载完成之后,再创建对象。总的来说, new 一个对象可以分为两个过程:类加载和创建对象。