二分插入、bisect
在一个有序序列(从小到大)中查找一个元素
每次将元素与序列中间位置的元素进行比较
如果大于中点,则在后半段。如果小于中点,则在前半段。以此类推
时间复杂度为O(logn)
有一个无序序列[37, 99, 73, 48, 47, 40, 40, 25, 99, 51],对其先排序输出新列表。
分别插入20、40、41、100到这个新序列中合适的位置,保证其有序。
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin)
# print(origin)
# [25, 37, 40, 40, 47, 48, 51, 73, 99, 99]
# 有重复时从左边插入
def insert_sort(origin:list, num):
low = 0
high = len(origin)
while low < high:
mid = (low + high)//2
# 如果大于中点,则在后半部分
if num > origin[mid]:
low = mid + 1
# 否则在前半部分
else:
high = mid
origin.insert(low, num)
for num in (20, 40, 41, 100):
insert_sort(origin, num)
print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin)
# 有重复时从右边插入
def insert_sort(origin:list, num):
low = 0
high = len(origin)
while low < high:
mid = (low + high)//2
if num < origin[mid]:
high = mid
else:
low = mid + 1
origin.insert(low, num)
for num in (20, 40, 41, 100):
insert_sort(origin, num)
print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
bisect模块
bisect包含两个主要函数 bisect和insort,都是基于二分法实现
- bisect: bisect_right的别名,返回插入点位置,有重复时返回右边插入点
- bisect_left: 返回插入点位置,有重复时返回左边插入点
- insort: insort_right的别名,默认有重复时从右边插入
- insort_left: 有重复时从左边插入
import bisect
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin)
for num in (20, 40, 41, 100):
bisect.insort_left(origin, num)
print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
判断学生成绩,成绩等级A-E,其中,90分以上为A,80-89为B,70-79为C,60-69为D,50-59为E
breakpoints = [60, 70, 80, 90]
grades = 'EDCBA'
index = bisect.bisect(breakpoints, 55)
print(grades[index])
# E
参考:
https://zh.wikipedia.org/wiki/二分搜索算法
https://docs.python.org/3/library/bisect.html
二分插入、bisect的更多相关文章
- 使用bisect库实现二分查找
手动实现 假如有一个有序表nums,怎么样在nums里找到某个值的位置呢?没错,就是nums.index(k),哈哈哈哈哈哈哈-- 假如nums很长很长,那就要祭出二分查找了 def binary_s ...
- 查找问题的利器 - Git Bisect
原文:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...
- Python模块——bisect
bisect是python内置的模块,主要用于对有序列进行操作.具体用法如下: 模块导入:import bisect 内容查看:dir(bisect) 这个模块包含了: 五个变量:builtins, ...
- 每日一“酷”之bisect
作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...
- python bisect模块
转发:http://www.cnblogs.com/skydesign/archive/2011/09/02/2163592.html 先看看模块的结构: 前面五个属性大家感兴趣可以打出来看看数值,这 ...
- [Practical Git] Diagnose which commit broke something with git bisect
Sometimes you find a bug in your project that has been around for a while without being noticed; it ...
- python标准库 bisect模块
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #bisect #作用:维护有序列表,而不必在每次向列表增加一个元素 ...
- python笔记之bisect模块
python笔记之bisect模块 当你决定使用二分搜索时,这个模块会给你带来很大的帮助. 例子 import bisect L = [1,3,3,6,8,12,15] x = 3 #在L中查找x,x ...
- python数组查找算法---bisect二分查找插入
1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块 [python] view plaincopyprint? import bisect L = [1,3,3,6,8, ...
随机推荐
- keycloak 调研资料
1.https://www.keycloak.org/docs/latest/server_development/index.html 下载keycloak 2.https://gitee.com/ ...
- Bash 中常见的字符串操作
获取字符串长度 ${#string} MyString=abcABC123ABCabc 注意这会自动去掉字符串结尾处的空格,如果在字符串中包含空格(开头.中间或结尾),就需要使用引号把字符串包裹起来: ...
- Centos下Nodejs+npm环境-部署记录
公司的一个项目上线,需要用到Nodejs和npm环境,这里记录下安装过程,方便回看同时供大家参考. 1)yum安装方式(版本比较老点,v5.12.0 + 3.8.6) 需要在centos中添加epel ...
- Wannafly挑战赛25 B.面积并
链接 [https://www.nowcoder.com/acm/contest/197/B] 分析 特殊优先考虑 首先考虑r>=l这种情况就是圆的面积了 第二就是r<=内切圆的半径,这个 ...
- PairProject 总结
结对编程人员:张迎春,赵梓皓.下面是我们一起编程的照片. 结对编程的优点: 首先,结对编程的目的是为了减少编程的错误,在编程的时候,大家一起检查错误,一起分析有没有更加合理的编写方法,所以这是结对编程 ...
- JAVA链表中迭代器的实现
注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...
- 使用代理创建连接池 proxyPool
配置文件properties url=jdbc:mysql://127.0.0.1:3306/mine?characterEncoding=UTF-8 user=root password=1234 ...
- Python学习笔记 -- 第四章
高阶函数 变量可以指向函数 f=abs f(-10) 10 变量f指向abs函数,直接调用abs()函数和调用f()完全相同 传入参数 变量可以指向函数,函数的参数可以接收另一个函数的参数,这种函数成 ...
- .Net反编译软件
.Net反编译软件 https://www.cnblogs.com/xiandnc/p/10132491.html 一说起.net的反编译软件,大家首先想到的就是Reflector,ILSpy,dot ...
- vue element-ui upload 实现带token上传
<el-upload class="upload-demo" :data ="uploadData" :headers = "headers&q ...