查找算法的定义是什么?维基百科的解释为:a search algorithm is an algorithm for finding an item with specified properties among a collection of items(20150327)。
既然已经知道了查找算法的定义(未找到对查找算法的权威定义,因此使用维基百科的定义),那么如何能够得到一个快速的查找算法?这要求我们知道查找的本质。
在百度百科中,对查找的定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找(20150327)。
定义中并没有给我们说明查找的本质是什么,它只是从结果上反推出了查找这个词的意义。查找是一个过程,一个用于从一群元素中得到带有特定属性元素的过程。那么这个过程是如何进行的?很明显,这个过程是通过对比验证来进行,也就是说这个过程实际上是一个去掉不符合给定属性元素的过程。那么很自然的,也就能得到查找的本质-去掉不符合给定属性的元素。
根据这个本质可以知道,从n个数据元素中得出指定元素的最快查找算法是一次比较就能够去掉n-1元素(0次就能够去掉的不切合实际,不考虑)。也就说,如果说我们需要一个规则来确定这个算法是不是高效的查找算法,那么就可以看它一次比较能够去掉的元素个数。
穷举,最简单粗暴的查找算法,就是从元素集中把元素一个个拿出来,将其属性与给定的属性对比,以决定是否是需要的元素。由于其一次最多只能过滤掉一个元素,因此,其效率最低。
二分查找,其一次比较最多能过滤掉总数量一半的元素。因此其效率相比穷举,好了很多。
n叉树,一次比较最多能过滤掉(n-1)。因此相比二分查找又要好,更进一步。
理想hash表,由于一次比较必定能够过滤掉(n-1)个元素。因此其效率最高。
从上面的理解可知,查找算法一般都可归为n叉树。当树的分支为1时,查找所用算法为穷举。当树的分支为n时,查找所用算法为理想hash表。