数据结构(查找)

来源:互联网 发布:淘宝怎么装修店铺视频 编辑:程序博客网 时间:2024/05/18 09:18

查找概念:指在某种数据结构中找出满足给定条件的元素。分为内查找和外查找。若查找过程都在内存中进行,被称为内查找;若查找过程中需要访问外存,则称为外查找。

线性表的查找
1)顺序查找,直接for循环遍历。
2)二分查找

public class Search {    public static void main(String[] args) {        int[] a={1,2,3,4,5,6,7,8,9};        int x=6;        System.out.println(binSearch(a,x));    }//非遍历    public static  int binSearch(int[] a,int x){        int low=0;        int high=a.length-1;        int mid;        while (low<=high){            mid=(high+low)/2;            if(a[mid]==x){                return  mid;            }if(a[mid]>x){                high=mid-1;            }else {                low=mid+1;            }        }        return  -1;    }}

3)索引查找,(关键字,地址)关键字唯一标识一个节点,地址指向该关键字对应结点的指针,也可以是相对地址。
缺点:为了建立索引表而真加时间和空间的开销
4)分块查找,性能介于顺序查找和二分查找。每一块的大小顺序排列,块内的关键字不一定有序。

2.数表查找
二叉树查找
二叉排序树又称二叉查找树:空树或者满足
(1)左子树,小于根节点(2)右子树,大于根节点(3)左右子树又是二叉排序树
中序遍历的二叉排序树是一个递增的序列。
查找相当于二分查找。
插入,删除和查找的评价时间都为log2n。最坏为n。
平衡二叉树
左右子树的高度最多相差为1.
b-树
b-和b+树都是外部查找的数据结构,数据存放在外存中。
b-多路平衡查找树。b-树中所有节点的孩子节点最大值为b-树的阶。
一颗m阶的b-树是一颗空树,或者满足
(1)树中每个结点至多有m个孩子结点
(2)除根结点外,其他结点至少有m/2个孩子节点。
(3)若根结点不是叶子结点,则根节点至少有两个孩子节点
(4)所有叶子结点在一层
(5)结点结构,开始n表示该结点的关键字有几个。
b+树
(1)每个分支结点至多有m棵子树。
(2)除根节点外,其他每个分支结点至少有m/2棵子树。
(3)根节点或者没有子树,或者至少2棵子树。
(4)有n棵子树的节点有n个关键字。
(5)所有分支结点中,仅包含它的各个子节点中最大关键字及指向子节点的指针。
(6)叶子节点关键字按大小顺序链接。
叶子节点包含全部关键字,所有非叶子节点只是起到索引作用,b-树关键字对应一块存储地址,b-树叶子节点和非叶子节点的关键字不重复。
查找方式:1.最小关键字开始顺序查找。2.b+树的根节点开始进行随机查找。
mysql采用的是b+树索引。

哈希表查找
哈希表又称散列表,目标是使得哈希地址尽可能均匀的分布在n个连续内存单元地址上。
hashMap的冲突,为hashcode冲突。
哈希函数构造方法
4.1 直接定址法 h(k)=k+c,不可能有冲突。
4.2 除留余数法 h(k)=k mod p (p<=m)
4.3 数字分析法
哈希冲突的解决办法
4.4 开放定址法:以冲突的地址为自变量,通过某种哈希冲突得到新的空闲的哈希地址。
4.4.1 线性探查法 根据函数找到新的地址
4.4.2 平方探查法 平方函数
4.5 拉链法(hashMap 冲突的解决办法)
用单链表把冲突的词链接起来。
优点:(1)简单,无堆积现象,平均查找长度短。
(2)链表记录动态生成,适合造表前无法确定表长的情况。
(3)不会浪费空间
(4)删除简单
缺点:需要额外的空间,记录较少不适合