数据结构和算法-查找

根据某个关键字查找某个数据元素

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)

再次散列:还一种散列方式

链地址方:构建链表,存储头指针

公共溢出区:为冲突关键字建立的顺序表

猜你喜欢

转载自sosop.iteye.com/blog/2169577