




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、淺談數(shù)據(jù)的合理組織【摘要】信息學是一一門高深深的學科科,它正正在高速速的發(fā)展展。隨著著信息學學的發(fā)展展,其題題目中的的關系也也變得越越來越錯錯宗復雜雜,給我我們解題題帶來困困難。對對數(shù)據(jù)進行行合理地組織,正正是我們們面對上上述題目目時的一一種有效效手段。本文用幾個個經(jīng)典例例題從數(shù)數(shù)據(jù)的結(jié)結(jié)構(gòu)和順順序兩個個方面進進行合理理組織,達達到優(yōu)化化模型或或是提升升算法效效率的目目的。介介紹了“合合理組織織數(shù)據(jù)”在在信息學學中建立立模型和和優(yōu)化算算法方面面的一些應用用,例題題包含了了動態(tài)規(guī)規(guī)劃、數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)、圖論論類型的的題目。目的在在于引起起讀者對于于數(shù)據(jù)的的合理組組織的關關注,并并在今后后的解題題中能
2、積極并靈靈活地運運用這一一手段。【關鍵字】組織數(shù)據(jù)數(shù)據(jù)結(jié)結(jié)構(gòu)動動態(tài)規(guī)劃劃圖樹序序列【正文】【引言】一個簡單的的例子:給出N個數(shù)數(shù)字(數(shù)字會會比較大大),然后給給出一些些詢問,詢詢問一個個數(shù)字有有沒有在在給出的的N個數(shù)字字當中。當然我們有有很多已已知的辦辦法:HASH表表、TRRIE、預預排序+二分查查找這些算法都都是通過過對數(shù)據(jù)據(jù)進行合合理的組組織而起起到了減減少工作作量的作作用。不同的是HHASHH表和TRRIE是是利用數(shù)數(shù)據(jù)形式式的重新新組織,而而預排序序二分分查找是是通過對對數(shù)據(jù)順順序的重重新組織織來達到到優(yōu)化算算法的目目的的。我我們組織織數(shù)據(jù),主主要就是是通過從從“形式式”和“順順序”
3、這這兩個角角度來考考慮。事事實上,這這兩個方方面在實實際運用用中往往往不是獨獨立的,通通常需要要聯(lián)合運運用。我們已經(jīng)學學習了很很多經(jīng)典典的數(shù)據(jù)據(jù)結(jié)構(gòu),它它們都是是合理組組織數(shù)據(jù)據(jù)的表現(xiàn)現(xiàn)。在優(yōu)優(yōu)化算法法中有很很好表現(xiàn)現(xiàn)。對數(shù)數(shù)據(jù)組織織的合理理化,不不僅在我我們設計計算法時時能起到到優(yōu)化程程序效率率的作用用,有時時,我們們在建立立解題模模型時,合合理地組組織數(shù)據(jù)據(jù)可能給給我們提提供新的的思考角角度,從從而優(yōu)化化解題模模型,例例一就是是這樣的的一個例子子。例一金金明的預預算方案案及其加加強版金明的預算算方案【題意描述述】給出N個物物品,每每個物品品都有一一個權(quán)值值(5500000)和和一個價價格(
4、100000)。我們們稱可以以直接被被購買的的物品為為主件,稱稱不能被被直接購購買的物物品為附附件,附附件只有有當其主主件被購購買了才才能被購購買,一一個主件件最多有有兩個附附件,附附件沒有有下一級級附件。任務購買一一些物品品,總價價格不超超過M,使得得被購買買的物品品的權(quán)值值之和最最大。N32000 MM600【簡要分析析】我們很容易易聯(lián)想到到經(jīng)典的的動態(tài)規(guī)規(guī)劃之00-1背包問問題。但是題目與與背包卻卻有一些些差別:附件不不能被直直接購買買。【對數(shù)據(jù)的的初步組組織】主件與附件件之間是是樹形的的關系。組組織一下下數(shù)據(jù),如如下圖:(圖1)如圖所示:主件1沒有有附件,主主件2有兩個個附件,主主件3
5、只有一一個附件件。【數(shù)據(jù)組織織方案一一】假設我們忽忽略數(shù)據(jù)據(jù)的特殊殊性,單單從樹結(jié)結(jié)構(gòu)考慮慮,我們們?nèi)菀紫胂氲降囊灰粋€算法法是:給所有主件件加上一一個“級級超主件件”,把把原來的的所有主主件都變變成“超超級主件件”的附附件,如如下圖: (圖2)【算法一】這樣,在這這棵樹上上,我們們可以設設計一個個動態(tài)規(guī)規(guī)劃算法法:定義:costa表表示a節(jié)點所所代表的的物品的的價格scoreea表示a節(jié)點所所代表的的物品的的得分狀態(tài)faabb表示示以節(jié)點點a為根的的子樹,總總共花費費不超過過b元的最最多得分分。狀態(tài)轉(zhuǎn)移方方程:fab=Maxxfc1b11+ffc22bb2+fcc3b3.fcckbk+ssco
6、rreaa;其中ci為為a的子節(jié)節(jié)點;bi=b-ccostta;這樣枚舉的的效率顯顯然不高高!我們可以用用左兒子子右兄弟弟表示法法來表示示這一棵棵樹,將將原樹轉(zhuǎn)轉(zhuǎn)化成二二叉樹,則則我們在在進行狀狀態(tài)轉(zhuǎn)移移的時候候只用考考慮給左左兒子分分配多少少錢。lefta表表示a的左兒兒子rightta表示a的右兒兒子fab=MaxxMaaxffleeftablleftt+ffriighttabb-coosta-bleeft+sscorreaa,ffriighttabb這樣我們可可以得到到一個理理論 參見算法藝術(shù)與信息學競賽貪食的九頭龍中對算法復雜度的分析復雜雜度為OO(NMM2)的算法法,但是是對于本本題
7、的數(shù)數(shù)據(jù)范圍圍來說,這這個復雜雜度并不不太 參見算法藝術(shù)與信息學競賽貪食的九頭龍中對算法復雜度的分析【數(shù)據(jù)組織織方案二二】上面我們把把本題同同0-1背包進進行了類類比。發(fā)發(fā)現(xiàn)兩道道題之間間的差別別:附件件不能被被直接購購買。顯顯然,如如果題目目中沒有有附件,那那么本題題即為標標準的001背包包問題。我們回到題題目并考考慮其特特殊性:1.附件沒沒有附件件。2.每個主主件最多多只有22個附件件。這樣,顯然然對于(圖圖一)中中每一組組(主件件附件件),可可以作為為整體考考慮。對于每一組組,可能能的購買買方案最最多只有有:1.什么都都不買2.只購買買主件3.購買主主件和附附件14.購買主主件和附附件2
8、5.購買主主件和兩兩個附件件這樣,我們們可以借借鑒經(jīng)典典的011背包動動態(tài)規(guī)劃劃,把每每一組看看作一個個對象,取取值和花花費對應應最多五五種。【算法二】costik表表示分組組后第ii個對象象的第kk種購買買方案的的花費。weighhtiikk表示示分組后后第i個對象象的第kk種購買買方案的的總權(quán)值值。Fij表表示前ii個對象象最多花花費j元,能能得到的的最大權(quán)權(quán)值。Fij=maxx(Fi-11jj-coostik+weeighhtiikk);其中1=k=5且cosstiikk=j狀態(tài)總數(shù):O(NNM)轉(zhuǎn)移代價:O(11)這樣,我們們得到了了一個時時間復雜雜度為OO(NMM)的優(yōu)秀算法法。郁悶
9、的金明明【題意描述述】給出N個物物品,可可以直接接被購買買的稱為為主件,而而不能直直接被購購買的稱稱為附件件,附件件只有當當其主件件被購買買了才能能被購買買,一個個主件可可以有任任意多個個附件,附附件沒有有下一級級附件。每每個物品品都有一一個權(quán)值值(5500000)。任務購買一一些物品品,總價價格不超超過M,使得得被購買買的物品品的權(quán)值值之和最最大。N60M=ccostti),Fi+11jj00情況II:第i個物品品是附件件如果k=11 Fijk= MaaxFFi+1j-ccostti11+wweigghti(j=cosstii),Fii+1j1如果k=00 Fijk= Fi+11jj00狀態(tài)
10、總數(shù):O(NNM)轉(zhuǎn)移代價:O(11)時間復雜度度同樣是是O(NNM)。很郁悶的金金明【題意描述述】給出N個物物品,可可以直接接被購買買的稱為為主件,而而不能直直接被購購買的稱稱為附件件,附件件只有當當其主件件被購買買了才能能被購買買,一個個主件可可以有任任意多個個附件,附附件可以以有多級級,也就就是說如如果某個個物品是是附件,那那么它還還有可能能有附屬屬于它的的下一級級附件。每個物品都有一個權(quán)值(50000)。任務購買一一些物品品,總價價格不超超過M,使得得被購買買的物品品的權(quán)值值之和最最大。N60M32000【問題分析析】現(xiàn)在題目在在原題的的基礎上上不僅放放寬了附附件的個個數(shù),還還放寬了了
11、附件的的層數(shù),如圖所所示:從上圖中,我我們可以以對本題題有一個個感性的的認識:關系又又“寬”又又“深”。我們依然試試著從前前面的題題目中尋尋找算法法:我們可以直直接套用用算法11,因為為該算法法正好將將數(shù)據(jù)作作為樹結(jié)結(jié)構(gòu)來進進行處理理。而利利用了題題目特殊殊條件的的算法22和算法法3,直接套套用算法法肯定是是行不通通的。但是他們都都很有啟啟發(fā)性:拋棄樹樹形的結(jié)結(jié)構(gòu),重重新組織織成線形形。現(xiàn)在的題目目是不是是也可以以類似解解決呢?【組織數(shù)據(jù)據(jù)方案四四】算法3相對對來說比比較算法法2更加一一般,所所以現(xiàn)在在我們再再回過頭頭來研究究一下算算法3,希望望在分析析過程中中找到一一些靈感感。回憶算法33的
12、思路路:把同在一個個組的主主件放在在附件的的前面,利利用動態(tài)態(tài)規(guī)劃“加加一維”的的思想,順順利地實實現(xiàn)了將將問題轉(zhuǎn)轉(zhuǎn)化到序序列上來來。關鍵字:主主件在前前序列列動態(tài)態(tài)規(guī)劃我們聯(lián)想到到利用樹樹的先根根遍歷序序,而且且正好滿滿足上面面的關系系。但是這樣有有什么好好處嗎?還能進進行動態(tài)態(tài)規(guī)劃嗎嗎?怎樣設設計狀態(tài)態(tài)才能傳傳遞父節(jié)點的狀狀態(tài)呢?我們再回過過去看算算法3的狀態(tài)態(tài)轉(zhuǎn)移:假設當前狀狀態(tài)是FFijk,且k=0。如果i是附附件,那那么實際際上在到到達下一一個主件件以前,i后面的附件是都不會被購買的。上圖中,對對于附件件a,實際際上一個個k=00的狀態(tài)態(tài)傳遞下下去是沒沒有意義義的,因因為附件件b和附
13、件件c也必然然不能被被購買。思考并總結(jié)結(jié)上面的的結(jié)論:對于一個主主件,我我們?nèi)绻毁徺I買的話,那那么其附附件我們們都不用用考慮,而而直接“跳跳”到下下一個主主件。我們把它應應用到本本題中來來:重要結(jié)論我我們考慮慮一棵子子樹的時時候,如如果我們們不購買買其根節(jié)節(jié)點,那那么其子子樹中所所有節(jié)點點我們都都不必討討論了。這一結(jié)論似似乎很顯顯然,但但是我們們并不是是要在樹樹結(jié)構(gòu)中中用這一一結(jié)論。正正如上面面提到的的,我們們要在樹樹的先根根遍序上上進行動動態(tài)規(guī)劃劃,而這這一結(jié)論論正是我我們成功功的關鍵鍵。【算法4】根據(jù)前面的的思考,我我們先依依次求出出每棵樹樹的先根根遍歷序序,并保保存在同同一個序序列l(wèi)
14、iist中。為了利用上上面的結(jié)結(jié)論,我我們還要要求出以以節(jié)點ii為根的的子樹的的節(jié)點總總數(shù)coountti。現(xiàn)在我們來來設計動動態(tài)規(guī)劃劃算法:定義:costi表表示第ii個物品品的價格格weighhtii表示示第i個物品品的權(quán)值值Fij表表示從第第i個物品品到第nn個物品品,最多多花費jj元,能能得到的的最大權(quán)權(quán)值和。狀態(tài)轉(zhuǎn)移:對于一個節(jié)節(jié)點,我我們考慮慮是否購購買它:購買:那么么我們繼繼續(xù)考慮慮它后面面的節(jié)點點不購買:那那么我們們跳過它它的子孫孫節(jié)點方程如下:Fij=MaxxFi+11jj-coostlisstii+weiighttliisti,Fi+ccounntllisttij這個算法依
15、依然是OO(NMM)的,很完完美地解解決了本本題。并并且,這個算算法模型型對于以以前有很很多類似似的樹形形動態(tài)規(guī)規(guī)劃題目目都適用用,這是是我們在在分析本本題的過過程中的意外外收獲。【小結(jié)】這是一道很很有啟發(fā)發(fā)性的道道目。反反思這一一題的幾幾個不同同難度的的版本,不不難發(fā)現(xiàn)現(xiàn)我們最最終都用用線形模模型上的的動態(tài)規(guī)規(guī)劃取代代了容易易想到的的樹形動動態(tài)規(guī)劃劃算法。我們再次分析前面的算法,試圖發(fā)現(xiàn)其中內(nèi)在的一些東西。其實我們這個題主要就是對于樹形結(jié)構(gòu)和線形結(jié)構(gòu)的選擇,所以我們對比算法4和算法1:不難發(fā)現(xiàn),相比算法4,算法1其實多出的操作就是枚舉分配給左兒子多少錢。而在線形的的序列上上,沒有有用的錢錢自
16、然地地被分配配給后面面的元素素。也就就是說:樹的形形態(tài)決定定了在狀狀態(tài)轉(zhuǎn)移移的時候候要進行行額外的的枚舉。這正是樹形動態(tài)規(guī)劃算法的瓶頸所在!而我們利用樹的先根遍歷序?qū)⑥D(zhuǎn)樹形轉(zhuǎn)化為線形序列,成功地避免了樹形形態(tài)的限制,正是合理地組織數(shù)據(jù)。我們得到的的啟示:憑第一感感覺想出出來的模模型不一一定是最最好的,對對于一個個題目,我我們充分分挖掘其其數(shù)據(jù)關關系并加加以利用用,合理理地組織織數(shù)據(jù)并并且嘗試試用已有有的知識識來解決決,推陳陳出新,才才能不斷斷地進步步。前面我們在在樹據(jù)的的組織結(jié)結(jié)構(gòu)上進進行了合合理地安安排,成成功地對對于每一一次加強強的題目目都設計計出了優(yōu)優(yōu)秀的算算法,下下面,我我們來看看一看
17、“順順序”的的合理安安排的例例子:例二樹樹的果實實【題意描述述】給出一棵有有N個節(jié)點點的有根根樹(根根為1號節(jié)點點),每每個節(jié)點點有權(quán)值值。要求對于每每一個節(jié)節(jié)點,求求:1.其子樹樹中權(quán)值值比該節(jié)節(jié)點大的的節(jié)點總總數(shù)2.樹上除除其子孫孫節(jié)點外外比該節(jié)節(jié)點大的的節(jié)點總總數(shù)3.從根節(jié)節(jié)點到該該節(jié)點路路徑中比比該節(jié)點點大的節(jié)節(jié)點總數(shù)數(shù)其中(1=N=1005)【問題分析析】對于要求的的后面兩兩個值,我我們很容容易想到到O(NNlogg2(N)的算算法:樹上除其子子孫節(jié)點點外比該該節(jié)點大大的節(jié)點點總數(shù):直接排排序,在在待統(tǒng)計計節(jié)點前前的與該該節(jié)點權(quán)權(quán)值不同同的個數(shù)數(shù)再減去去問題11的答案案即為所所求。從
18、根節(jié)點到到該節(jié)點點路徑中中比該節(jié)節(jié)點大的的節(jié)點總總數(shù):以以權(quán)值為為關鍵字字構(gòu)造線線段樹(若權(quán)值值大可行行離散化化處理),深度度優(yōu)先遍遍歷樹上上節(jié)點,用用棧記錄錄下到節(jié)節(jié)點的路路徑,并并把當前前節(jié)點插插入線段段樹,在在線段樹樹中我們們記錄區(qū)區(qū)間的元元素個數(shù)數(shù),當前前節(jié)點權(quán)權(quán)值到最最大權(quán)值值這個區(qū)區(qū)間中元元素個數(shù)數(shù)即為所所求,我我們再遞遞歸處理理子樹,在在子樹訪訪問完畢畢后還須須把該節(jié)節(jié)點從線線段樹中中刪除。我們最大的的困難在在于求:其子子樹中權(quán)權(quán)值比該該節(jié)點大大的節(jié)點點總數(shù)O(N2)的樸素素統(tǒng)計方方法是很很容易想想到的,但但是本題題的數(shù)據(jù)據(jù)規(guī)模達達到1005,O(NN2)的復雜雜度顯然然太高。我
19、我們自然然想到利用用線段樹樹、樹狀狀數(shù)組這這些優(yōu)秀秀的統(tǒng)計計數(shù)據(jù)結(jié)結(jié)構(gòu)來進進行題目目中要求求的統(tǒng)計計任務。但是這這些數(shù)據(jù)據(jù)結(jié)構(gòu)都都是用于于線型序列列統(tǒng)計的的,并且且似乎沒沒有改造造版本用用于樹形形結(jié)構(gòu)。既然沒有辦辦法改造造數(shù)據(jù)結(jié)結(jié)構(gòu),那那么我們們轉(zhuǎn)換數(shù)數(shù)據(jù)形態(tài)態(tài)把把樹轉(zhuǎn)化化為序列列再進行行統(tǒng)計,先根遍歷序即是我們轉(zhuǎn)換后的理想形態(tài)。我們給出一一個例子子:同一棵子樹樹構(gòu)成一一個連續(xù)續(xù)的區(qū)間間,這正正方便了了我們的的統(tǒng)計。我們定義:一個元素所所在子樹樹在遍歷歷序中構(gòu)構(gòu)成的區(qū)區(qū)間叫作作元素所所在區(qū)間間。元素相比較較都指其其權(quán)值大大小相比比較。現(xiàn)在問題已已經(jīng)轉(zhuǎn)化化成為:給出一個序序列,每每個元素素有權(quán)值
20、值。對于于每一個個元素,統(tǒng)計一個區(qū)間中有多少元素比該元素大。這正是我們們比較熟熟悉的序序列上的的統(tǒng)計問問題。下下面我們們研究轉(zhuǎn)轉(zhuǎn)化后的的問題:【數(shù)據(jù)組織織方案一一】我們不對數(shù)數(shù)據(jù)進行行更深入入的組織織,直接接利用先先根遍歷歷序,強強制用數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)來進行行統(tǒng)計。當然我們可以構(gòu)造出一種比較有效的嵌套數(shù)據(jù)結(jié)構(gòu)以有序表為元素的線段樹,如圖:其中,線段段樹的每每一個節(jié)節(jié)點是對對應區(qū)間間的元素素以權(quán)值值為關鍵鍵字的有有序表。這樣,預處處理可以以用一個個歸并排排序,求求得樹上上所有區(qū)區(qū)間的有有序表。時時間復雜雜度為OO(Nllog22(N)。假設現(xiàn)在我我們要統(tǒng)統(tǒng)計一個個區(qū)間(長度為為L)。那么我們可可以用
21、llog22(L)的時時間找到到該區(qū)間間的所有有分解區(qū)區(qū)間(不超過過2logg2(L)個)。然后后在對每每個分解解區(qū)間進進行處理理:二分分查找在在該區(qū)間間中有多多少元素素的權(quán)值值比指定定的元素素的權(quán)值值大。然后把所有有分解區(qū)區(qū)間中比比給定元元素大的的元素個個數(shù)加起起來,即即為所求求。這樣每統(tǒng)計計一個元元素的復復雜度為為O(llog222(N)。總時時間復雜雜度為OO(Nllog222(N),空間間復雜度度為O(Nloog2(N)。【數(shù)據(jù)組織織方案二二】我們從特殊殊情況考考慮:假假設我們們在先根根遍歷序序中,需需要統(tǒng)計計元素kk,并且k所在區(qū)區(qū)間里的的元素都都比它大大。顯然,這時時比k大的元元素
22、個數(shù)數(shù)就是kk所在區(qū)區(qū)間中的的元素個個數(shù)。統(tǒng)統(tǒng)計區(qū)間間元素個個數(shù)我們們可以直直接利用用線段樹樹和樹狀狀數(shù)組。那么我們?nèi)缛绾伪WC證當前列列表中的的元素權(quán)權(quán)值都比比k的權(quán)值值大呢?我們重新組組織數(shù)據(jù)據(jù):所有有元素按按從大到到小的順順序排序序。然后后依次處處理每一一個元素素:先取取得所在在區(qū)間的的元素個個數(shù),再再將該元元素插入入。我們一個很很巧妙的的方法:從大到到小地向向線段樹樹里面加加入元素素,然后后統(tǒng)計區(qū)區(qū)間個數(shù)數(shù)。從大到小保保證了現(xiàn)現(xiàn)有的所所有元素素都比待待插入的的元素大大。所以以區(qū)間中中的元素素個數(shù)即即為比待待插入元元素大的的元素個個數(shù)。按照從大到到小的順順序之前前先對其其區(qū)間進進行統(tǒng)計計,
23、利用用線段樹樹或樹狀狀數(shù)組。這樣,我們們得到了了復雜度度為O(Nloog2(N)的算法法。WC20005何林林同學的的論文中中介紹了了此題的的另一解解法,復復雜度也也為O(Nloog2(N)。主要要思想是是也是利利用樹的的前根遍遍歷序,不不同的是是他的算算法是基基于容斥斥原理,需需要正反反兩次遍遍歷樹,而而我們這這里介紹紹的算法法是利用用了“組組織數(shù)據(jù)據(jù)的操作作順序”這一手段來實現(xiàn)的。有興趣的同學可以參見何林同學2005年的論文。“形態(tài)”和和“順序”這這兩種數(shù)數(shù)據(jù)組織織對象在在上面的的兩個例例題中分分別對我我們進行行了表演演。下面面我們再再來分析析一個更更經(jīng)典的的題目:例三航航線規(guī)劃劃【題意描
24、述述】給出一個有有N個點M條邊的無無向圖,兩兩點之間間可能有有多條邊邊,然后后給出QQ個命令令,命令令共有如如下兩種種:1 A BB表示刪除一一條A到B的邊2 A BB表示詢問AAB間共共有多少少條關鍵鍵邊(即即刪除改改邊后使使得ABB不連通通)數(shù)據(jù)保證任任意時刻刻圖都是是連通的的。1 N 3 * 11041 M 10051 Q 1005【問題分析析】顯然,我們們可以輕輕松地設設計出一一個樸素素的算法法:用隊列保存存所有邊邊,當遇遇到刪邊邊操作時時加上刪刪除標記記(利用用HASSH我們們可以做做到O(1),遇到到詢問操操作時則則枚舉刪刪邊然后后用并查查集判斷斷AB是否否連通。這這個算法法處理刪
25、刪邊的復復雜度為為O(11),處理詢問問的復雜度度為O(M2),空間間復雜度度為O(M+NN)。我們經(jīng)過思思考后發(fā)發(fā)現(xiàn),事事實上所所謂的關關鍵邊都都是圖上上的橋(由題目目中的描描述我們們很容易易想到)。而橋橋的數(shù)量量是O(N)級級別的。利用上面的的結(jié)論,我我們顯然然可以先先用O(E)的的時間求求出圖中中所有的的橋,然然后再用用O(NN2)的時間間求出AAB間的的關鍵邊邊的數(shù)量量。然而,我們們所優(yōu)化化后的程程序依然然有很高高的時間間復雜度度,根本本不能勝勝任此題題。我們繼續(xù)思思考:樹上的任意意兩點間間只有一一條路徑徑。也就是說樹樹上的任任意一條條邊都是是關鍵邊邊。這跟跟我們的的題目有有什么關關系
26、呢?顯然,同同一個重重連通分分量(塊)中的任任意兩點點之間都都沒有關關鍵邊。并且,對于于兩個不不同的重重連通分分量M11,M22:在進進行刪邊邊操作以以前,詢詢問任意意分屬這這兩個分分量的兩兩點AM11,BMM2,詢詢問的結(jié)結(jié)果都是是一樣的的,即結(jié)結(jié)果只跟跟分量間間的邊有有關系。也就是說,一個重連通分量可以當作整體來考慮。【初步組織織數(shù)據(jù)】由前面的思思考,我我們把圖圖中的重重連分量量都“縮縮”成一一個點。構(gòu)構(gòu)成一個個新圖,顯顯然,新新圖是一一棵樹。如下:這樣,對于于AB的的詢問:若AB屬于于同一個個重連通通分量,則則沒有關關鍵邊。若AB屬于于不同的的重連通通分量,則則轉(zhuǎn)化為為求兩個個樹上節(jié)節(jié)點
27、的距距離。求樹上兩個個節(jié)點的的距離我我們有現(xiàn)現(xiàn)成的辦辦法,定定義:DepthhA為節(jié)點點A的深深度LCA(AA,B)為節(jié)點點A和節(jié)節(jié)點B的的最近公公共祖先先。那么AB間間的距離離Diss(A,B)=DeppthA+DeppthB-2*DDeptthLLCA(A,BB)注意一個細細節(jié),即即我們把把一個重重連通分分量“縮縮”成一一個節(jié)點點時,事事實上是是把分量量里面的的所有點點的深度度都設為為它們中中最小的的那個深深度,即即往上提提升(在在同一個個重連通通分量中中以深度度最小的的點作其其它點的的代表)。如此一來,對對于一個個現(xiàn)成的的圖,我我們可以以很快地地求出兩兩點間的的關鍵邊邊數(shù)量了了。預處理即
28、為為一個求求重連通通分量的的操作,時時間復雜雜度為OO(M)。而對于每一一個詢問問我們都都可以OO(1)完成回回答。但事實上這這道題目目中的圖圖是隨時時變化的的(有刪刪邊操作作),這這樣我們們就不太太好處理理了。如果每次都都求一次次塊的話話,復雜雜度會很很高。我我們思考考怎么處處理這個個問題:刪邊操操作會導導致塊的的分裂。我我們當然然可以只只對被刪刪邊所在在的塊進進行處理理,但是是最壞情情況下還還是和每每次求一一次塊是是一樣的的。【進一步組組織數(shù)據(jù)據(jù)】現(xiàn)在的問題題是我們們需要快快速地將將一個塊塊進行重重新求塊塊,似乎乎是沒有有現(xiàn)成的的辦法。但但是如果果操作不不是刪邊邊,而是是加邊呢呢?顯然,在
29、一一棵樹上上加上一一條邊,必必然產(chǎn)生生環(huán),伴伴隨著的的就是新新的重連連通分量量產(chǎn)生。我們只需要要將幾個個有關的的塊進行行合并。換換句話說說,就是是把一些些點的位位置抬高高,并把把它們合合并成一一個塊。如如下圖:比如我們加加入一條條邊ABB,T=LCAA(A,B),那那么我們們的環(huán)上上的節(jié)點點即為AA到T的的路徑中中和B到到T的路路徑中的的節(jié)點。我我們需要要把環(huán)上上的節(jié)點點的深度度都減小小到DeepthhT,并且且,我們們提升一一個節(jié)點點,其子子孫節(jié)點點也要一一同被提提升相同同的高度度。我們研究發(fā)發(fā)現(xiàn),如如果操作作是加邊邊的話,我我們似乎乎可以很很高效地地處理。那么我們當當然可以以把操作作反過來
30、來處理(先處理理后面的的操作),這樣樣就可以以實現(xiàn)我我們所要要達到我我們所期期望的結(jié)結(jié)果操作變變?yōu)橹挥杏屑舆吅秃驮儐枴,F(xiàn)在我們來來考慮細細節(jié)實現(xiàn)現(xiàn):我們需要用用到LCCA,當當然可以以用中序序遍歷+RMQQ實現(xiàn)。而而且,加加邊操作作并不影影響LCCA。然后我們還還有一個個提升一一棵子樹樹的高度度的操作作。即把把一棵子子樹的所所有節(jié)點點的Deetphh都減去去同一個個數(shù)。顯然,我們們可以求求出樹的的先根遍遍歷序。這這樣,同同一棵子子樹構(gòu)成成一個連連續(xù)區(qū)間間。利用用線段樹樹或樹狀狀數(shù)組我我們就可可以用OO(loog2(N)的時時間完成成這項操操作。【小結(jié)】這是一道很很經(jīng)典的的題目。我我們最初初利用
31、“收收縮”的的思想,把把圖整理理成為一一棵樹,然然后又巧巧妙地將將數(shù)據(jù)從從后往前前處理,把把原題中中的“刪刪邊操作作”操作作變成了了“加邊邊操作”。既有“形態(tài)”,又有“順序”上的考慮。在細節(jié)實現(xiàn)中,我們又利用了樹的兩大遍歷序中序遍歷和前序遍歷,把樹上的求LCA操作和提升子樹的操作變成了序列上的求RMQ操作和給一個區(qū)間所有元素減去一個值的操作。無處不體現(xiàn)出“對數(shù)據(jù)的合理組織”。【總結(jié)】“對數(shù)據(jù)的的合理組組織”無處不不在,它它不僅僅僅是一種種手段,更更是競賽賽的一種種思考方方向。在在數(shù)據(jù)關關系越來來越復雜雜,解題題模型越越來越不不明顯的的信息學學競賽中中,合理理地組織織了數(shù)據(jù)據(jù),就可可以說離離成功
32、只只有一步步之遙了了。我們在被告告知一個個很巧妙妙的算法法時,感感興趣的的除了算算法本身身之外,還有就是算法的設計者到底是怎么想到這個算法的。甚至,我們往往對后者所產(chǎn)生的興趣超過前者。這正是我們前進的動力,思想的源泉。多思考、多多總結(jié)、勇于探索、不斷創(chuàng)新!【參考資料料】算法藝術(shù)術(shù)與信息息學競賽賽劉汝汝佳黃亮亮著2005年年國家集集訓隊論論文數(shù)數(shù)據(jù)關系系的簡化化何林林【感謝】感謝葉詩富富老師對對我的指指導和幫幫助。感謝古楠同同學和王王曉珂同同學對我我的論文文提出了了很好的的建議。【附錄】金明的預算算方案 NOIP2006【題目描述述】金明今天很很開心,家家里購置置的新房房就要領領鑰匙了了,新房房
33、里有一一間金明明自己專專用的很很寬敞的的房間。更更讓他高高興的是是,媽媽媽昨天對對他說:“你的房房間需要要購買哪哪些物品品,怎么么布置,你你說了算算,只要要不超過過N元錢就就行”。今天天一早,金金明就開開始做預預算了,他他把想買買的物品品分為兩兩類:主主件與附附件,附附件是從從屬于某某個主件件的,下下表就是是一些主主件與附附件的例例子:主件附件電腦打印機,掃掃描儀書柜圖書書桌臺燈,文文具工作椅無如果要買歸歸類為附附件的物物品,必必須先買買該附件件所屬的的主件。每每個主件件可以有有0個、1個或2個附件件。附件件不再有有從屬于于自己的的附件。金金明想買買的東西西很多,肯肯定會超超過媽媽媽限定的的N
34、元。于于是,他他把每件件物品規(guī)規(guī)定了一一個重要要度,分分為5等:用用整數(shù)115表表示,第第5等最重重要。他他還從因因特網(wǎng)上上查到了了每件物物品的價價格(都都是100元的整整數(shù)倍)。他他希望在在不超過過N元(可可以等于于N元)的的前提下下,使每每件物品品的價格格與重要要度的乘乘積的總總和最大大。設第jj件物品品的價格格為vj,重重要度為為wjj,共共選中了了k件物品品,編號號依次為為j1,j2,jk,則則所求的的總和為為:vj1*wj1+vj2*wj2+ +vjk*wjk。(其其中*為乘號號)請你幫幫助金明明設計一一個滿足足要求的的購物單單。【輸入文件件】輸入文文件buudgeet.iin 的的
35、第1行,為為兩個正正整數(shù),用用一個空空格隔開開:N m(其其中N(3220000)表示示總錢數(shù)數(shù),m(600)為希希望購買買物品的的個數(shù)。)從第22行到第第m+11行,第第j行給出出了編號號為j-1的物物品的基基本數(shù)據(jù)據(jù),每行行有3個非負負整數(shù)v p q(其其中v表示該該物品的的價格(v0,表示該物品為附件,q是所屬主件的編號)【輸出文件件】輸出文文件buudgeet.oout只只有一個個正整數(shù)數(shù),為不不超過總總錢數(shù)的的物品的的價格與與重要度度乘積的的總和的的最大值值(22000000)。【輸入樣例例】10000 58000 22 04400 5 113000 5 14000 33 05500
36、 2 00【輸出樣例例】22200樹的果實 NOI2004浙江省隊選拔賽題目【題目描述述】森林中生長長著許多多奇特的的果樹,它它們不僅僅外形獨獨特,其其果實更更是可口口。這天天,兩只只小蟲NNileeh和Nixxed決決定一起起分享一一棵果樹樹。他們們從一直直辛勤工工作到下下午,終終于把這這棵果樹樹鋸倒了了。他們觀察著著這棵果果樹,果果樹開始始端是是露出地地面的根根部,接接著像其其他果樹樹一樣,有有著諸多多分叉(如如圖3所示就就是一棵棵果樹),在在每個分分叉處生生長著果果實,自自然Niilehh和Nixxeddd的食物物就是這這些果實實了!他他們準備備把果樹樹分成兩兩部分,每每個蟲蟲蟲得到各各
37、自的一一部分,兩兩分果樹樹的方法法就是選選擇一個個分叉點點,蟲蟲蟲將他們們咬斷(自自然分叉叉點上的的果實也也被扔掉掉了),這這樣果樹樹就被分分成兩部部分(每每個部分分不一定定是連在在一起的的):分分叉點上上面的部部分和分分叉點的的下面部部分。NNileeh和Nixxed就就會各自自選一個個部分吃吃啦!比比如對于于左邊這這棵樹,如如果他們們咬掉藍藍色的果果子,那那么就被被分為紅紅色和黃黃色的兩兩個部分分。考慮到被咬咬掉的果果子會被被浪費,他他們想盡盡可能地地減少浪浪費,于于是蟲蟲蟲給每個個果子一一個美味味值,對對于每個個果子,他他們決定定計算如如果咬掉掉這個果果子,上上面部分分、下面面部分和和從
38、樹根根到這個個分叉點點的路徑徑中比這這個果子子更美味味的果子子各有多多少個。他他們以此此來選擇擇最終要要被咬掉掉的果子子是哪一一個。遺遺憾的是是果樹可可能很龐龐大,而而小蟲幾幾乎是不不會計算算的,身身為程序序員的你你幫幫他他們吧。【輸入格式式】輸入文件第第一行是是一個整整數(shù)n(n=1055)表示示樹的分分叉數(shù)(包包括樹根根)輸入文件的的第i行一個個數(shù)pii,表示示分叉ii的上一一級分叉叉的編號號(piii)。(號分叉叉即樹根根,它沒沒有上級級分叉點點)輸入文件的的第n+i(11=ii=nn)行一一個正數(shù)數(shù)ai,表示生生長在ii號分叉叉上的果果實的美美味值。(每每個果子子的美味味值不相相等)【輸出格式式】輸出共n行行,每行行三個數(shù)數(shù),分別別表示咬咬掉第ii個果
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專用設備在促進日用品行業(yè)產(chǎn)業(yè)升級中的作用考核試卷
- 街舞社團面試題及答案
- 假期規(guī)劃測試題及答案
- 酒量趣味測試題及答案
- 小學生的考試試題及答案
- 沙洲中學面試題及答案
- 導管室考試題及答案
- 浙江省金華市2024-2025學年高一下學期期末測試英語試卷
- 統(tǒng)一大市場的倉儲布局規(guī)劃
- 《 現(xiàn)代質(zhì)量管理(第3版)》-04 服務質(zhì)量管理
- 2025年拍賣師資格(紙筆作答)高頻題庫新版
- 2025貴州省專業(yè)技術(shù)人員繼續(xù)教育公需科目考試題庫(2025公需課課程)
- 2025春季學期國開電大本科《商務英語3》一平臺在線形考(綜合測試)試題及答案
- 網(wǎng)課智慧樹知道《人工智能引論(浙江大學)》章節(jié)測試答案
- 藝術(shù)概論:第八章綜合藝術(shù)
- 云南省臨滄市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 新人教版九年級物理全冊知識點總結(jié)(課堂筆記)
- DB13T 5519.7-2022 軌道交通AFC系統(tǒng)線網(wǎng)技術(shù)要求 第7部分:數(shù)據(jù)接口
- 駐戈壁某部隊糖尿病流行病學調(diào)查
- 《網(wǎng)店運營與管理》整本書電子教案全套教學教案
- 中考《紅星照耀中國》各篇章練習題及答案(1-12)
評論
0/150
提交評論