二分法

二分法-开花

北战南征 提交于 2020-02-29 09:58:46
样例输入 4 4 5 1 7 3 2 3 4 1 样例输出 1 3 import java . util . Arrays ; import java . util . Scanner ; public class 开花 { public static void main ( String [ ] args ) { Scanner sc = new Scanner ( System . in ) ; int n = sc . nextInt ( ) ; int m = sc . nextInt ( ) ; long [ ] a = new long [ 100005 ] ; long [ ] b = new long [ 100005 ] ; // int [] b=new int[m]; for ( int i = 0 ; i < n ; i ++ ) { a [ i ] = sc . nextInt ( ) ; } for ( int i = 0 ; i < m ; i ++ ) { b [ i ] = sc . nextInt ( ) ; } Arrays . sort ( b , 0 , m ) ; for ( int i = 0 ; i < n ; i ++ ) { int x = Arrays . binarySearch ( b , 0 , m , a [ i ] )

python 二分法查找

瘦欲@ 提交于 2020-02-26 17:41:42
二分法的适用条件 二分法查找适用于数据量较大时, 但是数据需要先排好顺序.    优点 : 二分法查找效率特别高    缺点 : 二分法只适用于有序序列 二分法的主要思想是: 设查找的数组区间为array[low, high] (1)确定该区间的中间位置k (2)将查找的值T与array[k]比较. 若相等, 查找成功返回此位置, 否则确定新的查找区域, 继续二分查找。区域确定如下: T < array[k] 由数组的有序性可知T < array[k,k+1,……,high], 故新的区间为array[low,……,k-1] T > array[k] 由数组的有序性可知T > array[low,……,k-1], 故新的区间为array[k,k+1,……,high] 每一次查找与中间值比较, 可以确定是否查找成功,不成功则当前查找区间将缩小一半, 递归查找即可. 例题: 用二分法查找一个数是否在随机数列中 方法1(使用while循环): 步骤1: 拿到一个有100个随机数的列表 import random # 引入一个随机数模块 def random_100 ( amount ) : li = [ ] for i in range ( amount ) : # 循环多少次就拿多少个随机数 s = random . randint ( 0 , 100 ) li . append (

C语言-递归二分法查找

只愿长相守 提交于 2020-02-19 06:08:32
#include <stdio.h> int search(int *var, int target, int low, int high) { int mid = (low + high)/2; while (low < high) { if (target > var[mid]) { return search(var, target, mid + 1, high); } else if (target < var[mid]) { return search(var, target, low, mid - 1); } else { printf("The firt matching position is: %d \n", mid); return mid; } } return -1; } int main() { int array[20] = {2, 12, 78, 98, 245, 320, 417, 578, 643, 708, 923, 978, 996, 1002, 1200, 2300, 2398, 2400, 2521, 2888}; int target = 23; int length = sizeof(array)/sizeof(int); if (search(array, target, 0, length) == -1) { printf("Can

pta基础练习题 7-18 二分法求多项式单根 (20分)

青春壹個敷衍的年華 提交于 2020-02-11 01:24:03
二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f®=0。 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则 如果f(a)f(b)<0,则计算中点的值f((a+b)/2); 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环; 如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。 本题目要求编写程序,计算给定3阶多项式f(x)=a ​3 ​​ x ​3 ​​ +a ​2 ​​ x ​2 ​​ +a ​1 ​​ x+a ​0 ​​ 在给定区间[a,b]内的根。 输入格式: 输入在第1行中顺序给出多项式的4个系数a ​3 ​​ 、a ​2 ​​ 、a ​1 ​​ 、a ​0 ​​ ,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。 输出格式: 在一行中输出该多项式在该区间内的根,精确到小数点后2位。 输入样例: 3 -1 -3 1 -0.5 0.5 输出样例: 0.33 在这里插入代码片 # include <iostream> #

python 二分法详解

为君一笑 提交于 2020-02-07 07:38:02
目录 一、二分法基本思想 二、二分法适用情况 三、代码示例 一、二分法基本思想 二分法是一个非常高效的算法,它常常用于计算机的查找过程中。 先玩一个小游戏。预先给定一个小于100的正整数x,让你猜,猜测过程中给予大小判断的提示,问你怎样快速地猜出来? 这样猜测最快,先猜50,如果猜对了,结束;如果猜大了,往小的方向猜,再猜25;如果猜小了,往大的方向猜,再猜75;…,每猜测1次就去掉一半的数,就这样可以逐步逼近预先给定的数字。这种思想就是二分法。 二、二分法适用情况 该数组,必须是有序 : 二分查找依赖的是顺序表结构,即数组。 二分查找针对的是有序数据,因此只能用在插入、删除操作不频繁,一次排序多次查找的场景中。 对数据量大小有要求。 数据量太小不适合二分查找,与直接遍历相比效率提升不明显。但有一个例外,就是数据之间的比较操作非常费时,比如数组中存储的都是组成长度超过100的字符串。 数据量太大也不适合用二分查找,因为数组需要连续的空间,若数据量太大,往往找不到存储如此大规模数据的连续内存空间。 一般要求找到的是某一个值或一个位置。 三、代码示例 #判断301在不在l列表中(l列表是有序列表) l = [1,2,3,4,7,8, 11, 34,65,76,301,887,888,55454,777777] #运用递归来进行二分法查找 def dichotomy(l,num):

HDU-1969 Pie 二分法

眉间皱痕 提交于 2020-02-02 03:32:54
Problem Description My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are coming to my party and each of them gets a piece of pie. This should be one piece of one pie, not several small pieces since that looks messy. This piece can be one whole pie though. My friends are very annoying and if one of them gets a bigger piece than the others, they start complaining. Therefore all of them should get equally sized (but not necessarily equally shaped) pieces, even if this leads to some

刷题--二分法(3)

▼魔方 西西 提交于 2020-01-31 13:42:53
在某些情况下,不能找到一个合适的条件来划分区间,也就是说不能将整个区间划分为xxoo型。但是在求解的过程中可以不断的去掉一部分区间。 二分法的本质就是每次去掉一部分区间,所以这类问题可以用二分法的思路和模板来解决。而想到用二分需要从时间复杂度上考虑。比如一维的数组,如果brute force 需要O(n),本身又是sorted,那么就可以考虑用二分,在某些条件的判断下,只保留有解的那一部分。 例 lintcode 62. Search in Rotated Sorted Array https://www.lintcode.com/problem/search-in-rotated-sorted-array/ 在二分的while循环中,每一次array[mid]都首先看是在更大的那一部分还是更小的那一部分。然后再看target是在有序的那一段,还是剩下的无序的部分。 public class Solution { public int search(int[] A, int target) { if(A == null || A.length == 0) return -1; int left = 0, right = A.length - 1; while(left + 1 < right){ int mid = (left + right) >>> 1; if(A[mid] =

刷题--二分法(1)

大城市里の小女人 提交于 2020-01-31 07:05:25
首先是二分法的模板 1 while(left + 1 < right){ 2 int mid = (left + right) >>> 1; 3 if(array[mid] == target){ 4 //取决于实际操作 5 }else if(array[mid] > target){ 6 right = mid; 7 }else(array[mid] < target){ 8   left = mid; 9 } 10 } 这样写的好处在于, 一定可以将搜索结果限定在left和right之间。即,如果array中有target的值,它一定是left或者right,如果没有,left和right就是按序在array中插入target后距离target最近的两个值。也就是说,left和right在退出while循环后仍然保持着先后顺序。 使用这个模板的时候注意的一点是,要在while循环之后对left和rihgt进行判断,判断的依据是极端情况。下面用三个例子说明。 1 array中没有重复的值,找到target值的索引。 极端情况下,target出现在头和尾,或者没有target,但是按照排序target可以插在头位置或者尾位置。 如果存在且在头位置,那么left不会变化,在尾位置right不会变化,而且在while中不会执行if(array[mid] == target)。 同样

装水问题(二分法)

被刻印的时光 ゝ 提交于 2020-01-30 12:13:33
装水问题 有一个侧面看去是半圆的储水装置,该圆的半径为R,要求往里面装入高度为h的水,使其在侧面看区的面积S1与半圆面积S2的比例恰好为r。现给定R和r,求高度h。 # include <iostream> # include <cmath> using namespace std ; const double PI = acos ( - 1.0 ) ; // PI const double eps = 1e-6 ; double f ( double R , double h ) { double alpha = 2 * acos ( ( R - h ) / R ) ; double L = 2 * sqrt ( R * R - ( R - h ) * ( R - h ) ) ; double S1 = alpha * R * R / 2 - L * ( R - h ) / 2 ; double S2 = PI * R * R / 2 ; //扇形面积公式S=R*R*θ/2; return S1 / S2 ; } double solve ( double R , double r ) { double left = 0 , right = R , mid ; while ( right - left > eps ) { mid = ( left + right ) / 2 ;

二分查找(折半查找)

谁说我不能喝 提交于 2020-01-29 20:38:10
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功; 否则,若key小,则在数组前半部分中继续进行二分法检索; 若key大,则在数组后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。 二分法检索是一种效率较高的检索方法。 import java . util . Arrays ; public class TestBinarySearch { public static void main ( String [ ] args ) { int [ ] arrs = { 30 , 20 , 50 , 10 , 80 , 9 , 7 , 12 , 100 , 40 , 8 } ; Arrays . sort ( arrs ) ; System . out . println ( Arrays . toString ( arrs ) ) ; System . out . println ( binarySearch ( arrs , 30 ) ) ; } public static int binarySearch ( int [ ] array , int value