在編程界里溺森,二分是一個(gè)十分熱門、實(shí)用?的一個(gè)算法医窿,學(xué)好了二分姥卢,可以提高枚舉的效率渣聚,并且簡單易懂,超實(shí)用哦棺榔!有錯(cuò)誤的地方望大神指點(diǎn)(^_^)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 參考書籍:《信息學(xué)奧賽一本通(c++版)》
Q1什么是二分隘道?
二分,有一個(gè)別名:分治算法忘晤。顧名思義默辨,就是把問題分割成幾個(gè)較小的問題,從而達(dá)到二分的目的——減少時(shí)間壹置。
Q2二分的注意事項(xiàng)
(一)設(shè)定變量
二分的變量主要是由以下幾個(gè)組成的:
1:left(或簡稱L) //枚舉的左邊界
2:right(或簡稱R) //枚舉的右邊界
3:mid(或簡稱m)//指向左邊界和右邊界的中間
4:需要枚舉的數(shù)組(下面簡稱a數(shù)組)表谊,最好是升序的
(二)變量初值
1:left=1或需要枚舉的數(shù)組的最小下標(biāo)(通常是1或者0)
2:right=需要枚舉的數(shù)組的最大下標(biāo)(下面就有n表示)
3:mid是在枚舉的過程中賦值的,下面詳細(xì)講
Q3算法思路
1:使用一個(gè)while循環(huán)难咕,條件是在left<=right的情況下運(yùn)行
2:將mid賦為(left+right)/2
3:以mid為枚舉下標(biāo)余佃,判斷a[mid]是否達(dá)到條件
4:如果達(dá)到條件,將left賦值為mid+1;
5:如果沒有達(dá)到條件椭懊,則right賦值為mid-1;
Q4基本框架
好了氧猬,光說不練假把式坏瘩,所以,小編將給出一道題實(shí)踐一下:
? ? ? 一個(gè)小游戲:輸入兩個(gè)數(shù):n妄均,m(,)破讨,并輸入一個(gè)數(shù)組a,共m個(gè)元素,(保證為升序)烫沙,求n在數(shù)組a中在什么位置隙笆。(如果不包含n則輸出“NO!”不包含引號(hào))
樣例輸入:
3 6
1 3 6 7 8 9
樣例輸出:
2
分析題目:
? ? 首先,它是求一個(gè)元素在一個(gè)數(shù)組里是什么位置瘸爽,并且數(shù)組是一個(gè)升序铅忿,就可以使用二分法進(jìn)行搜索。如果用普通的搜索方法從~,效率就低很多柑潦。那么現(xiàn)在我們講一下如何將二分法運(yùn)用其中:
? ? 1渗鬼、基本變量left=1荧琼,right=m差牛。
? ? 2堰乔、判斷條件:如果a[mid]=n的情況下,那么輸出mid夹孔,退出析孽;如果a[mid]>n的情況下袜瞬,將右邊界縮小到mid-1(因?yàn)閍數(shù)組是一個(gè)升序的數(shù)組身堡,所以,如果a[mid]>n汞扎,則要將范圍縮小到left~mid-1擅这,故將right=mid-1,如果不能理解痹扇,就多讀幾遍吧~ 溯香。~);同理结笨,如果a[mid]<n的情況下湿镀,那就將left=mid+1。? 這樣以來算途,不斷地縮小范圍蚀腿,如果相等則輸出并退出扫外,是不是減少了時(shí)間復(fù)雜度呢筛谚?
? ? 3停忿、沒什么好說的,上代碼:
? ? ? ?好了吮铭,講了那么多谓晌,是時(shí)候說再見了T_T癞揉,如果這篇文章對(duì)你有所幫助,求點(diǎn)贊柏肪,下面芥牌,小編由衷的告誡讀者,思路很重要9詹妗I壬獭!蔬芥!多刷刷題控汉,總是沒錯(cuò)的^_^,再見啦!