1. 一. 二分法的适用条件
      二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
      优点: 二分法查找效率特别高
      缺点: 二分法只适用于有序序列
  2.  
  3. 二. 二分法的主要思想是:
    设查找的数组区间为array[low, high]
    (1)确定该区间的中间位置k
    (2)将查找的值Tarray[k]比较. 若相等, 查找成功返回此位置, 否则确定新的查找区域, 继续二分查找.
    区域确定如下: 1) T < array[k] 由数组的有序性可知T < array[k,k+1,……,high], 故新的区间为array[low,……,k-1]
    2) T > array[k] 由数组的有序性可知T > array[low,……,k-1], 故新的区间为array[k,k+1,……,high]
    每一次查找与中间值比较, 可以确定是否查找成功,不成功则当前查找区间将缩小一半, 递归查找即可.
  4.  
  5. 三. 例题: 用二分法查找一个数是否在随机数列中
    1. 方法1(使用while循环):
  6.  
  7. 步骤1: 拿到一个有100个随机数的列表
  1. import random # 引入一个随机数模块
  2. def random_100(amount):
  3. li = []
  4. for i in range(amount): # 循环多少次就拿多少个随机数
  5. s = random.randint(0, 100)
  6. li.append(s)
  7. return li # 返回随机数列表
  8. lst = sorted(random_100(100)) # count=100 拿到由100个随机数组成的列表lst,并将其排序(默认为升序)
  1. 步骤2: 任意输入一个数(范围是0~100),查看它是否在随机数列表中
  1. n = int(input("请输入一个数:"))
  2. left = 0 # 左临界点left = 0
  3. right = len(lst) - 1 # 右临界点right = len(lst) - 1
  4.  
  5. while left <= right:
  6. mid = (left + right) // 2 # 索引只能是整数,因此用地板除
  7. if n > lst[mid]:
  8. left = mid + 1
  9. elif n < lst[mid]:
  10. right = mid - 1
  11. elif n == lst[mid]:
  12. print("你输入的数在这个列表中,它的位置是{}".format(mid))
  13. break
  14. else:
  15. print("你输入的数不在这个数列中")
  1. 2. 方法2: 使用递归函数
    步骤1:
  1. # 仍然引入随机数模块, 拿到一个随机数列表
  2. import random
  3. def random_100(amount):
  4. li = []
  5. for i in range(amount):
  6. s = random.randint(0, 100)
  7. li.append(s)
  8. return li
  9. lst = sorted(random_100(100))
  1. 步骤2:
  1. # 定义一个递归函数
  2. def func(n, lst):
  3. left = 0 # 左临界点
  4. right = len(lst) - 1 # 右临界点
  5. if left <= right:
  6. mid = (left + right) // 2
  7. if n < lst[mid]:
  8. new_lst = lst[:mid]
  9. return func(n, new_lst)
  10. elif n > lst[mid]:
  11. new_lst = lst[mid + 1:]
  12. return func(n, new_lst)
  13. else:
  14. print("你输入的数在这个列表中\n")
  15. return True
  16. else:
  17. print("你输入的数不在这个列表中\n")
  18. return False
  1. 步骤3:
  1. while 1:
  2. n = int(input("请输入你要查找的数:"))
  3. func(n, lst)
  1. 3. 方法3: 使用递归函数(方法2的优化)
  1. # 仍然引入随机数模块, 拿到一个随机数列表
  2. import random
  3. def random_100(amount):
  4. li = []
  5. for i in range(amount):
  6. s = random.randint(0, 100)
  7. li.append(s)
  8. return li
  9. lst = sorted(random_100(100))
  10.  
  11. # 定义一个递归函数
  12. def func(n, lst, left=0, right=None):
  13. if right == None:
  14. right = len(lst) - 1
  15. if left <= right:
  16. mid = (left + right) // 2
  17. if n < lst[mid]:
  18. right = mid - 1
  19. elif n > lst[mid]:
  20. left = mid + 1
  21. else:
  22. print("你输入的数在这个列表中,它的位置{}\n".format(mid))
  23. return True
  24. return func(n, lst, left, right)
  25. else:
  26. print("你输入的数不在这个列表中\n")
  27. return False
  28.  
  29. while 1:
  30. n = int(input("请输入你要查找的数:"))
  31. func(n, lst)

Python 利用二分法查询数据的更多相关文章

  1. python连接 elasticsearch 查询数据,支持分页

    使用python连接es并执行最基本的查询 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:92 ...

  2. 使用Connector / Python连接MySQL/查询数据

    使用Connector / Python连接MySQL connect()构造函数创建到MySQL服务器的连接并返回一个 MySQLConnection对象 在python中有以下几种方法可以连接到M ...

  3. python利用mongodb上传图片数据 : GridFS 与 bson两种方式

    利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊.性能方面的优劣未曾测试,无法进行评价 ...

  4. python 配合 es 查询数据

    1.python脚本 [root@do1cloud03 ~]# cat python-es.py #!/usr/bin/env python3 from elasticsearch import El ...

  5. 用python实现数据库查询数据方法

    哈喽,好久没来了,最近搞自动化发现了很多代码弯路,特别分享出来给能用到的朋友 因为公司业务的关系,每做一笔功能冒烟测试,我们就要对很多的数据库表中的字段进行校验,当时我就想反正总是要重复的运行这些SQ ...

  6. Python利用pandas处理数据后画图

    pandas要处理的数据是一个数据表格.代码: 1 import pandas as pd 2 import numpy as np 3 import matplotlib.pyplot as plt ...

  7. oracle 利用over 查询数据和总条数,一条sql搞定

    select count(*) over()总条数 ,a.*from table a

  8. python 利用pandas导入数据

  9. Python 单表查询数据

    import pymssql #引入pymssql模块# -----------------------------------------------------import pymssql #引入 ...

随机推荐

  1. APP支付宝登录--PHP处理代码

    1.首先需要参数: aucth_code  udid re_id极光推送id 2.https://open.alipay.com/platform/keyManage.htm 配置公钥私钥 3.需要s ...

  2. HTTP请求处理流程、IHttphandler、IHttpModule

    一.ASP.NET处理管道 Asp.net处理管道的第一步是创建HttpWorkerRequest对象,它包含于当前请求有关的所有信息. HttpWorkerRequest把请求传递给HttpRunt ...

  3. 双向绑定v-bind

    通过v-model绑定输出数据 <script> export default { data() { return { pagestyle:'https://v4.bootcss.com/ ...

  4. 通过德鲁伊druid给系统增加监控

    系统在线上运行了一段时间后,比如一年半载的,我们发现系统可能存在某些问题,比如执行系统变慢了,比如某些spring的bean无法监控各种调用情况. 触发到db的各种执行情况,这个时候,我们就需要一个工 ...

  5. PHP mysqli_error() 函数

    返回最近调用函数的最后一个错误描述: <?php  // 假定数据库用户名:root,密码:123456,数据库:RUNOOB  $con=mysqli_connect("localh ...

  6. JAVA中的getBytes()方法

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方 ...

  7. ODBC连接到400

    1.首先iSeries Client安装的时候要勾选ODBC , 这样才能找到Driver 2.某个Application是32位上,要用32位路径下的ODBC Administration打开,添加 ...

  8. 百度ueditor中复制word图文时图片转存任然保持灰色不可用

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...

  9. luoguP3366 【模板】最小生成树 x

    P3366 [模板]最小生成树 2.4K通过 6.3K提交 题目提供者HansBug 标签 云端↑ 生成树 难度 普及- 时空限制 1s / 128MB 题目描述 如题,给出一个无向图,求出最小生成树 ...

  10. 常用SQL之日期格式化和查询重复数据

    本文列举一些工作中常用的SQL,以提升工作效率. 1 日期格式化 使用 DATE_FORMAT(get_date, '%Y-%m-%d') 函数进行格式化.其中:get_date 是需要被格式化的字段 ...