算法图解(二分查找)

前言:

今天是第一篇 以后尽量每天写 看具体时间安排吧 目前一边学Python、Java、Go还有算法 所以写的比较少

主要是Python一天差不多16小时吧 Java、go看时间安排 这次算法全是用Python演示的 不懂Python的也没关系

或者可以看一下我前面的帖子

算法是什么:

算法是一只组完成任务的指令  要么速度快、要么能解决问题

应该说是为实现某些目的的逻辑 以及 思想 的代码

二分查找

假设你要查找电话本里k开头的人 里可能会直接滑动到中间 因为你知道k在中间位置

因为电话本是abcdef排序的嘛

定义:

二分查找就指从中间开始查找的逻辑做法

注:

# 二分查找必须是有序序列  返回其位置

# 无序无法进行二分查找   返回null

例如:

二分查找:

  利用二分查找每次取中间数 有小数可以向上或向下取整数

  100以内的数字   最多7次可以找出来

普通查找:

  而普通查找则是从头到位遍历最好的情况是1 一次找出

最差是100次

二分查找随着元素的增加并不会改变太大

普通查找则会随元素的增加而增加

比如说一个字典内有240000个单词

普通查找最差情况:240000次 出结果

二分查找最差情况:17次出结果

这就很明显的突出了二分算法的优势

####这里我用()括号里的数字代表log的下标

用二分查找最多需要log(2)n步

其实就是利用对数运算:

对数运算:

定义: 幂运算的逆运算

例如:

10**2 = 100      log(10)100 = 2

10**3 = 1000    log(10)1000=3

2**5 = 32          log(2)32 = 5

如果有8个元素 你最多需要查找3次   因为long8 = 3(2**3=8)

1024个元素  最多需要 检查10个元素  因为 1024 = 10(2**10=1024)

def binary(lst, item):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = round((low + high) / 2)
        guess = lst[mid]
        if guess == item:   # 猜对了
            return mid
        if guess > item:
            high = mid - 1  # 猜大了
        else:
            low = mid + 1   # 猜小了
    return None

my_list = [1, 3, 5, 7, 9]
print(binary(my_list, 3))    # 1 返回的元素下标  索引是0开始的
print(binary(my_list, -1))   # None   因为不存在-1元素

运行时间:

  线性时间(linear time)

      100个数字最多猜100次  40亿猜40亿次  最多猜的次数等于列表的长度

  对数时间(或log时间)

    100个数字最多猜7次  40亿猜32次

大O表示法:

    简单查找每个元素 需要n次 运行时间为O(n)

   二分查找 运行时间为O(log(n))

大O表示法计算的是操作数

  O(log n) 对数时间  包括二分查找

  O(n)  线性时间

  O(n * log n)快速排序算法

  O(n**2)速度较慢排序法算法

  O(n!)非常慢的算法

小结:

  二分查找比简单查找快的多

   O(log n)比O(n)快,需要搜索的元素越多,前者比后者就快的越多

  算法运行时间并不以秒为单位

  算法运行时间是从其增速的角度度量的

  算法的运行时间用大O表示法表示

原文地址:https://www.cnblogs.com/ParisGabriel/p/9417052.html

时间: 2024-08-07 10:38:05

算法图解(二分查找)的相关文章

查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找. 查找算法通常需要两个输入: 1.被查找的序列 2.要查找的关键词 查找算法的输出参数和返回值: 1.返回类型为 Error_co

【数据结构与算法】二分查找

基本思想 首先将给定的值K与表中中间位置元素比较,若相等,则查找成功:若不等,则所需查找的元素只能在中间数据以外的前半部分或者后半部分,缩小范围后继续进行同样的查找,如此反复,直到找到为止. 代码实现 /** * 源码名称:BinarySearch.java * 日期:2014-08-14 * 程序功能:二分查找 * 版权:[email protected] * 作者:A2BGeek */ public class BinarySearch { public static int binaryS

算法系列&lt;二分查找&gt;

二分查找又称折半查找,是针对有序顺序表的查找,前提:数据是顺序存储的,已经按照关键词进行升序排序.查找成功返回索引值,查找不成功返回-1. 下面用java来实现二分查找算法: /** * 二分查找:针对已排好序的序列,查找成功返回所在位置的索引值,查找不成功返回-1 * 查找的最好时间复杂度:O(1),最坏时间复杂度O(logN),平均时间复杂度:O(logN) * 测试case: * case1:{1} 查找1 * case2:{1} 查找2 * case3:{} 查找1 * case4:{1

算法学习——二分查找(折半查找)

算法学习--二分查找 注意点 1. 二分查找的前提是有序的数组 2. 建议使用[start,end)的区间寻找,符合规范 3. 使用的是递归法 递归的人口 private static int find(int[] temp, int x) { //如果要查找的数x比数组的最后一个数要大,则找不到数值,返回-1 if (x > temp[temp.length - 1]) { return -1; } return find(temp, 0, temp.length, x);//进入递归 } 递

常见算法之二分查找

1.算法思想 二分查找采用分而治之的思想.要求被查找的集合必须是有序的.主要思路: 根据起始位置和结束位置,确定中间位置. 拿目标值与中间位置的值做比较,假如目标值大于中间位置取值,则起始位置为中间位置加1. 假如目标值小于中间位置取值,则结束位置为中间位置减1. 直至起始位置小于等于结束位置,找到目标值的位置即索引. 2.代码实现 2.1.基于Python3.x实现 代码如下: 1 #coding:utf-8 2 def half_search(lst,key): 3 start = 0 4

数据结构与算法之二分查找

问题:如果有一个有100个元素的已经排好序的数组,然后给你一个数,让你判断这个数组里面是否有这个数,你该怎样去做? 最简单的方法就是从数组的第一个元素开始,逐一与所给的数比较,直到比较完所有数组的元素为止,这种查找方法叫简单查找,是一个费事的方法.但我们想,既然这100个数都已经排好序了,那么我先拿中位数与所给数比较,如果两者匹配则问题解决.如果中位数比所给数大,那么所给数可能存在与中位数左边,我们就可以拿左边那些数的中位数与所给数比较:如果中位数比所给数小,那么所给数可能存在与中位数的右边,我

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

算法_001_二分查找算法

 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:     1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>

python算法之二分查找

说明:大部分代码是在网上找到的,好几个代码思路总结出来的 通常写算法,习惯用C语言写,显得思路清晰.可是假设一旦把思路确定下来,并且又不想打草稿.想高速写下来看看效果,还是python写的比較快.也看个人爱好.实习的时候有个同事对于python的缩进来控制代码块各种喷....他认为还是用大括号合适...怎么说呢,适合自己的才是最好的.我个人的毛病就是,写了几天C,到要转到python的时候,代码中依旧有C的影子..比方大括号问题,比方忘记在while或这for.if.else等后面加":&quo

二分算法入门——二分查找

二分查找,无论是从名字还是理论都十分简单一个算法,其博大精深,简直恐怖.Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码. 别人不知道,反正我早上是写了好久,这个查找算法,将查找的复杂度从 o( n ) 降到了 o( logn ) ,当之无愧的的好算法,更是许多高级算法的优化策略之一. 二分查找之基本思路 虽然二分查找是一个很吊的算法,但是跟很多算法一样,需要使用的基础条件——序列有序! 先假设一个单调非增序列:1 2 3 4 5 6 ,求找到3的位置,地球人都会马上这么