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 #引入 ...
随机推荐
- 【C++/html版 代码 : 暴力破解数字红包 】-- 只要有编译器或者,不看运气,用手速敲代码说话,多人合作效果更佳!
需求分析: 或者是更大的范围! 是不是很捉急!运气背点不就over了! C++版: #include <stdio.h> #include <stdlib.h> #includ ...
- 大数据之路week03--day05(线程 II)
今天,咱们就把线程给完完全全的结束掉,但是不是说,就已经覆盖了全部的知识点,可以说是线程的常见的问题及所含知识基本都包含. 1.多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Loc ...
- 关键字local、global和内置函数【locals、globals】
每个函数都有着自已的命名空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量.每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数.类.其它导入的模块.模 ...
- pycharm分辨率&清晰度
三个月前换了新电脑,安装pycharm.又换了新的大屏幕. pycharm界面拖到大屏上时,字大小和字体都没有变化,清晰度低了很多,就像打了一层薄薄的马赛克一样.拖回到原本的屏幕又清晰了. 一直以为是 ...
- 002_linux之点灯(汇编深度解析)
1. 开发板采用韦山东的开发板 2. 芯片CPU三星S3C2440A 3. 控制引脚:GPF4 4. linux操作系统 5. 芯片手册下载地址:https://eyun.ba ...
- HTML的基础
HTML:超文本标记语言 超文本包括:文字.图片.音频.视频.动画等 流程:写好HTML代码后通过浏览器(自动编译HTML代码)展现出效果 HTM ...
- 开源分布式中间件 DBLE 快速入门指南
GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...
- web超大文件上传
文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...
- learning express step(十一)
learning express.Router() code: const express = require('express'); const app = express(); var route ...
- php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
使用压缩包函数必须要安装zip扩展,否则会报错 $ apt install php-zip