查找:根据某个给定的值,在查找表中确定一个关键字等于给定值的记录。
主关键字:可以唯一标识一条记录的关键字。(一条关键字对一套记录)
次关键字:可以识别多条记录的关键字。(一关键字对多条记录)
查找表分为:静态查找表和动态查找表。
静态查找表:只查找,不插入、删除、更新。表记录不会改变,因此为静态。静态查找表因为其表静态,因此可以用连续的数据结构进行排序,有序查找。
动态查找表:需要插入、更新、删除。表记录会改变,因此为动态。动态查找表因为需要更改表记录,需要用链式结构,树形结构进行存储,方便增删或更改表记录。
顺序查找:又称线性查找,从第一个到最后一个记录,逐个进行记录的关键字和给定值进行比较。
有序查找,当查找表已经按照关键字进行有序排列,查找效率会更高。有折半查找(从中间分半,每次可以减少一半范围)、插值插值(将折半的计算公式改进,从而提高超找效率)、斐波那契查找(折半查找从中间分,使用斐波那契公式,可以更快的减小查找范围和次数,提高效率)。
索引查找:当数据量较大时,要让所有记录按照关键字排序之后再查找,代价是非常高的。索引查找,即让索引(关键字)映射并关联记录。因此可以对索引进行查找,再通过索引映射到记录上。
稠密索引:让索引有序排列,再用有序查找的方法找到索引,再映射到记录中。
分块索引:稠密索引的索引项与记录个数相同,空间代价大,因此出现分块索引。将记录分成若干块,块内无序,块间有序(索引是有序的)。每个索引项包含:最大关键字、快中记录个数、指向块的指针。
倒排索引:一关键字对多记录,即建立一个次关键字对记录的索引表。因为由属性值确定记录位置,因此成为倒排索引。搜索引擎方式。
二叉排序树:因为有序,插入删除的操作需要找位置,付出代价。二叉排序树为非线性(链式)结构,有利于插入和删除。如果线性结构,需要将插入或删除位置之后的记录全部移动。二叉排序树的删除操作需要考虑:删除的是叶子,删除的只有左、右子树,删除的即有左又有右子树三种情况。
平衡二叉树:二叉排序树查找最坏情况取决于树的深度,因此输的深度(形状)决定二叉排序树查找的效率。平衡二叉树是左右子树高度最多相差1.平衡因子BF(Balance Factor)是左子树深度减去右子树深度,是平衡二叉树调整平衡的基础。最小不平衡树:离插入点最近,且平衡因子绝对值大于1的节点为根的子树。平衡二叉树调整平衡:最小平衡树BF与他的子树BF符号相同时,最小平衡树BF大于1右转,小于-1左转;当最小平衡树BF跟他的子树BF符号相反时,需要反向旋转一次,使之同号,再进行相应的旋转完成平衡调整。
多路查找树:二叉树,每个结点存储一个元素,并且结点最多有两个子树。当元素非常多时,树的结构非常庞大。多路查找树,即为每个结点存储多于一个元素,并且多于两个子树。
2-3树:每个结点要么存储一个元素有两个子树,要么存储两个元素有三个子树。所有叶子在同一层次上(平衡)。插入删除操作,有连锁反应,操作复杂。
2-3-4树:情况类似2-3树。
B树:一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。及诶单最大的孩子数目为B树的阶。B树是为内外村数据交互准备的。将少量的数据放入内存,查找大量的磁盘数据。子树个数=存储的元素个数+1.
B+树:B树遍历记录需要在上下两层之间往返,如果上层存储在内存,下层在外存(硬盘),遍历不方便。B+树,每个叶子结点都会保存一个指向后续叶子的指针,并且每个叶子可能保存上一层元素(上层存储的元素,在叶子上再次存储,方便遍历)。
散列表(哈希表)查找:给个散列函数(Hash函数),将记录位置跟他的关键字建立一个确定的对应关系f(Key)。将记录散列存储在一块存储空间中。设计一个简单、均匀、存储利用率高的散列函数是技术关键。并且要解决冲突(key1 != key2,但f(key1)=f(key2))。散列函数有,直接定址法、数字分析法、平法取中法、折叠法、除留余数法、随机数法等。处理冲突的方法有,开放定址法(冲突找下一个空地,容易堆积)、再散列函数法(冲突再换个散列函数)、链地址法(冲突弄个链表插入后边)、公共溢出区法(所有冲突统一在一块区域顺序安放)。散列表,通过散列函数查找出关键字对应的记录位置,性能最好,回避了关键字之间反复比较,对于查找记录稿,记录之间无要求的数据非常适用。