【算法-查找】杂记

1.二分查找(折半查找)
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。

每次都与(low+high)/2进行比较

有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当折半查找值为82的结点时,____次比较后查找成功。

结果为 4次,分别和45、77、95、82进行比较
首先和中间值45比较,82比45大选择右边,右边六个数和中间值77比较,82比77大选择右边,右边3个数选择中间值95进行比较,82比95小选择左边,左边1个数和82比较相等 

折半查找一个有序表中不存在的元素,最多查找log2n+1次

public int bsearch(int[] data, int x, int y, int v) {
    int m;
    while(x<=y) {
        m = x + (y-x)/2; //2
        if(data[m] == v) return m; //3
        else if(data[m] > v) y = m-1; //4
        else x = m+1; //5
    }
}

2.二叉查找树

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树),也称有序二叉树(ordered binary tree),或已排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
任意节点的左、右子树也分别为二叉查找树。
没有键值相等的节点(no duplicate nodes)。
1.在一棵二叉查找树上,执行查找、插入、删除等操作,的时间复杂度为O(lgn)。
因为,一棵由n个结点,随机构造的二叉查找树的高度为lgn,所以顺理成章,一般操作的执行时间为O(lgn)。
//至于n个结点的二叉树高度为lgn的证明,可参考算法导论 第12章 二叉查找树 第12.4节。
2.但若是一棵具有n个结点的线性链,则此些操作最坏情况运行时间为O(n)。


3.

红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。

但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:

  1. 每个结点要么是红的要么是黑的。  
  2. 根结点是黑的。  
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。  
  5.  对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
    正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(log n)”这一结论成立的原因。

    在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。
    典型的用途是实现关联数组

    [java]TreeMap的实现是红黑树算法的实现


    4.AVL树(平衡二叉树(Balanced Binary Tree)
    1 .基本概念

    AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋。下面我们来看看:
    1.1 AVL树是什么?
    AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是:
    1. 本身首先是一棵二叉搜索树。
    2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
    AVL树具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。在平衡二叉搜索树中,我们可以看到,其高度一般都良好地维持在O(log2n),其各操作的时间复杂度(O(log2n))同时也由此而决定,大大降低了操作的时间复杂度。另外,最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列。


    5.平均查找长度ASL
    1.顺序查找:

    从表的一端开始,顺序扫描线性表,依次将扫描到的节点关键字和给定值k相比较。

    等概率条件下…平均查找长度:ASL = (n+….+2+1)/n= (n+1)/2。

    2.二分法查找:

    前提是线性表是有序表。假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

    在等概率条件下…平均查找长度:ASL =(1/n)* ( j * 2^(j-1) )(j是从1到h),ASL = log2(n+1)-1。

    原因:用二叉树来描述,树的高度d与节点树的关系为:n=(1+2+4+…… 2^(d-1))=2^d - 1;所以d = log2(n+1),每一层只需要比较一次,所以最多需要比较log2(n+1)次。

    3.分块查找:

    又称索引顺序查找,由分块有序(每一块中的关键字不一定有序,但是前一块中的最大关键字必须小于后一块中的最小关键字,即分块有序。)的索引表和线性表组成。例如把r【1….n】分为 b 块,则前 b-1 块节点数为 s = 【n/b】,最后一块允许小于或等于s。索引表是一个递增有序表。

    平均查找长度分为两部分,索引表的查找+块内的查找。(索引表能够用二分法和顺序查找,块内无序,所以只能用顺序查找)

    如果以二分查找来确定块,则 ASL = log2(b+1)-1 + (s+1)/2。

    如果以顺序查找来确定块,则 ASL = (b+1)/2 + (s+1)/2。

    如果以哈希查找来确定块,则ASL=1 + (s+1)/2。


    6.单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。


    7.折半查找最坏的情况下查找log(n)+1次,而二叉查找树最坏的情况是查找n次(最坏时二叉排序树退化为单枝树,只能从根开始一层一个查找,实质变为顺序查找)。


    8.分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
      方法描述:将n个数据元素”按块有序”划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须”按块有序”;即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……。
      操作步骤:
      step1 先选取各块中的最大关键字构成一个索引表;
      step2 查找分两个部分:先对索引表进行二分查找或
      顺序查找,以确定待查记录在哪一块中;

      然后,在已确定的块中用顺序法进行查找。


    9 . 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
    1、定义一个解空间,它包含问题的解。
    2、利用适于搜索的方法组织解空间。
    3、利用深度优先法搜索解空间。
    4、利用限界函数避免移动到不可能产生解的子空间。
    问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。


    10
    .静态查找表(Static Search Table):只作查找操作的查找表;

    动态查找表(Dynamic Search Table):在查找过程中同时插入不存在的元素,或者是删除已经存在的元素。表结构是在查找过程中动态生成的,通俗解释,对于给定key,若表中存在某关键字与key相等则查找成功返回,若未找到则插入关键字等于key的记录。

    静态查找主要有3种:顺序查找、折半查找、分块查找(索引顺序查找)
    动态查找结构包括:最基本的二叉排序树(二叉查找树、二叉收索树)、二叉平衡树(AVL树)、红黑树、以及一些多路查找树(B+,B-树)。


    11.
    顺序查找 查找失败的情况下,无序表查找需要更长,
    举例:
    有序:1 2 3 5 6 7 8 无序:3 2 1 5 6 7 8
    当查找4时,有序表只要查到5就可以退出查找,而无序表则需全部遍历


    12.BFPTR算法-详细
    求前K大的或者前K小的元素,实际上有一个比较好的算法,叫做BFPTR算法,又称为中位数

    的中位数算法,它的最坏时间复杂度为,它是由Blum、Floyd、Pratt、Rivest、Tarjan提出。

    该算法的思想是修改快速选择算法的主元选取方法,提高算法在最坏情况下的时间复杂度。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值