二分法

Python进阶-Ⅸ 递归 二分法

烈酒焚心 提交于 2019-12-06 10:54:52
1、算法 英文名:algorithm,就是计算的方法。# 是截止到目前,人类发现的针对特定场景的,最优的计算方法。是人类智慧的结晶。# 人脑是复杂的,电脑其实很简单。比如:999 * 123 人类会将其变为: 1000 * 123 - 123 这样就好算多了,可是电脑不会如此,只会硬算! 学习算法的目的# 我们学习的算法 都是过去时# 了解基础的算法 才能创造出更好的算法# 不是所有的事情都能套用现成的方法解决的# 有些时候会用到学过的算法知识来解决新的问题 2、递归 1)、楔子 有如下例子:从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天,老和尚跟小和尚讲故事:"从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天,老和尚跟小和尚讲故事:'从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天,老和尚跟小和尚讲故事:............................. # 看到这个例子,有何感想?这不是车轱辘话码,自己说自己!# 这就对了,我们就正式引入递归! 2)、递归函数的定义 在函数中,自己调用自己的函数,叫递归函数。 1 depth = 0 2 def temple_story(): 3 global depth 4 print('从前有座山,山上有个庙;庙里有两个和尚,一个老和尚跟一个小和尚。一天

Python 二分法

馋奶兔 提交于 2019-12-05 05:07:07
def BinarySearch(list1, num): min = 0 # 最小的下标 max = len(list1) - 1 # 最大的下标 i = 0 while True: i += 1 mid = (max + min) // 2 # 中间的下标每次向下取整 if num > list1[mid]: min = mid + 1 # 小于需要的猜的数,则将最小下标变为中间的,又因为中间的已经猜过,所以要加1 elif num == list1[mid]: print("找到数据") print("一共查找%d次" % i) break else: max = mid - 1 # 大于需要的猜的数,则将最大下标变为中间的,又因为中间的已经猜过,所以要减1if __name__ == "__main__": list1 = [1,2,3,4,5,6,7] num = 7 BinarySearch(list1, num) 来源: https://www.cnblogs.com/guixie/p/11908540.html

生成式,二分法

半世苍凉 提交于 2019-12-04 23:13:41
目录 一、三元表达式 二、算法——二分法 三、列表生成式 四、字典生成式 五、集合生成式 一、三元表达式 三元表达式: 1.当x大的时候返回x,当y大的时候返回y 2.当某个条件成立做一件事,不成立做另一件事 三元表达式固定表达式: 值(1) if 条件 else 值(2) 条件成立 值(1) 条件不成立 值(2) 2.三元表达式只推荐两种选择的情况下(是或非) 例子1: 用普通的方法比较两个值的大小:6行代码 def my_max(x, y): if x > y: return print(x) else: return print(y) my_max(10, 20) 例子1(三元表达式):关键代码1行 x = 1 y = 2 res = x if x > y else y # 如果if后面的条件成立返回if前面的值,否则返回后面的值 print(res) 例子2:收费免费 is_free = input('请输入是否免费(y/n)>>>:') is_free = '免费' if is_free == 'y' else '收费' print(is_free) 二、算法——二分法 算法:解决问题的高效率的方法 1.找元素是否在一个列表中 普通方法 for i in k : k = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for i in k: if num

leetcode中二分查找的具体应用

不羁的心 提交于 2019-12-03 10:01:58
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 思路: 一看到算法时间复杂度必须是 O (log n ) 级别,肯定想到是二分法。但这里二分法需要变换一下:设置左右两个指针进行二分法,当通过二分法搜寻到目标值时,左右指针合一,然后在合一的位置上分别向左向右遍历寻找是否还有和目标值相等的数. def test(array,target): if len(array)==0: return [-1,-1] elif target<array[0] or target>array[-1]: return [-1,-1] else: l,r = 0,len(array)-1 while l<=r: mid = (l+r)//2 if target<array[mid]: r = mid-1 elif target>array[mid]: l = mid + 1 else: l,r=mid,mid while

二十二、mysql索引原理详解

自古美人都是妖i 提交于 2019-12-03 04:22:24
背景   使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) 对查询出来的结果排序   mysql的索引的目的是使上面的各种查询能够更快。 一、预备知识   什么是索引?   上一篇中有详细的介绍,可以过去看一下: 什么是索引?   索引的本质: 通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。   磁盘中数据的存取   以机械硬盘来说,先了解几个概念。   扇区 :磁盘存储的最小单位,扇区一般大小为512Byte。   磁盘块 :文件系统与磁盘交互的的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块由连续几个(2^n)扇区组成,块一般大小一般为4KB。   磁盘读取数据 :磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为 寻道时间、旋转延迟、传输时间 三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2 = 4.17ms

nyoj 86-找球号(一)二分法

匿名 (未验证) 提交于 2019-12-03 00:41:02
86-找球号(一) 内存限制:64MB 时间限制:3000ms 特判: No 通过数:14 提交数:48 难度:3 题目描述: 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,现在说一个随机整数k(0<=k<=100000100),判断编号为k的球是否在这堆球中(存在为"YES",否则为"NO"),先答出者为胜。现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利。 输入描述: 第一行有两个整数m,n(0<=n<=100000,0<=m<=1000000);m表示这堆球里有m个球,n表示这个游戏进行n次。 接下来输入m+n个整数,前m个分别表示这m个球的编号i,后n个分别表示每次游戏中的随机整数k 输出描述: 输出"YES"或"NO" 样例输入: 复制 6 4 23 34 46 768 343 343 2 4 23 343 样例输出: NO NO YES YES C/C++ AC 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include < set > 8 #include <map>

Gym - 100989G (二分法)

匿名 (未验证) 提交于 2019-12-03 00:40:02
There are K hours left before Agent Mahone leaves Amman! Hammouri doesn‘t like how things are going in the mission and he doesn‘t want to fail again. Some places have too many students covering them, while other places have only few students. Whenever Hammouri commands a student to change his place, it takes the student exactly one hour to reach the new place. Hammouri waits until he is sure that the student has arrived to the new place before he issues a new command. Therefore, only one student can change his place in each hour. Hammouri wants to command the students to change their places

[作业]如何二分法求函数零点

时间秒杀一切 提交于 2019-12-03 00:21:30
代码如下: #include <bits/stdc++.h> using namespace std; typedef long double dl; dl ansl,ansr; map <dl,dl> vis; //一个小优化,没有多大作用 dl cal(dl n) //计算f(n)的函数值 { if(vis[n]) return vis[n]; return vis[n]=((pow(2.0,n))+(3.0*n)-6.0); } void solve(dl l,dl r,dl exp)//当前二分区间及精度 { if(r-l<exp) //区间长度小于给定精度 { ansl=l,ansr=r; return; } dl mid=(l+r)/2; dl a=cal(l),b=cal(r),c=cal(mid); if(c==0) //区间中点就是零点 solve(mid,mid,exp); if(a*c<0) //零点位于左半区间 solve(l,mid,exp); if(b*c<0) solve(mid,r,exp); //零点位于右半区间 return; } int main(int argc, char const *argv[]) { vis.clear(); dl a,b,exp; cin>>a>>b>>exp; solve(a,b,exp); cout<<fixed

利用二分法查找一个数字在数组中的位置

匿名 (未验证) 提交于 2019-12-03 00:20:01
问题: 有一个升序排列无重复数字的数据,以及一个数字,利用二分法查找数字在数组中的位置,找到则返回其位置号,没找到返回-1. 解答: 通过两种方式实现:第一种方式为递归实现,需要传递数组的头和尾的位置。 [java] view plain copy public class /** public static int int int int int if null return 1 int 2 "中间值:" if if return 1 else if return else return else if return else return 1 /** public static void int 1 , 3 , 4 , 5 , 6 , 7 , 11 , 46 , 255 , 743 , 888 int 11 , 1 , 11 第二种实现方式为非递归实现,则利用循环: [java] view plain copy public class public static int int int if null return 1 int 2 if return 1 int 0 //数组下标 int 1 //数组下标 while 2 if else if else return 1 return 1 /** public static void int 1 , 3 , 4 , 5 , 6

二分法应用实例

匿名 (未验证) 提交于 2019-12-03 00:05:01
二分法的时间复杂度 O ( log ( n ) ) O(\log(n)) O ( lo g ( n ) ) ,直接遍历时间复杂度是 O ( n ) O(n) O ( n ) 。倘若数组的长度是 2 32 2^{32} 2 3 2 ,也就是 4294967296,那么在 O ( n ) O(n) O ( n ) 的最坏的情况下,你要查找4294967296这么多次,如果是用二分的话,最坏查找32次就可以了。 解题模板: 模板只是起到辅助作用,至于真正用的话,还是需要思考如何灵活使用它。 对于有序的数组,可以考虑使用二分,直接暴力遍历,感觉过不了呢。 int start = 0 , end = nums . size ( ) - 1 ; while ( start + 1 < end ) { int mid = start + ( end - start ) / 2 ; if ( . . . ) { start = mid ; } else { end = mid ; } //灵活变动,但需要单独判断,可能并行判断,可能有优先级去判断 if ( . . . start . . . . ) if ( . . . end . . . . ) } 0.第一个错误版本(leetcode 278) // Forward declaration of isBadVersion API. bool