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++) { ...
随机推荐
- 排序算法<No.6>【插入排序】
算法,我在路上,将自己了解的算法内容全部梳理一遍! 今天介绍简单点的,插入排序. 首先,什么是插入排序,这个维基百科上有.个人的理解,就是将一个数插入到一个已经排好序的数列当中某个合适的位置,使得增加 ...
- 计算MySQL的内存峰值公式 (转)
-- 计算MySQL的内存峰值公式,计算所有的连接满了的情况下: select (@@key_buffer_size + @@query_cache_size + @@tmp_table_size ...
- Linux/Centos下安装部署phantomjs 及使用
PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...
- Speeding Up The Traveling Salesman Using Dynamic Programming
Copied From:https://medium.com/basecs/speeding-up-the-traveling-salesman-using-dynamic-programming-b ...
- IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)
IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一.HTTPS 协议介绍 1,什么是 HTTP ...
- Android adb logcat输出日志显示不全解决方案
在终端中使用adb logcat打印服务器json数据,如果返回数据过大超过4000字节(4K)即会截断不显示 原因:logcat在对于message的内存分配大概是4k左右.所以超过的内容都直接被丢 ...
- Mongodb条件查询Query的用法
Query.All("name", "a", "b");//通过多个元素来匹配数组Query.And(Query.EQ("name ...
- 修改最后一次 已commit 的备注
输入命令 git commit --amend 会展示出最后一次提交的 备注信息 按 i 进行编辑 按esc 退出编辑 再按 shift +: (注意是英文的冒号),切换到命令行 wq 保存 即可 参 ...
- MySQL总论
1. MySQL基本概念 1.1. 数据库的概念 数据库,简而言之就是存储数据的仓库,可以按照一定的数据结构存储管理大量的数据及数据与数据之间的关系,它本质上是一种信息管理系统.数据库根据存储采用的 ...
- [转]Win 10 的 Win 按键没反应
来自:http://www.pc0359.cn/article/win10/66397.html 方法步骤: 1.首先我们需要将任务管理器运行出来.方法有两种,第一种:使用鼠标右键单击屏幕下方的任务栏 ...