1.顺序表的查找
顺序查找:从指定位置,一般为最后一位(第0个位置设置为监视哨)从后向前比较,直到找到与该值相等或失败
时间复杂度为o(n)
public int seqsearch(int[] a,int b){ for (int x = 0;x<a.length;x++){ if (a[x] == b){ return x; } } return -1; }
二分查找:若顺序表为有序表,则可以从一半的位置进行查找 。时间复杂度o(log2[n])
public int binarysearch(int[] a,int b){ int low = 0; int high = a.length - 1; while (low<=high){ int mid = (low+high)/2; if (b == a[mid]){ return mid; } else if (b>a[mid]){ low = mid + 1; }else { high = mid - 1; } } return -1; }
2.索引表的查找
索引表:将原表分为若干块,各块内部不一定有序,但表中的块是分块有序的,抽取各块中最大的关键字及其起始位置建立索引表。
顺序查找:先顺序查找索引确定块,再在块中顺序查找 -> n(1/2)
二分查找:索引表中采用二分查找,块中采用顺序查找 -> log2(n)
树组织查找:二叉排序树,B树的查找算法(见树的数据结构章节)
3.散列表的查找
散列表:通过散列函数,建立存储位置与关键字之间的关系
扫描二维码关注公众号,回复:
921387 查看本文章
冲突的解决:开放地址法(形成一个探测序列,沿此序列逐个对地址进行检查)
再散列法(再用新的散列函数形成地址)
链地址法(将关键字发生冲突的记录存储在同一个线性链表中)
公共区溢出法(另设溢出表)
查找:根据构造表时所用的散列函数求散列地址。再根据设定的冲突处理方法寻找下一地址。
效率:和n无关的函数,无论n取什么值,总可以找到一个合适的装填因子将平均查找长度限定在一定的范围内。