Python 利用二分法查询数据
- 一. 二分法的适用条件
二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
优点: 二分法查找效率特别高
缺点: 二分法只适用于有序序列- 二. 二分法的主要思想是:
设查找的数组区间为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 利用二分法查询数据的更多相关文章
- python连接 elasticsearch 查询数据,支持分页
使用python连接es并执行最基本的查询 from elasticsearch import Elasticsearch es = Elasticsearch(["localhost:92 ...
- 使用Connector / Python连接MySQL/查询数据
使用Connector / Python连接MySQL connect()构造函数创建到MySQL服务器的连接并返回一个 MySQLConnection对象 在python中有以下几种方法可以连接到M ...
- python利用mongodb上传图片数据 : GridFS 与 bson两种方式
利用mongodb保存图片通常有两种方法,一种是将图片数据转化为二进制作为字典的键值对进行保存,另一种是利用mongodb提供的GridFS进行保存,两者各有利弊.性能方面的优劣未曾测试,无法进行评价 ...
- python 配合 es 查询数据
1.python脚本 [root@do1cloud03 ~]# cat python-es.py #!/usr/bin/env python3 from elasticsearch import El ...
- 用python实现数据库查询数据方法
哈喽,好久没来了,最近搞自动化发现了很多代码弯路,特别分享出来给能用到的朋友 因为公司业务的关系,每做一笔功能冒烟测试,我们就要对很多的数据库表中的字段进行校验,当时我就想反正总是要重复的运行这些SQ ...
- Python利用pandas处理数据后画图
pandas要处理的数据是一个数据表格.代码: 1 import pandas as pd 2 import numpy as np 3 import matplotlib.pyplot as plt ...
- oracle 利用over 查询数据和总条数,一条sql搞定
select count(*) over()总条数 ,a.*from table a
- python 利用pandas导入数据
- Python 单表查询数据
import pymssql #引入pymssql模块# -----------------------------------------------------import pymssql #引入 ...
随机推荐
- APP支付宝登录--PHP处理代码
1.首先需要参数: aucth_code udid re_id极光推送id 2.https://open.alipay.com/platform/keyManage.htm 配置公钥私钥 3.需要s ...
- HTTP请求处理流程、IHttphandler、IHttpModule
一.ASP.NET处理管道 Asp.net处理管道的第一步是创建HttpWorkerRequest对象,它包含于当前请求有关的所有信息. HttpWorkerRequest把请求传递给HttpRunt ...
- 双向绑定v-bind
通过v-model绑定输出数据 <script> export default { data() { return { pagestyle:'https://v4.bootcss.com/ ...
- 通过德鲁伊druid给系统增加监控
系统在线上运行了一段时间后,比如一年半载的,我们发现系统可能存在某些问题,比如执行系统变慢了,比如某些spring的bean无法监控各种调用情况. 触发到db的各种执行情况,这个时候,我们就需要一个工 ...
- PHP mysqli_error() 函数
返回最近调用函数的最后一个错误描述: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localh ...
- JAVA中的getBytes()方法
在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方 ...
- ODBC连接到400
1.首先iSeries Client安装的时候要勾选ODBC , 这样才能找到Driver 2.某个Application是32位上,要用32位路径下的ODBC Administration打开,添加 ...
- 百度ueditor中复制word图文时图片转存任然保持灰色不可用
官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...
- luoguP3366 【模板】最小生成树 x
P3366 [模板]最小生成树 2.4K通过 6.3K提交 题目提供者HansBug 标签 云端↑ 生成树 难度 普及- 时空限制 1s / 128MB 题目描述 如题,给出一个无向图,求出最小生成树 ...
- 常用SQL之日期格式化和查询重复数据
本文列举一些工作中常用的SQL,以提升工作效率. 1 日期格式化 使用 DATE_FORMAT(get_date, '%Y-%m-%d') 函数进行格式化.其中:get_date 是需要被格式化的字段 ...