静态查找表:

1.顺序查找表:从线性表一端开始扫描,将扫到的关键字与给定值比较,相同则查找成功

2.有序表查找:若线性表有序,则可以折半查找。折半查找升级版为插值查找,及不取1/2处。斐波那契查找,也是折半查找的变种

3.索引顺序表查找:效率介于1)2)之间。又称分块查找。块与块之间有序,块内无序。实际进行两次查找,第一次折半查找,第二次顺序查找

动态查找表:相比于静态查找表,查找过程中会修改元素

1.构造查找树:

  二叉查找树:

  1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  3)任意节点的左、右子树也分别为二叉查找树。

  4)没有键值相等的结点

  23树:二叉查找树的升级版:往三结点插入元素需要将三节点裂成二结点

  红黑树:是23树的简化版,红链链接3node黑链链接2node,查找方法同一般二叉查找树

  b树:堆23树的进一步升级

    m阶B树的定义如下:

    1. 根节点至少包括两个孩子;

    2. 树中每个节点最多含有m个孩子(m>=2);

    3. 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子(ceil()为向上取整);

    4. 所有叶子节点都位于同一层;

    5. 每个非叶节点包括n个关键字信息,其中ceil(m/2)-1<=n<=m-1。

  b+树:与b树相比主要区别在于只有叶结点存放信息,非叶结点只起索引作用。所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历

    B+ 树的优点在于:

    1.由于B+树在内部节点上不好含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子几点上关联的数据也具有更好的缓存命中率。

    2.B+树的叶子结点都是相链的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元

    素可能在内存中不相邻,所以缓存命中性没有B+树好。

    B树也有优点:由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。

hash查找:

    构造哈希函数:  

    1)直接定址(整型)

    2)数字分析法

    3)平方取中法

    4)取余法

    5)折叠法:将关键字分块折叠 

    6)减去法:关键字减特定变量

    7)基数转化法:关键字变为其他进制

    8)伪随机数法:用伪随机函数

    冲突的处理:

    1)开放地址法:

    线性探测法:若重复,在哈希表中遍历空缺位置并插入。缺点:①会堆聚,即冲突比较频繁的话哈希表就会乱②如果删除元素会导致计算机以为一定找不到对应元素③处理溢出不方便

    线性补偿探测法:线性探测法的改进,遍历时步长不选一,选为n

    伪随机探测:另一种改进方法,步长由伪随机函数确定

    2)链地址法:

    

    3)再哈希法:有冲突时再哈希一次,一直到无冲突

    4)建立公共溢出区:将所有有冲突的放在哈希表外,为其建立公共溢出区

posted on 2017-12-05 15:23  nilknow  阅读(4069)  评论(0编辑  收藏  举报