数据结构跟算法-查找
根据某个关键字查找某个数据元素
1.线性查找
遍历所有元素,优化策略是减少比较次数,复杂度O(n)
2.有序表查找
1).二分查找O(logn)
public static int binarySearch(int k, int[] arr) { int high = arr.length - 1; int low = 0; int mid; while (low <= high) { mid = (low + high) / 2; if (k == arr[mid]) { return mid; } else if (k > arr[mid]) { low = mid + 1; } else { high = mid - 1; } } return -1; }
3.线性索引查找
稠密索引:将数据集中的每一个记录对应一个索引项,索引按关键码有序排列
分块索引:快内无序、块间有序,块中最大关键字,块中的记录数,块的首地址
倒排索引:次关键码、记录号
4.二叉排序树
left-child < parent < right-child
二叉树的删除,删除叶子或只有右子树或只有左子树的情况补上就行,但是既有左子树又有右子树的情况,找到被删除节点的直接前驱或直接后继替还被删除节点。
中序遍历,复杂度O(logn),考虑树变成了链表的情况O(n)
5.平衡二叉树:二叉排序树但是左子树和右子树高度差1
找出最小不平衡子树,计算每个节点的平衡因子BL,> 1进行右旋, < -1进行左旋
6.多路查找树(B树)
每一个节点的孩子可以多于2个,每个节点可以存储多个元素
2-3:每个节点2个孩子或3个孩子
2节点:一个元素2个(或没有)孩子
3节点:一大一小2个元素3个(或没有)孩子
2-3-4:对2-3树的扩展,多了4节点3元素
BTree:平衡多路查找树,节点最大的孩子为BTree的阶
B的阶数与硬盘大小相匹配,与磁盘页面进行多次访问
B+Tree:分支出现该元素则作为该分支下的叶子节点,每一个叶子节点保存的后一个叶子节点指针
7.散列表O(1)
适合查找和给定值相等问题
要求:简单、均匀、存储利用率高
直接定址、数字分析、平方取中、折叠法、取模、随机数
处理冲突的方法:
开放定址:寻找下一个 fi(k) = (f(k) + di) % m,线性探测,二次探测:di^2,随机探测:random(di)
再次散列:还一种散列方式
链地址方:构建链表,存储头指针
公共溢出区:为冲突关键字建立的顺序表