day6--二分查找法
二分查找法
我们在使用一个列表的时候,往往需要找到一个元素的位置也就是它的索引,按照一般的情况,肯定是一个一个的找过去,元素多了就是一件麻烦事。。
后来就引进了一个概念:二分查找法
它是根据情况将数据分为两半,找出中间值,然后让要查找的值和它比较,逐渐缩小范围直到找到相应的值。。。
我目前能想到的是可以运用到数字上面,因为数字可以比较大小,当然这些数字必须是有序排列的
例如:找出下面列表中的某个元素
我们一般的查找方法
l1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
def found(list,target):
x=1
for i in list:
if i==target:
print('找到了')
break
else:
x=x+1
print(x)
found(l1,5) # 结果为 找到了,x为5
found(l1,1) #结果为 找到了,x为1
有个奇怪的现象,我们查找一个不存在的元素时,它的值是列表里面的元素个数加1
found(l1,19) found(l1,100) 结果都为 19
那么二分查找法如何实现:
l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
n=1
def half_search(list, target, start=0, end=None):
global n
end = len(list) - 1 if end is None else end
if end >= start:
mid_index = (end - start) // 2 + start # 找出中间索引的位置
if target > list[mid_index]:
n= n + 1
return half_search(list, target, start=mid_index + 1, end=end)
elif target < list[mid_index]:
n = n + 1
return half_search(list, target, start=start, end=mid_index - 1)
elif target == list[mid_index]:
print('找了%s次' % n)
return '它的索引为%s'%mid_index
else:
print('找了%s次' % n)
return '没有找到'
else:
print('找了%s次' % n)
return '没有此值'
print(half_search(l1,1)) #结果为 找了4次 它的索引为0
print(half_search(l1,5)) #结果为 找了7次 它的索引为4
print(half_search(l1,10)) #结果为 找了10次 它的索引为9
从上面的比较我们可以看出,如果元素考前的话,一般的查找有有优势,但是二分查找法在大量的数据中是有绝对优势的
二分查找法,查找一个存在的元素最多查找 n/2+1次,n为元素的个数
day6--二分查找法的更多相关文章
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
- 用c语言编写二分查找法
二分法的适用范围为有序数列,这方面很有局限性. #include<stdio.h> //二分查找法 void binary_search(int a[],int start,int mid ...
- java for循环和数组--冒泡排序、二分查找法
//100以内与7相关的数 for(int a=1;a<=100;a++){ if(a%7==0||a%10==7||a/10==7){ System.out.print(a+ ...
- 二分查找法 java
前几天去面试,让我写二分查找法,真是哔了狗! 提了离职申请,没事写写吧! 首先二分查找是在一堆有序的序列中找到指定的结果. public class Erfen { public static int ...
- 学习练习 java 二分查找法
package com.hanqi; import java.util.*; public class Test5 { public static void main(String[] args) { ...
- Java-数据结构与算法-二分查找法
1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...
- 选择、冒泡排序,二分查找法以及一些for循环的灵活运用
import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] ar ...
- R语言实现二分查找法
二分查找时间复杂度O(h)=O(log2n),具备非常高的效率,用R处理数据时有时候需要用到二分查找法以便快速定位 Rbisect <- function(lst, value){ low=1 ...
- java学习之—递归实现二分查找法
/** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...
- [c/c++] programming之路(15)、多维数组和二分查找法,小外挂
一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...
随机推荐
- ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二) UpdatePanel
UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...
- TransportClient 新建index,mappings dynamic_templates。
public void createIndex(TransportClient client, String index){ CreateIndexRequest request = new Crea ...
- 基于tensorflow的MNIST手写识别
这个例子,是学习tensorflow的人员通常会用到的,也是基本的学习曲线中的一环.我也是! 这个例子很简单,这里,就是简单的说下,不同的tensorflow版本,相关的接口函数,可能会有不一样哟.在 ...
- 关于信号的延迟---verilog
关于信号的延迟---verilog `timescale 1ns / 1ps ///////////////////////////////////////////////////////////// ...
- 关于vivado----xdc文件时钟约束的初识
关于vivado----xdc文件时钟约束的初识 1.Primary Clocks(主时钟) 然而,对于比较复杂的时钟: 2.某个模块采用的主时钟(比如说GT) 3.时钟分频 4.复杂一点的时钟描述 ...
- 使用influxQL进行数据检索(说明)
非官方:InfluxDB 基本命令操作文档 原地址:https://docs.influxdata.com/influxdb/v1.6/query_language/data_exploration/ ...
- js中的 Table 对象
Table 对象Table 对象代表一个 HTML 表格.在 HTML 文档中 <table> 标签每出现一次,一个 Table 对象就会被创建. Table 对象集合cells[] ...
- IDEA创建简单servlet程序
创建项目 创建完后的目录结构为: web项目配置 在WEB-INF目录下新建两个文件夹,分别命名未classes和lib(classes目录用于存放编译后的class文件,lib用于存放依赖的jar包 ...
- Ubuntu 14.10 下安装伪分布式hbase 0.99.0
HBase 安装分为:单击模式,伪分布式,完全分布式,在单机模式中,HBase使用本地文件系统而不是HDFS ,所有的服务和zooKeeper都运作在一个JVM中.本文是安装的伪分布式. 安装步骤如下 ...
- Dubbo(1)简介和Zookeeper安装
一.简介: Dubbo主页地址 http://dubbo.io/ Dubbo百度百科:https://baike.baidu.com/item/Dubbo/18907815?fr=aladdin 二 ...