二分學習筆記

寫在前面

二分是一種常用且非常精妙的算法,常常是我們解決問題的突破口。二分的基本用途是在單調序列或單調函數中做查找。因此當問題的答案具有單調性時,就可以通過二分把求解轉化為判定。進一步地,我們還可以通過三分法解決單調函數的極值以及相關問題。

刷題進度

二分答案(2/4)

二分查找

問題解決進度

Q1


?

一、二分

二分法,在一個單調有序的集合或函數中查找一個解,每次分為左右兩部分,判斷在哪個部分中并調整上下界,直到找到目標元素,每次二分后都將舍棄一半的查找空間,因此效率很高。

顯然,二分算法的復雜度為O(二分次數×單次判定復雜度)

……可憐的我依舊不會算復雜度QAQ……


二、二分核心代碼

1.整數定義域

int work(int l,int r){int l=-INF,r=INF;//根據題目要求改變左右端點的初始值while(l<r){int mid=(l+r)>>1;if(check(mid+1)) l=mid+1;//如果符合要求就繼續二分查找else r=mid;}return l;
}

2.實數定義域

double work(double l,double r){//根據題目要求確定精度dltdouble mid;while(fabs(l-r)>dlt){//實數比較大小,此句相當于l<r
//補充:fabs(x1)很abs(x2)都表示求絕對值,只不過x1是實數,x2是整數mid=(l+r)/2.0;if(check(mid)) r=mid;else l=mid;}return l;
}

TIP:如果指定二分的次數為t,那么對于初始的求解區間長度L,算法結束后r-l的值為L/2t


?

三、二分法常見模型

1.二分答案

最小值最大(或最大值最小)問題,這類雙最值問題常常選用二分法求解,也就是確定答案后,配合貪心、DP等其他算法檢驗這個答案是否合理,將最優化問題轉換為判定性問題。

【例 1】

將長度為n的序列分成最多m個連續段,求所有分法中每段和的最大值的最小是多少?

一些題目

LuoguP1024

LuoguP2678

LuoguP3957

Luogu二分答案

2.二分查找

用具有單調性的布爾表達式求解分界點。

【例 2】

在有序數列中求數字x的排名。

一些題目

Luogu二分查找

3.代替三分

有時,對于一些單峰函數,我們可以用二分導函數的方法求解函數極值,這時通常將函數的定義域定義為整數域求解比較方便。


?

四、典型例題

【例 1】憤怒的牛(Bzoj 1734)

1.題目大意

已知有n間牛舍和每間牛舍的位置,現在要求一種方案使得m頭牛兩兩之間的最小距離盡可能大,求這個最大的最小距離。

2.思路

這是一道最大值最小化的典型題目。

設C(d)表示可以安排牛的位置,并使得最近的兩頭牛距離≥d

那么問題就轉化為了求滿足C(d)的最大的d,最近的間距≥d可以看成是所有間距都≥d,因此滿足C(d)的條件就是任意兩頭牛的位置≥d

于是可以貪心求解:

<1>對牛舍的位置x進行排序

<2>把第一頭牛放入x0的牛舍

<3>如果第i頭牛放入了xj的牛舍,則第i+1頭牛就要放入滿足xj+d≤xk的xk最小的牛舍中

對x的排序只要在開始時進行一次就可以了,每一次判斷對每頭牛最多進行一次處理,因此算法的時間復雜度為O(nlogn)

3.代碼

咕咕咕咕咕

【例 2】Best Cow Fences(Poj 2018)

1.題目大意

給定一個長度為n的正整數序列A,求一個平均數最大的,長度≥L的子序列。

2.思路

二分答案mid,合法的條件為“存在一個長度≥L的子序列,平均數≥mid”

如果把數列中的每個數都減去二分的值,合法的條件就轉化為“存在一個長度≥L的子序列,子序列每一項相加的和≥0”

接下來就是著重解決兩個問題:

<1>求一個子序列,要求和最大,沒有“長度≥L”的限制

無長度限制的最大子序列和問題是一個經典問題,只需O(n)掃描該數列,不斷地把新的數加入子序列,當子序列的和變成負數時,把當前的整個子序列清空。掃描過程中出現的最大子序列和即為所求。

<2>求一個子序列,要求和最大,且子序列的長度≥L

子序列和可以轉化為前綴和相減的形式,即設sumi表示A1~Ai的和,則有:

maxi-j≥L{Aj+1+Aj+2+……+Ai}=maxL≤i≤n{sumi-min0≤j≤i-L{sumj}}

這個式子啥意思呀?QAQ

這個式子隨著i的增長,j的取值范圍0~i-L每次只會增加1。也就是說,每次只會有一個新的值進入min{sumj}的候選集合,所以沒有必要每次循環枚舉j次,只需要用一個變量記錄當前最小值,每次與新的取值sumi-L取min就可以了。

解決了這兩個問題后,我們只需要判斷最大子序列和是不是非負數,就可以確定二分上下界的變化范圍了。

3.代碼

咕咕咕咕咕

轉載于:https://www.cnblogs.com/THWZF/p/10365241.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252383.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252383.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252383.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解析.sens數據集

python腳本在下面網址中https://github.com/ScanNet/ScanNet/tree/master/SensReader/python 一定要使用python2運行此腳本. 使用指令如下 python reader.py --filename /media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png.sens --output_path /me…

ConcurrentHashMap 解讀

初始化&#xff1a; 問題&#xff1a;如何當且僅只有一個線程初始化table 1 private final Node<K,V>[] initTable() {2 Node<K,V>[] tab; int sc;3 while ((tab table) null || tab.length 0) {4 if ((sc sizeCtl) < 0)5 …

XML Schema 基本結構

<?xml version1.0?> <Schema name"cangchuSchema" metamodelVersion"4.0"><PhysicalSchema><Table name"highway_toll"><Key><Column name"uid"/></Key></Table><Table name&qu…

關于系統自帶 .NET Framework 版本的說明

系統自帶版本&#xff1a; Windows XP (SP3) .NET Framework 1.1Windows 7 (SP1) .NET Framework 3.5.1Windows 8.1 .NET Framework 4.5.1Windows 10 (1507) .NET Framework 4.6Windows 10 (1511) .NET Framework 4.6.1Windows 10 (1607) .NET Framework 4.6.2Windows 10 (1703…

BundleFusion那些事兒

背景&#xff1a;前面幾篇博客中寫了很多關于BundleFusion的東西&#xff0c;主要包括bundlefusion的論文閱讀筆記&#xff0c;.sens數據集的生成等&#xff0c;經過最近幾天的工作&#xff0c;我對bundlefusion又有了新的技術積累&#xff0c;在這里整理一下&#xff0c;也算是…

問題:圖片怎么保存到數據庫, 以及怎么把圖片從數據庫中取出來使用?(已解決)...

簡單&#xff0c;不保存圖片到數據庫&#xff0c;而是圖片的路徑。 也就是說&#xff0c;先把圖片下載到服務器的指定目錄下&#xff0c;然后&#xff0c;在把相對的路徑保存到數據庫中。 如果下次獲取圖片&#xff0c;就訪問數據庫&#xff0c;獲取圖片路徑&#xff0c;然后根…

Oracle Study之--Oracle 11gR2通過RMAN克隆數據庫

Oracle Study之--Oracle 11gR2通過RMAN克隆數據庫Purpose of Database Duplication A duplicate database is useful for a variety of purposes, most of which involve testing. You can perform the following tasks in a duplicate database: Test backup and recovery pro…

ubuntu16.04安裝evo

背景:這已經是我第二次嘗試安裝evo了,最近因為在bundlefusion加入groundtruth的問題搞的很煩躁,我懷疑是不是我給定的groundtruth是不是不正確,所以我就寫python腳本,獲取計算生成的位姿數據,寫入的groundtruth位姿數據.獲取數據后,將數據可視化就成了一個很重要的問題,我還是打…

前端性能優化之gzip

gzip是GNUzip的縮寫&#xff0c;它是一個GNU自由軟件的文件壓縮程序。它最早由Jean-loup Gailly和Mark Adler創建&#xff0c;用于UNⅨ系統的文件壓縮。我們在Linux中經常會用到后綴為.gz的文件&#xff0c;它們就是GZIP格式的。現今已經成為Internet 上使用非常普遍的一種數據…

luogu2770 航空路線問題 網絡流

題目大意&#xff1a; 給定一張航空圖&#xff0c;圖中頂點代表城市&#xff0c;邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。(1)從最西端城市出發&#xff0c;單向從西向東途經若干城市到達最東端城市&#xff0c;然后再單向從東向…

手機錄音ogg格式怎么轉換mp3

Ogg這種音頻格式剛出來的時候大家是非常熱愛的&#xff0c;但是隨著時代的發展&#xff0c;這種音頻格式已經已經被取代了&#xff0c;現在呢走在音頻格式前端的是MP3格式&#xff0c;這是大家都比較熟悉的&#xff0c;但是我們還是會經常下載到ogg這種格式的音頻&#xff0c;就…

TP3.2設置URL偽靜態滿足更好的SEO效果

URL偽靜態通常是為了滿足更好的SEO效果&#xff0c;ThinkPHP支持偽靜態URL設置&#xff0c;可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴&#xff0c;而不會影響當前操作的正常執行。 例如&#xff0c;我們設置 URL_HTML_SUFFIX>shtml 的話&#xf…

[機器學習] 推薦系統之協同過濾算法(轉)

[機器學習]推薦系統之協同過濾算法 在現今的推薦技術和算法中&#xff0c;最被大家廣泛認可和采用的就是基于協同過濾的推薦方法。本文將帶你深入了解協同過濾的秘密。下面直接進入正題. 1. 什么是推薦算法 推薦算法最早在1992年就提出來了&#xff0c;但是火起來實際上是最近這…

BundleFusion代碼框架講解

背景&#xff1a;前面用了幾篇文章來記錄和總結了&#xff0c;我在研究bundlefusion過程中遇到的一些問題以及解決方法&#xff0c;本來想實現給bundlefusion輸入先驗軌跡&#xff0c;然后讓其根據給定的軌跡進行重建&#xff0c;這樣即便在環境比較惡劣的情況下&#xff0c;也…

BundlePhobia

1、BundlePhobia用于分析npm package的依賴、bundle后的大小、下載速度預估等等&#xff0c;幫助你在引用一個package之前了解引入該package的代價。 2、也可以將項目的package.json文件上傳&#xff0c;BundlePhobia會幫你評估項目中所有包的大小和加載速度。

VFL演示樣例

VFL演示樣例 上篇文章向大家介紹了VFL的基本的語法點&#xff0c;假設對下面演示樣例不熟的童鞋&#xff0c;能夠前去參考。廢話不多說。我們直接來看演示樣例。演示樣例一 將五個大小同樣、顏色不同的view排成一行&#xff0c;view間的間隔為15px,第一個view的間隔與屏幕的左邊…

evo實用指令指南

下面這篇文章中有比較具體的關于evo的安裝以及使用的介紹&#xff0c;其中一點很重要&#xff0c;就是可以把euroc形式的.csv的軌跡格式轉換為tum格式的軌跡。 https://zhuanlan.zhihu.com/p/88223106#single evo_traj tum orb_slam2_tum.txt --reftum_groundtruth.txt -p --pl…

MailUtils

/***包名:com.thinkgem.jeesite.test*描述:package com.thinkgem.jeesite.test;*/ package com.thinkgem.jeesite.test;import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.u…

ES6遍歷對象

遍歷對象 E S 6 一共有 5 種方法可以遍歷對象的屬性 。 for ... in for . . . in 循環遍歷對象自身的和繼承的可枚舉屬性&#xff08;不含 Symbol 屬性&#xff09;。 Object.keys(obj)Object . keys 返回 一個數組&#xff0c;包括對象自身的&#xff08;不含繼承的 &#xff…

SpringMvc中ModelAndView模型的應用

/** * 目標方法的返回值可以是 ModelAndView 類型。 * 其中可以包含視圖和模型信息 * SpringMVC 會把 ModelAndView 的 model 中數據放入到 request 域對象中. * return */ RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String v…