顺序表的查找
从前往后找
- 从第一个开始进行判断,对表中的元素和要查找的元素一一对应
- 但是在判断元素是否相等的同时,也要对其增加一个 if 语句的判断,用于判断是否已经检索到了表尾
- 但在顺序表的查找中一般是一定查找地到的,而且 if 判断语句又浪费了近一半的时间,故改进了算法的查找方式
从后往前找
- 首先要知道这种方式检索的顺序表的表头是空的。
- 从表尾的最后一个判断,在表头设置一个和即将要检索的元素一样的元素,因此每次只需要判断元素是否相等即可,不要需要判断检索的位置是否超出表长。
- 由上可知,最后一定会匹配成功。且在匹配的过程中省去了判断是否超出表长的语句。
- 和从前往后找的不同的地方在于,我们只需要检索最后匹配成功的位置是否是表头,若是表头,那么就表明表中不存在该元素;若不是表头,那就表明表中存在该元素。
有序表的查找
折半查找
- 如标题,折半查找的前提条件是表是有序的
- 折半查找的思想:在表头和表尾各设置一个指针(这里的指针是指位置的下标),分别为low和high。
- 同时再设立一个指针 mid ,mid 等于 mid=(high-low)/ 2+low (这里不直接是 mid =(low+high)/ 2 是防止low+high后数据溢出,产生负数。
- 这时候,1)若 mid 指向的数据比要检索的数据小,则令 low = mid ,继续执行检索;2)若 mid 指向的数据比要检索的数据大,则令 high = mid ,继续执行检索;3)若 mid 指向的数据等于检索的数据,则停止检索。4)若 high-low=1的话,停止检索,表示表中无此元素。
静态树表的查找
- 这个是根据数据出现的频率进行构建静态树表
- 具体思想类似于Huffman树的构造
- 遍历的时候用队列辅助,BFS遍历
索引顺序表的查找
- 组成结构:由一个索引表和一个顺序表组成。
- 在索引顺序表中,每一个索引对应一个块,即有多少个索引就有多少个块
- 其中,索引顺序表要求顺序存储,索引一一对应顺序表中的块
- 索引中存储的信息有:对应块的最大值、对应块的起始位置。
- 而在顺序表中的块,要求为:1)每个块中的数据可以是无序的;2)但是前一个块的最大值一定要小于后一个块的最小值。
- 查找时先对应查找索引表,继续查找顺序表中对应的块,其中,分成了 n^(1/2) 块平均查找的次数最少。