二分法

二分法,匿名函数

隐身守侯 提交于 2020-04-04 17:19:08
目录 二分法的应用 匿名函数 内置函数 面向过程编程 注册功能 分层实现功能 函数阶段性练习 二分法的应用 有一个从小到大排列的整形数字列表,我们判断某一个数字是不是在这个列表里面。 动用二分法查找数字 import time def rec_find_num(num, lis): """递归版本""" lis_len = int(len(lis) / 2) # 10.0 binary_num = lis[lis_len] # 10 if len(lis) == 1: print('没找到') return if binary_num > num: lis = lis[:lis_len] rec_find_num(num, lis) elif binary_num < num: # 10 < 18 lis = lis[lis_len + 1:] rec_find_num(num, lis) else: print('找到了') lis = [i for i in range(100000000)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] start = time.time() rec_find_num(4567899900, lis) end = time.time()

二分法查找算法

[亡魂溺海] 提交于 2020-04-02 08:15:00
二分法查找算法 二分法算法,也叫折半算法,是一种检索效率比较高的方式,当数据量较大时用二分法查找会更快,但是数据需要先排好顺序,可以调用.sort();方法进行排序。 先确定该区间的中间位置K(2)将要查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。如果没有查到,则将当前查找区间将缩小一半,递归查找,直到找到为止。 在检索的时候我们需要先对其进行排序: Arrays.sort(arr); 为了便于操作,建议对其查找方法进行封装处理,定义好参数值: public static int myBinarySearch(int[] arr,int value) { } 在写这个方法之前我们需要先对其首位进行定义,我们可以对其声明一个变量: int start=0; int end=arr.length-1; 用while循环进行判断: while (start<=end) { int mid=(start+end)/2; if (value==arr[mid]) { return mid; } if (value>arr[mid]) { start=end+1; } if (value<arr[mid]) { end=mid-1; } } return -1; 如果没有查找到,则返回-1。 定义main方法和声明数组。 public

使用二分法查询二维整型数组的值(找到返回其坐标)

倖福魔咒の 提交于 2020-03-30 00:24:23
该二维数组的特征是: a.每行中的整数从左到右按升序排列。 b.每行的第一个整数大于前一行的最后一个整数。 可以每行都进行二分查找(由于该数组的特征,所以可以先将要查找的数与本行的最后一个数据比较,若大于则直接进入下一行比较,增加效率,减少比较的次数),如果未找到则进入下一层,直到找完该二维数组。 private static String find(int[][] arr, int num) { int row = 0; //控制行数 while (row < arr.length){ int left = 0; //行的左下标 int right = arr[row].length - 1; //行的右下标 while (left <= right) { //每一行进行二分查找 if(num > arr[row][right]){ //如果查找的数比该行的最后一个数还大,则直接进入下一行的比较 break; } //int mid = (left + right) / 2; int mid = (right - left + 1) / 2 + left; //防止相加超过数据类型的上界 if (arr[row][mid] == num) { return "[" + row + "," + mid + "]"; } else if (arr[row][mid] > num) {

刷题笔记-二分法

China☆狼群 提交于 2020-03-29 22:10:51
数的范围 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。 如果数组中不存在该元素,则返回“-1 -1”。 输入格式 第一行包含整数n和q,表示数组长度和询问个数。 第二行包含n个整数(均在1~10000范围内),表示完整数组。 接下来q行,每行包含一个整数k,表示一个询问元素。 输出格式 共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。 如果数组中不存在该元素,则返回“-1 -1”。 数据范围 1≤n≤100000 1≤q≤10000 1≤k≤10000 思路: 1.找到左端点: - 区间[0 , n-1] - 判断条件:num[mid] >= tar 2.找到右端点: - 区间[左端点, n-1] - 判断条件:num[mid] <= tar 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010; int n,q; int num[N]; int main(void) { scanf("%d %d",&n,&q); for(int i = 0;i < n;i++) scanf("%d",

python 19

大兔子大兔子 提交于 2020-03-27 05:24:54
目录 二分法 面向过程的编程思想 匿名函数 模块 二分法 算法:是高效解决问题的办法 需求:有一个按照从小到大顺序排列的数字列表 需要从该数字列表中找到我们想要的那个一个数字 如何做更高效??? 方案一:整体遍历效率太低 for num in nums: if num == find_num: print('find it') break 方案二:二分法 list.sort()将列表排序 面向过程的编程思想 核心是"过程"二字,过程即流程,指的是做事的步骤:先什么、再什么、后干什么 基于该思想编写程序就好比在设计一条流水线 优点:复杂的问题流程化、进而简单化 缺点:扩展性非常差 面向过程的编程思想应用场景解析: 1、不是所有的软件都需要频繁更迭:比如编写脚本 2、即便是一个软件需要频繁更迭,也不并不代表这个软件所有的组成部分都需要一起更迭 匿名函数 1、def用于定义有名函数 func=函数的内存地址 def func(x,y): return x+y print(func) 2、lamdab用于定义匿名函数没名字的函数 lambda x,y:x+y 3、调用匿名函数,只用一次就放弃了 内存地址+() 方式一: res=(lambda x,y:x+y)(1,2) print(res) 方式二:违背了匿名函数的初衷 func=lambda x,y:x+y res=func(1,2)

二分法 匿名函数

扶醉桌前 提交于 2020-03-26 23:41:19
1.算法之二分法 # 需求:有一个按照从小到大顺序排列的数字列表 # 需要从该数字列表中找到我们想要的那个一个数字 # 如何做更高效??? nums=[-3,4,7,10,13,21,43,77,89] find_num=10 # def binary_search(find_num,l): # print(l) # if len(l) == 0: # print('找的值不存在') # return # mid_index=len(l) // 2 # # if find_num > l[mid_index]: # # 接下来的查找应该是在列表的右半部分 # l=l[mid_index+1:] # binary_search(find_num,l) # elif find_num < l[mid_index]: # # 接下来的查找应该是在列表的左半部分 # l=l[:mid_index] # binary_search(find_num,l) # else: # print('find it') # # binary_search(find_num,nums) 2.面向过程的编程思想 # 面向过程的编程思想: # 核心是"过程"二字,过程即流程,指的是做事的步骤:先什么、再什么、后干什么 # 基于该思想编写程序就好比在设计一条流水线 # 优点:复杂的问题流程化、进而简单化 #

C:折半查找法(二分法)

▼魔方 西西 提交于 2020-03-24 02:08:07
  主要用于已经做了排序的数字,时间复杂度:log2n   直接贴代码 #include <stdio.h> #include <stdlib.h> int search(int search_num, int a[], int right) { int left = 0; int ret = -1; int mid; while(right > left) { mid = (right + left) / 2; if (a[mid] == search_num) { ret = mid; break; } else if (a[mid] > search_num) { right = mid - 1; } else { left = mid + 1; } } return ret; } int a[9] = {1, 3, 5, 6, 8, 10, 12, 15, 17}; int main() { /*二分法搜索方法 思路: 1.设置左标和右标,建立search函数做二分运算 2.函数建立 循环终止条件是当right > left mid由(right + left) / 2得到 if mid = 所求; break if else mid > 所求; left = mid + 1 else mid < 所求 right = mid - 1 1, 3, 5, 6, 8, 10,

NOIP学习之二分查找:123.二分法求函数的零点

一曲冷凌霜 提交于 2020-03-11 10:11:41
测试链接 总时间限制: 1000ms 内存限制: 65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121 已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根。 输入 无。 输出 该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。 样例输入 无 样例输出 不提供 # include <cstdio> # include <cmath> # include <iostream> using namespace std ; double cal ( double x ) { double y ; y = x * x * x * x * x - 15 * x * x * x * x + 85 * x * x * x - 225 * x * x + 274 * x - 121 ; return y ; } int main ( ) { double left = 1.5 , right = 2.40 , mid ; int can = mid ; while ( cal ( left ) >= cal ( right ) ) { mid = ( left + right ) / 2.0 ; if (

二分法查找

会有一股神秘感。 提交于 2020-03-10 08:42:05
二分法要注意的点是 分的是下标,然后注意+1更新,因为判断之后,如果不等于mid,则下一个范围不用包含上一个mid。 def erfen1 ( nums , a ) : min = 0 max = len ( nums ) - 1 if a > nums [ max ] or a < nums [ min ] : return [ ] while max >= min : mid = int ( ( max + min ) / 2 ) if a == nums [ mid ] : return mid elif a > nums [ mid ] : min = mid + 1 else : max = mid - 1 return [ ] print ( erfen1 ( [ 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , 9 ) ) 时间复杂度是O(logn) 如何看呢,原来的长度是n,每一次划分都是除以2,最后的长度是1,所以等式 x代表的是二分的次数。x = log(n) 。2在这里可以不写,与5n的系数不写的道理一样。 来源: CSDN 作者: caihuanqia 链接: https://blog.csdn.net/caihuanqia/article/details/104747769

数据结构 二分法查找

社会主义新天地 提交于 2020-03-08 11:18:09
/* 二分法查找 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* 二分法查找是一种在有序数组中查找特定元素的搜索算法 二分法查找的时间复杂度O(logn) */ //递归算法 int recurbinary(int *a, int key, int low, int high) { int mid; if (low > high) { return -1; } mid = low + (high - low) / 2; if (a[mid] == key) { return mid; } else if (a[mid] > key) { return recurbinary(a, key, low, mid - 1); } else { return recurbinary(a, key, mid + 1, high); } } //非递归算法 int binary(int *a, int key, int n) { int left = 0, right = n - 1, mid = 0; mid = left + (right - left) / 2; while (left < right && a[mid] != key) { if (a[mid] < key) { left = mid +