zoukankan      html  css  js  c++  java
  • 二分查找法

    二分查找算法,是一种在有序数组中查找某一特定元素的搜索算法。

    注意两点:

     

    (1)有序:查找之前元素必须是有序的,可以是数字值有序,也可以是字典序。为什么

    必须有序呢?如果部分有序或循环有序可以吗?

     (2)数组:所有逻辑相邻的元素在物理存储上也是相邻的,确保可以随机存取。

      算法思想:

     搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,

    则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。

    这种搜索算法每一次比较都使搜索范围缩小一半。

      这里我们可以看到: 

    (1) 如果查找值和中间值不相等的时候,我们可以确保可以下次的搜索范围可以缩小一

    半,正是由于所有元素都是有序的这一先决条件

     (2) 我们每次查找的范围都是理应包含查找值的区间,当搜索停止时,如果仍未查找到,那么此时的搜索位置就应该是

     查找值应该处于的位置,只是该值不在数组中而已

      算法实现及各种变形:

     1. 非降序数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 

    2. 非降序数组A, 查找第一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 (类似:查找数组中元素最后一个小于val 

    值的位置) 

    3. 非降序数组A, 查找最后一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 (类似:查找数组中元素第一个大于val 值

    的位置) 

    4. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的任一位置

     5. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的第一个位置

     6. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的最后一个位置

     7. 非降序数组A, 查找任一个  值==val的元素,若找到则 返回一组下标区间(该区间所有值 ==val),若未找到则返回-1 

    8. 非降序字符串数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1(类似:未找到时返回应该插入点) 

    9. 循环有序数组中查找== val 的元素,若找到则返回下标位置,若未找到则返回-1

    【二分查找要求】:

    1.必须采用顺序存储结构

     2.必须按关键字大小有序排列。

     【优缺点】

    折半查找法的优点是比较次数少,查找速度快,平均性能好;

    其缺点是要求待查表为有序表,且插入删除比较困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

  • 相关阅读:
    持续集成-禅道
    nohup.out 日志切分
    Flannel 介绍及使用场景
    【Unity游戏开发】初探Unity动画优化
    fastHttp服务端处理请求的过程
    PHPExcel导出文件代码实现
    PHPExcel 1.8
    CKfinder 安装与使用
    Ckeditor的配置
    Ckeditor的使用
  • 原文地址:https://www.cnblogs.com/zxm1002/p/4714854.html
Copyright © 2011-2022 走看看