查找表(look-up-table)这个名字很好听,缩写 LUT,听起来很高端,其实是一种很简单高效的索引操作,今天简单介绍一下。

是啥

wiki定义:


a lookup table is an array that replaces runtime computation with a simpler array indexing operation


翻译一下:

查找表就是一个数组,用来替代计算,加速查询的索引操作。

举个例子,以前我们算对数基本都需要计算器,很多时候数学考试不让带计算器,只给你一个表来查,最大的优点就是节约时间。

查找表(Lookup table)_算法

计算机中很多概念都是来源于生活。因此把这种需要复杂计算的操作提前计算好,保存到一个数组里,用的时候不需要重新计算,直接查表,这就是查找表,典型的以空间换时间。

举一个在数组查询中用到的例子:

查找表(Lookup table)_算法_02

首先看第二行,我有一堆01数字的数组,在这个数组上的需要执行一个操作:查看某个位置之前有几个1。没有额外结构时,每次给一个位置,就需要从开头遍历,逐个判断是不是 1,时间复杂度O(N)。

下面引入第一行的查找表。提前将数据按固定长度分组,这里 5 个一组,并计算每组的起始位置之前有几个 1。这样,再给我一个下标 n=11,可以先计算 下取整(n/5)=2 ,然后找到查找表位置为 2 的值为 7,再从原始数组上查找 下标从 2*5=10 到 11位置,共有 1 个 1。这样,总的返回值就是 8 。

通过这样一个简单的查找表,将这个操作的时间降为了常数项。

基本原理就是这!

总结

查找表本质上是用 “预计算+空间” 换取 “时间” 的一种索引技术,效率很高。如果程序中有经常需要重复计算操作,且结果的空间占用不大,可以考虑使用查找表替换掉。查找表(Lookup table)_leetcode_03