一. 二分法的适用条件
  二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
  优点: 二分法查找效率特别高
  缺点: 二分法只适用于有序序列 二. 二分法的主要思想是:
设查找的数组区间为array[low, high]
(1)确定该区间的中间位置k
(2)将查找的值T与array[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]
每一次查找与中间值比较, 可以确定是否查找成功,不成功则当前查找区间将缩小一半, 递归查找即可. 三. 例题: 用二分法查找一个数是否在随机数列中
1. 方法1(使用while循环): 步骤1: 拿到一个有100个随机数的列表
import random   # 引入一个随机数模块
def random_100(amount):
li = []
for i in range(amount): # 循环多少次就拿多少个随机数
s = random.randint(0, 100)
li.append(s)
return li # 返回随机数列表
lst = sorted(random_100(100)) # count=100 拿到由100个随机数组成的列表lst,并将其排序(默认为升序)
步骤2: 任意输入一个数(范围是0~100),查看它是否在随机数列表中
n = int(input("请输入一个数:"))
left = 0 # 左临界点left = 0
right = len(lst) - 1 # 右临界点right = len(lst) - 1 while left <= right:
mid = (left + right) // 2 # 索引只能是整数,因此用地板除
if n > lst[mid]:
left = mid + 1
elif n < lst[mid]:
right = mid - 1
elif n == lst[mid]:
print("你输入的数在这个列表中,它的位置是{}".format(mid))
break
else:
print("你输入的数不在这个数列中")
2. 方法2: 使用递归函数
步骤1:
# 仍然引入随机数模块, 拿到一个随机数列表
import random
def random_100(amount):
li = []
for i in range(amount):
s = random.randint(0, 100)
li.append(s)
return li
lst = sorted(random_100(100))
步骤2:
# 定义一个递归函数
def func(n, lst):
left = 0 # 左临界点
right = len(lst) - 1 # 右临界点
if left <= right:
mid = (left + right) // 2
if n < lst[mid]:
new_lst = lst[:mid]
return func(n, new_lst)
elif n > lst[mid]:
new_lst = lst[mid + 1:]
return func(n, new_lst)
else:
print("你输入的数在这个列表中\n")
return True
else:
print("你输入的数不在这个列表中\n")
return False
步骤3:
while 1:
n = int(input("请输入你要查找的数:"))
func(n, lst)
3. 方法3: 使用递归函数(方法2的优化)
# 仍然引入随机数模块, 拿到一个随机数列表
import random
def random_100(amount):
li = []
for i in range(amount):
s = random.randint(0, 100)
li.append(s)
return li
lst = sorted(random_100(100)) # 定义一个递归函数
def func(n, lst, left=0, right=None):
if right == None:
right = len(lst) - 1
if left <= right:
mid = (left + right) // 2
if n < lst[mid]:
right = mid - 1
elif n > lst[mid]:
left = mid + 1
else:
print("你输入的数在这个列表中,它的位置{}\n".format(mid))
return True
return func(n, lst, left, right)
else:
print("你输入的数不在这个列表中\n")
return False while 1:
n = int(input("请输入你要查找的数:"))
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. Python程序打包工具PyInstaller

    Python程序执行 py文件:直接提供源码,需要使用者自行安装Python并且安装依赖的各种库 pyc文件:pyc文件是Python解释器可以识别的二进制码,是跨平台的,需要使用者安装相应版本的Py ...

  2. laravel本地开发环境的安装及配置 - Windows:安装 Laravel Homestead 虚拟机

    一.安装 VirtualBox-5.2.22-126460-Win.exe 和 vagrant_2.2.2_x86_64.msi(可视化安装包安装); 安装在D盘 二.导入 Homestead Vag ...

  3. 码云 VS首次提交代码报错:failed to push some refs to 'https://gitee.com/Liu_Cabbage/ASP.NET-MVC-QQ-Connect.git'

    打开命令提示符: 执行合并命令: git pull --rebase origin master 最后总结: 1.多为第一次提交代码,本地和码云仓库不一致,README.md文件不在本地代码目录中 2 ...

  4. mysql 5.5 编码设置为utf8 转载自:http://outofcontrol.ca/thoughts/comments/change-mysql-5.5-default-character-set-to-utf8

    Change MySQL 5.5 default character-set to UTF8 连接里是linux下的 在window下my.ini Add under [client]  the fo ...

  5. java判断文件是否为图片

    /** * 判断文件是否为图片<br> * <br> * @param pInput 文件名<br> * @param pImgeFlag 判断具体文件类型< ...

  6. python3.6中 字典类型和字符串类型互相转换的方法

    mydic = {"俄罗斯": {"1":"圣彼得堡", "2":"叶卡捷琳堡", "3& ...

  7. 016_STM32程序移植之_舵机

    STM32程序移植之舵机PWM测试 接线图如下: STM32引脚 舵机引脚 功能 GND GND 正极电源 具体看舵机的额定电压 PA6 PWM引脚 STM32引脚 CH340引脚 GND GND 3 ...

  8. windows日志分析工具-LogonTracer

    0x01 Windows应急日志常用的几个事件ID 4624:这个事件ID表示成功登陆的用户,用来筛选该系统的用户登陆成功情况. 4625:这个事件ID表示登陆失败的用户. 4768:这个事件ID表示 ...

  9. Break Standard Weight (ZOJ 3706)

    Problem The balance was the first mass measuring instrument invented. In its traditional form, it co ...

  10. linux下设置git代理访问.

    有时候克隆仓库巨慢无比,需要设置代理. 一般情况下 proxychains 可以搞定的. 但是某些情况,如go 安装模块的时候是调用git的.这个时候proxchains就不行了. go 也可以通过设 ...