1. 程式人生 > >二分查詢實用模板

二分查詢實用模板

二分查詢,又叫折半查詢。網上有很多寫法,但是經過總結之後發現這個模板是最管用的。

說一下這個二分模板的作用:找到的話且這個數唯一則返回下標位置,如果不唯一則返回最右邊的下標;找不到的話返回比它大的第一個數(即右邊的數)的下標。注意程式碼,經過細微的修改可以達到不同的效果

int bSearch(int begin, int end, int e)  
{  
    int mid, left = begin, right = end;  
    while(left <= right)  
    {  
        mid = (left + right) >> 1;  
        if(arr[mid] >= e) right = mid - 1;  
        else left = mid + 1;  
    }  
    return left;  
}  

以下程式碼經過細微修改,找不到的話返回比它小的第一個數(即左邊的數)的下標。

int bSearch(int begin, int end, int e)  
{  
    int mid, left = begin, right = end;  
    while(left <= right)  
    {  
        mid = (left + right) >> 1;  
        if(arr[mid] > e) right = mid - 1;  
        else left = mid + 1;  
    }  
    return right;  
}  

以上兩段程式碼都要注意一個數組越界的問題,第一段程式碼當查詢的值大於陣列的最大值時會向右越界,第二段程式碼當查詢的值小於陣列的最小值時會向左越界。如果需要進行越界判斷,請自行修改

相關推薦

二分查詢實用模板

二分查詢,又叫折半查詢。網上有很多寫法,但是經過總結之後發現這個模板是最管用的。 說一下這個二分模板的作用:找到的話且這個數唯一則返回下標位置,如果不唯一則返回最右邊的下標;找不到的話返回比它大的第一個數(即右邊的數)的下標。注意程式碼,經過細微的修改可以達到不同的效果

二分查詢模板

while (low <= high) { int middle = (low + high) / 2; if (target == nums[middle]) {

過載實現:int char二分查詢. 函式模板 :對整型 浮點型 字元型 實現氣泡排序

程式:演算法+資料 C++語言的資料:   1、基本型別: 整型,浮點型,字元型,bool型別   2、變數:此塊空間的內容可改變         型別 變數名;//分配空間:以型別       初始化變數:在定義變數同時賦初值       引用:通過名字引用變數的內容  

ACM 二分查詢 二分答案 模板

我自己的模板 int l=0,r=100,ans=0; while(l<=r) { mid=(l+r)/2; if (check(mid)) {l=mid+1;ans = mid

LIS 最長上升子序列 (n*logn) 模板二分查詢+遞迴)

      最長上升子序列是很早就接觸了的問題了,一直用的是動態規劃n*n的方法,也知道那不是最好的,可以優化,今天看部落格無意中看到LIS,LCS兩個詞,就特意找了部落格看了看,主要是理解一下這裡的思想,其實蠻複雜難懂的,自己很難說清楚,還是得引用人家的部落格才行。點選開

常用二分查詢模板

//二分查詢各種情況編寫練習 public class BinarySearch { //精確查詢---用遞迴實現二分查詢,精確查詢目標元素的位置,假定陣列遞增排列,且不存在重複元素 public int bsearch1(int array[],i

簡單二分查詢模板查詢

1 # include <stdio.h> 2 3 int search(int a[], int n, int v) //這個好像是效率最高的 4 { 5 int left = -1, right = n, middle; 6 while(left+1 !=

二分查詢模板總結(遞迴與迴圈遍歷兩個版本)

二分查詢: 思路: 在有序*陣列***a[]中查詢K 1,不斷分割 。 2 用中間值去比較。 ====================嘗試比較下面兩種,得到遞迴函式的寫法=========

二分、三分查詢演算法模板

二分、三分查詢演算法的原理及實現程式碼。 簡單定義 在一個單調有序的集合中查詢元素,每次將集合分為左右兩部分,判斷解在哪個部分中並調整集合上下界,重複直到找到目標元素。 時間複雜度 O (logn),優於直接順序查詢O(n) 原理 左閉右開二分 123456789101112131415161

二分查詢法(C++ 模板實現)

/*演算法總結   二分查詢法:   二分查詢法的前提是資料已經排序,時間平均複雜度為 O(lgn)   歡迎轉載,轉載請註明作者 [email protected] */ #include <iostream> #include <stdi

HiHo1121 : 二分圖一?二分圖判定(模板題)

性別 不同 nbsp break 不同的 時也 ttl fence 個人 描述 大家好,我是小Hi和小Ho的小夥伴Nettle,從這個星期開始由我來完成我們的Weekly。 新年回家,又到了一年一度大齡剩男剩女的相親時間。Nettle去姑姑家玩的時候看到了一張姑姑寫的相

POJ-3468 A Simple Problem with Integers(線段樹、段變化+段查詢模板

sum .org miss numbers ... bsp wid scanf accepted A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Su

二分搜索模板

二分 return src div closed log open lose while 1 int bs1(int x,int y,int t) { //二分求上界 2 while(x <= y) { 3 int mid = x

jdbcTemplate 和 Thymeleaf模板引擎 查詢模板賦值例子

blog urn pre 模板引擎 tex ras body del xmlns 二、 jdbcTemplate 和 Thymeleaf模板引擎 最簡單輸出例子 控制器代碼 @GetMapping(value = "/test2") public String

二分圖匹配(模板)

匹配 algo tor man push iostream ans || ret 二分圖匹配 附上兩種方法: 網絡流 據說所有的二分圖題目都可以用網絡流跑過去,可能還快一些 話不多說,只有代碼 /* 二分圖匹配的題大多可用網絡流做 此處為Dinic模板,詳見網絡流模

二分圖匹配模板

gif 分享 mes aps for puts div file 圖片 2013-2014 ACM-ICPC, NEERC, Eastern Subregional Contest 1 /***************************************

二分圖匹配模板

main std 增廣路 true tdi out 訪問 span syn #include<bits/stdc++.h> using namespace std; int edge[1005][1005]; int match_x[1005];

C語言經典演算法(九)——遞迴實現二分查詢的兩種方法

後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現二分查詢演算法 1、 遞迴實現二分查詢 <1> 題目描述:針對資料,進行二分查詢(要求:資料的排列有序) <2> 方法一:概念法 <3> 方法二:遞迴法 原始碼: 一、 遞迴實現

為什麼使用二分查詢的速率要比按其他比例分割的查詢速率要快???

在說任意比例分割查詢之前我們先來談談黃金分割查詢與二分查詢: 在二分查詢中,我們是取中旬等於左向右和的中間值,即用等分的方法進行查詢。 那為什麼一定要等分吶?能不能進行“黃金分割”?也就是中間=左+ 0.618(右 - 左),當然中間要取整數。 我們來分析一下,假設有一段

複雜的二分查詢

1.解決上一篇的問題 問題並不難,首先要求的記憶體是小於100M,1000萬的資料每個資料八個位元組,全部存入陣列佔用的記憶體大概也是80M,所以完全可以使用二分查詢來實現。 2.複雜的二分查詢 簡單的二分查詢我們都會,我們的假設也是陣列中沒有相同元素,假設陣列中有相同的元素,查詢第一個