二分法

二分法查找(折半查找)算法学习笔记

泪湿孤枕 提交于 2019-11-29 16:34:00
关键:数组中的元素必须是已经排好序的. 一维数组,二分法查找: 假如有一组数为1,2,3,4, 5 ,6,7, 8, 9, 10要查给定的值7.可设三个变量low,mid,high分别指向数据的前,中间和后,mid=(low+high)/2. 思路: 1:将low=0,值为1;high=9,值为10(因为数组下标从0开始);mid=(low+high)/2,即等于4,值为32(因为整型会省略小数点); 2:将mid的值与查找的数作比较,如果mid<n(这里假设要查找的数为n),说明n在mid的后边,则使得low=mid+1,high不变;如果n<mid,说明n在mid的前边,则使得high=mid-1,low不变;如果mid==n,你懂的... 3:现在的mid等于4,值为5,查找的范围为:5,6,7,8,9,10,显然mid<n,此时mid执行2次循环便等于7,然后输出mid. 例如: 设计一个程序,提供用户输入10个整数并保存到数组中,将整数以从大到小的顺序排列,最后通过半分法查找用户输入的值并显示值的序号.(VC++6.0环境) 代码清单: /******************************************************** ************************半分法查找*********************** ********

二分法查找 算法学习笔记

丶灬走出姿态 提交于 2019-11-29 16:31:17
二分法查找 学习笔记 文章目录 二分法查找 学习笔记 二分法简介 这种方法的基本思路如下: 主程序如下 二分法简介 二分法查找,是一种在已经 排好顺序 的数组中查找特定元素的方法。 这种方法的基本思路如下: 数组a[],所寻找的特定元素x。 1、设3个指针: l:指向数组第一个数。 h:指向数组中间数(h = (l + r) / 2)。 r:指向数组最后的数。 2、将x与a[h]作比较, (1) 若a[h] > x :将r指针向前移到h-1; (2) 若a[h] < x :将l指针向后移到h+1; 3、重新定义h指针:h = (l + r) / 2。 将上述步骤写入循环里,当 l < r - 1 时,退出循环。 主程序如下 int l , h , r , num [ m ] , x ; //x为特定元素,m为数组大小 l = 0 ; r = m - 1 ; while ( l < r - 1 ) { h = ( l + r ) / 2 ; if ( x == num [ h ] ) { printf ( "%d" , h ) ; return 0 ; } else if ( x > num [ h ] ) { l = h + 1 ; } else { r = h - 1 ; } } 来源: CSDN 作者: 摇啊摇曳瑶 链接: https://blog.csdn.net

二分法应用实例

折月煮酒 提交于 2019-11-29 14:49:51
二分法的时间复杂度 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.

算法:二分法查找

时光毁灭记忆、已成空白 提交于 2019-11-29 05:10:40
package com.atguigu;public class Main { public static void main(String[] args) { //二分法查找 //前提:所查找的数组必须有序 int[] arr=new int[]{-98,-34,2,34,54,66,79,105,210,333}; int dest=-3; int head=0;//初始的首索引 int end=arr.length-1; boolean isFlag=true; while(head<=end){ int middle=(head+end)/2; if(dest==arr[middle]){ System.out.println("找到指定的元素,位置为"+middle); isFlag=false; break; }else if(arr[middle]>dest){ end=middle-1; }else{ head=middle+1; } } if(isFlag){ System.out.println("很遗憾,没有找到"); } }} 来源: https://www.cnblogs.com/helloworld0903/p/11456552.html

函数二分法查下标

别说谁变了你拦得住时间么 提交于 2019-11-28 21:22:08
#include<stdio.h> int xiabiao(int *arr,int size, int num) { int left=0; int right=size-1; int mid; while(left<=right){ mid=(left+right)/2; if(num<arr[mid]){ right=mid-1; } else if (num>arr[mid]){ left=mid+1; } else return mid; }return -1; } int main() { int arr[]={1,2,3,4,5,6,7,8,9}; int size; size=sizeof(arr)/sizeof(arr[0])-1; printf(“下标是%d”,xiabiao(arr,size,3)); } 来源: CSDN 作者: wwwwwmk 链接: https://blog.csdn.net/wwwwwmk/article/details/103244426

usaco 二分法 题例

寵の児 提交于 2019-11-28 17:29:29
【描述】 共 N ( 1 ≤ N ≤ 100,000 )个 工作日 ,分 M ( 1 ≤ M ≤ N ) 个 清算月 一个 清算月 包含一个工作日或更多连续的工作日,每一个工作日都仅被包含在一个 清算月 当中。 按顺序分组,得到一个最大值最小化的月度开支(即 在 所有可能的分组结果的最大值 中得到一个最小的)。 【输入样例】 7 5 100 400 300 100 500 101 400 【输出样例】 500 解: #include <bits/stdc++.h> using namespace std; int n,m,ans,a[100005]; int judge(int mid) { int sum=0,cnt=1; for(int i=1;i<=n;i++) { if(sum+a[i]<=mid) sum+=a[i]; /// 连加 分为一组 直到该组总和大于mid else { sum=a[i]; cnt++; ///cnt记下组数 sum从a[i]开始重新连加 if(cnt>m || sum>mid) return 0; /// 若组数超过m 或 有比mid更大的花费 返回0 } } return 1; } int main() { scanf("%d%d",&n,&m); int le=0,rig=0; for(int i=1;i<=n;i++){ scanf("

程序员须知:面试中最容易被问到的18个算法题(附答案!)

孤街浪徒 提交于 2019-11-28 16:47:07
原创 IT168企业级 2017-09-20 17:21 算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。而根据统计,以下这18个问题是面试中最容易遇到的,本文给出了一些基本答案,供算法方向工程师或对此感兴趣的程序员参考。 1)请简单解释算法是什么? 算法是一个定义良好的计算过程,它将一些值作为输入并产生相应的输出值。简单来说,它是将输入转换为输出的一系列计算步骤。 2)解释什么是快速排序算法? 快速排序算法能够快速排序列表或查询。它基于分割交换排序的原则,这种类型的算法占用空间较小,它将待排序列表分为三个主要部分: 小于Pivot的元素 枢轴元素Pivot(选定的比较值) 大于Pivot的元素 3)解释算法的时间复杂度? 算法的时间复杂度表示程序运行完成所需的总时间,它通常用大O表示法来表示。 4)请问用于时间复杂度的符号类型是什么? 用于时间复杂度的符号类型包括: Big Oh:它表示小于或等于目标多项式 Big Omega:它表示大于或等于目标多项式 Big Theta:它表示与目标多项式相等 Little Oh:它表示小于目标多项式 Little Omega:它表示大于目标多项式 5)解释二分法检索如何工作? 在二分法检索中,我们先确定数组的中间位置,然后将要查找的值与数组中间位置的值进行比较,若小于数组中间值,则要查找的值应位于该中间值之前,依此类推

递归

柔情痞子 提交于 2019-11-28 15:31:50
一、什么是函数递归 函数的嵌套调用是:函数嵌套函数。函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身。 def foo(): print('from foo') foo() foo() # 进入死循环 如果递归函数不断地调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件。 1.1 直接调用 直接调用指的是:直接在函数内部调用函数自身。 import sys print(f"最大递归层数: {sys.getrecursionlimit()}") 最大递归层数: 3000 import sys # 修改递归层数 sys.setrecursionlimit(10000) def foo(n): print('from foo',n) foo(n+1) foo(0) 1.2 间接调用 间接调用指的是:不在原函数体内调用函数自身,而是通过其他的方法间接调用函数自身。 def bar(): print('from bar') foo() def foo(): print('from foo') bar() bar() 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯。

二分法(计算方法)

≡放荡痞女 提交于 2019-11-28 02:12:26
简单 二分法 1 // 采用二分法求方程 f(x)=x3-x-1=0在区间[1,2]内的一个实根, 使误差不超过0.001。要求给定方程条件和误差范围。 2 #include " iostream " 3 #include " math.h " 4 using namespace std; 5 float fun( float x ) 6 { 7 float y; 8 y = x * x * x - x - 1 ; 9 return y; 10 } 11 int main() 12 { 13 14 float a = 1.0000 ,b = 2.0000 ,x,y2,y1,m,n; int k; 15 printf( " k a b x f(x)\n " ); 16 printf( " -----------------------------------------------------------\n " ); 17 18 if ( fun(a) * fun(b) > 0 ) return 0 ; 19 else 20 { 21 22 for ( k = 1 ; fun(a) * fun(b) <= 0 ,k < 12 ;k ++ ) 23 { 24 25 m = (b - a) / pow( 2 ,k + 1 ); 26 x = (a + b) / 2 ; 27 y2 =

PAT 1010 Radix 进制转换+二分法

十年热恋 提交于 2019-11-28 01:08:40
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is “yes”, if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given. Input Specification: Each input file contains one test case. Each case occupies a line which contains 4 positive integers: N1 N2 tag radix Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set {0-9, a-z} where 0-9 represent the decimal numbers 0-9, and