二分法查找+树

一,查找存在的一个数,该数在列表中唯一

二分法查找是针对有序数据的查找方法,时间复杂度是O(logn)。。

其中 n/2^k=1 时,k 的值就是总共缩小的次数。而每一次缩小操作只涉及两个数据的大小比较,所以,
经过了 k 次区间缩小操作,时间复杂度就是 O(k)。通过 n/2^k=1,我们可以求得 k=log2n,所以时间复杂度就是O(K),也就是O(logn)。

方法一,循环

实际上,mid=(low+high)/2 这种写法是有问题的,因为low和high很大的时候,两者之和可能会溢出,应该写为low+(high-low)/2,
更好的话写成,low+((high-low)>>1) 

#有序列表的二分法,最简单版
def binary_search(array,value):if len(array) <= 1:return arraylow=0high=len(array)-1while(low<=high):#多这种写法mid = low+((high-low)>>1)if value==array[mid]:return mid,array[mid]elif value>array[mid]:low=mid+1else:high=mid-1return -1,-1
a=[0,1,1.5,2,3,4,9]
index,res=binary_search(a,9)
print('index={},res={}'.format(index,res))

方法二,递归

#有序列表的二分法,最简单版
def binary_search(array,low,high,value):if low>high:return -1mid = low + int((high - low) >> 1)if value==array[mid]:return mid,array[mid]elif value>array[mid]:low=mid+1return binary_search(array,low,high,value)else:high=mid-1return binary_search(array, low, high, value)
def binary_search_merge(array,value):return binary_search(array,0,len(array)-1,value)
a=[0,1,2,3,4,9]
index,res=binary_search_merge(a,9)
print('index={},res={}'.format(index,res))

缺点:(1)依赖的是顺序表结构,比如数组,不能用于链表,(2)需要先排好序,而排序的最低时间复杂度是O(nlogn),(3)不适用于小数据量(4)二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。

二,查找第一个值等于给定值的元素(存在多个值)

target大于目标值,左边界就变大,当找到等于的就返回左边界值,也就是第一个值了

def searchLeft(nums, target):left, right = 0, len(nums) - 1while left <= right:middle = left + (right - left) // 2if nums[middle] < target:left = middle + 1else:right = middle - 1return leftnums = [5, 7, 7, 8, 8, 10]
target = 8
# nums = [0, 1, 8, 8, 9, 9, 9]
# target = 9
res = searchLeft(nums, target)
print(res)

三,查找最后一个值等于给定值的元素(存在多个值)

target大于等于左边界的值,这时左边界值越来越大直到找到最后一个才返回

def searchRight(nums, target):left, right = 0, len(nums) - 1while left <= right:middle = left + (right - left) // 2if nums[middle] <= target:  # 加个等于符号 这样left就可以找到最后一个left = middle + 1else:right = middle - 1return left - 1
nums = [5, 7, 7, 8, 8, 10]
target = 8
# nums = [0, 1, 8, 8, 9, 9, 9]
# target = 9
res = searchRight(nums, target)
print(res)

四,查找第一个大于等于给定值的元素(存在多个值)

#查找第一个大于等于目标值的数
def binary_search(array, value):left = 0right = len(array) - 1while left < right:middle = left + (right - left)//2print('====middle:', middle)if array[middle] < value:left = middle + 1else:right = middle# print(middle)return right, array[right]
# a = [0,1,7,7,7,9,9]
a = [0, 1, 1, 1, 1]
index, res = binary_search(a, 1)
print('index={},res={}'.format(index, res))

 

五. 查找第一个大于给定值的元素(存在多个值)

#查找第一个大于目标值的数
def binary_search(array, value):left = 0right = len(array) - 1while left < right:middle = left + (right - left)//2if array[middle] <= value:left = middle + 1else:right = middle# print(middle)return right, array[right]
a = [0,1,7,7,7,9,9]
# a = [0, 1, 1, 1, 1]
index, res = binary_search(a, 7)
print('index={},res={}'.format(index, res))

六,查找最后一个小于给定值的元素(存在多个值)

def binary_search(array,value):if len(array) <= 1:return arraylow=0high=len(array)-1while(low<=high):#多这种写法mid = low+((high-low)>>1)#中间值小于valueif array[mid]<value:#中间值的前一位大于等于value或者mid==len(array)-1if array[mid+1]>value or mid==len(array)-1:return mid,array[mid]else:low=mid+1else:high=mid-1return -1,-1
a=[0,1,7,7,7,9,9]
index,res=binary_search(a,8)
print('index={},res={}'.format(index,res))

实际上,二分法更适用于‘近似’查找问题,这类问题二分法查找优势更加明显,用其他数据结构比如散列表,二叉树就比较难实现了。

由此引出树:

对于1到11的元素,首先以6为分节点,然后不断分。。。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 软件的安装

1、在oracle主页上注册登录 2、下载64位&#xff0c;将我接受许可协议&#xff0c;下载1of2和2of2,并解压到同一个文件夹 3、安装oracle软件 双击database文件夹里面的setup.exe&#xff0c;启动OUI去掉&#xff1a;我希望通过....只安装软件&#xff0c;不创建数据库选择语言…

算法笔试题

一&#xff0c;搜索连通域 M, N list(map(int, input().split(,))) print(M,N) book [] for i in range(M):line list(map(int, input().split(,)))book.append(line) print(book) # MN3 # book[[1, 0, 0], [0, 1, 0], [0, 1, 1]] print(book,book) class Solution:def __i…

Linux之vim编辑器

目录 vim编辑器 vim编辑器指令 命令模式指令 光标相关 移动光标相关 文本操作 底行模式指令 插入模式 vim配置 面试官&#xff1a;小伙子&#xff0c;你是用什么环境编写代码的&#xff1f; 小明&#xff1a;vs2019 面试官&#xff1a;小伙子&#xff0c;你是用什么环…

Verilog HDL设计实现m序列+选择器

设计m序列发生器&#xff0c;其特征方程为&#xff0c;输出数字序列信号m_sequence码速率为10Mbps&#xff1b;设计串行转并行电路&#xff0c;每4位m序列并行输出&#xff0c;先输入的串行数据位于并行输出数据的高位。设计测试程序&#xff0c;进行功能仿真&#xff0c;将Ver…

深度分享:世界顶级神经科学家王小勤教授CCL 2018主旨报告(PPT全文,经报告人同意发布)...

报告人&#xff1a;王小勤 清华大学脑与智能实验室主任来源&#xff1a;TsinghuaNLP公众号人类的语言处理系统起始于听觉系统&#xff0c;大脑通过听觉系统来感知自然界多姿多彩的声学环境。在我们日常听见的众多声音中&#xff0c;语音和音乐是我们人类相互交流最为重要的两类…

贪心算法+回溯算法+动态规划

一.贪心算法 1.分饼干问题 #思路:排序加贪心 先让胃口小的孩子满足 class Solution:def findContentChildren(self, g, s):print(g:, g)print(s:, s)g sorted(g)#孩子s sorted(s)#饼干res 0for j in range(len(s)):#遍历饼干 先给胃口小的分配if res<len(g):if g[res]&…

小谈@override

override是jdk1.5增加的注解&#xff0c;主要是用来声明子类的某方法覆盖了父类的某方法。非常简单的注解&#xff0c;但是有个小问题&#xff1a; 项目最开始使用的是jdk1.6&#xff0c;mvc模式&#xff1a;接口 ----> 实现类。后来项目改成了jdk1.5&#xff0c;结果所有实…

单片机期末复习代码

1、左右来回循环的流水灯的电路连接见图4-6&#xff0c;显示规律如图4-7。实现本任务要求&#xff0c;可以有多种软件实现方法。下面列出了3种&#xff0c;具体如下 数组的字节操作实现 #include <reg51.h> #define uchar unsigned char uch…

中国AI专利数稳居第一!世界各国AI专利深度盘点

来源&#xff1a;智东西摘要&#xff1a;深入分析AI技术在世界范围内的专利申请数据&#xff0c;从专利申请的角度发现AI领域发展活跃的技术。最近两年&#xff0c;随着人工智能技术在国内的蓬勃发展&#xff0c;一些研究机构对国内外的技术现状进行了不同角度的分析&#xff0…

将多个csv文件合成一个csv

1.python的writer做法 import csv import pandas as pd import os from statistics import mean #对dev测试生成的多个csv进行融合 def merge_different_csv():CSV_C0_NAME file_nameCSV_C1_NAME real_lengthCSV_C2_NAME dev_lengthCSV_C3_NAME dev_length_abs_errorCSV_C4…

微信接口开发-初级体验

目录&#xff1a; 1. 微信接口的注册 2. 申请成为开发者 3. 申请测试账号 4. 获取access_token值 5. 调用接口 6. 自己编写程序 7. 总结 1. 微信接口的注册 进入到微信开发的官网&#xff08;https://mp.weixin.qq.com/&#xff09;进行注册。不过注册时需要一张手持身份证的照…

德国汽车产业研究:立足本土,迈向世界

来源&#xff1a;国泰君安德国汽车市场目前已进入成熟阶段&#xff0c;成熟阶段的标志是国内销量增速下降&#xff0c;自主品牌份额远高于其他品牌。国内市场趋于饱和&#xff0c;而出口量快速增长&#xff0c;并且在豪华车市场拥有高市场份额。德国汽车产业链的特点是&#xf…

利用混淆矩阵查看每一类预测结果+miou计算

混淆矩阵的示意图如下&#xff1a; import numpy as np cmnp.array([[4,0,0,0],[0,1,0,0],[0, 0, 2, 0],[0, 1, 3, 0]]) plt.figure() plt.grid(False) plt.imshow(cm, cmapjet) plt.colorbar() plt.show() import matplotlib.pyplot as plt import seaborn as sn import numpy…

Ubantu系统配置固定IP地址和Pycharm连接远程服务器

当需要远程办公时&#xff0c;使用pycharm远程连接服务器是必要的。 PyCharm提供两种远程调试(Remote Debugging)的方式&#xff1a; 配置远程的解释器&#xff08;remote interpreter&#xff09;配置Python调试服务器&#xff08;Python Debug Server&#xff09; 本篇文章主…

人工智能正在如何改变世界:BBC 总结 AI 的 A 到 Z

来源&#xff1a;AI 科技评论摘要&#xff1a;如今&#xff0c;人工智能已经不是一项虚无缥缈的实验室科技&#xff0c;它已经融入我们生活的方方面面。BBC Future 栏目撰写了一篇轻松愉快的文章&#xff0c;选出了首字母 A 到 Z 的 26 个单词&#xff0c;借助它们介绍机器的思…

灵活运用 SQL SERVER FOR XML PATH

FOR XML PATH 有的人可能知道有的人可能不知道&#xff0c;其实它就是将查询结果集以XML形式展现&#xff0c;有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主. 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR…

近代数字信号处理实验-DFT分析信号的频谱

一、实验目的 &#xff08;1&#xff09;掌握利用DFT近似计算不同类型信号频谱的原理和方法。 &#xff08;2&#xff09;理解误差产生的原因及减小误差的方法。 &#xff08;3&#xff09;培养学生自主学习能力&#xff0c;以及发现问题、分析问题和解决问题的能力。 二、…

人工智能+能源:能源行业变革新趋势

来源&#xff1a;资本实验室随着环保压力的不断加大&#xff0c;以及可再生能源成本持续降低等因素&#xff0c;越来越多的国家都开始大力推动从传统化石能源转向可再生能源&#xff0c;全球很多大型企业也纷纷加入了全球可再生能源计划RE100&#xff0c;以实现可再生能源100%的…

利用numpy生成各种波

一&#xff0c;生成矩形波 矩形波的傅里叶级数 xnp.linspace(-np.pi,np.pi,201) knp.arange(1,99) k2*k-1 ynp.zeros_like(x) for i in range(len(x)):y[i](4/np.pi)*np.sum(np.sin(k*x[i])/k) # print(t) # print(f) plt.plot(x,y) plt.show() 二&#xff0c;生成锯齿波和三角…

解决TeamViewer访问超时限制的问题

一、卸载TeamViewer:找到安装路径&#xff0c;点击uninstall卸载 二、修改MAC地址 1、查看现有的mac地址&#xff1a;打开cmd界面&#xff0c;输入ipconfig/all 按回车&#xff0c;红框标记为无线局域网mac地址。 2、修改现有无线局域网mac地址 &#xff08;1&#xff09;按住…