線段樹延遲標(biāo)記精講

轉(zhuǎn)自:http://www.cnblogs.com/TenosDoIt/p/3453089.html#b

一 概述

線段樹误续,類似區(qū)間樹,是一個(gè)完全二叉樹栽烂,它在各個(gè)節(jié)點(diǎn)保存一條線段(數(shù)組中的一段子數(shù)組),主要用于高效解決連續(xù)區(qū)間的動(dòng)態(tài)查詢問題怀喉,由于二叉結(jié)構(gòu)的特性躬拢,它基本能保持每個(gè)操作的復(fù)雜度為O(logn)。

線段樹的每個(gè)節(jié)點(diǎn)表示一個(gè)區(qū)間馅袁,子節(jié)點(diǎn)則分別表示父節(jié)點(diǎn)的左右半?yún)^(qū)間犹褒,例如父親的區(qū)間是[a,b],那么(c=(a+b)/2)左兒子的區(qū)間是[a,c]宙枷,右兒子的區(qū)間是[c+1,b]慰丛。

二 從一個(gè)例子理解線段樹

下面我們從一個(gè)經(jīng)典的例子來了解線段樹,問題描述如下:從數(shù)組arr[0...n-1]中查找某個(gè)數(shù)組某個(gè)區(qū)間內(nèi)的最小值贤笆,其中數(shù)組大小固定,但是數(shù)組中的元素的值可以隨時(shí)更新恤左。

對這個(gè)問題一個(gè)簡單的解法是:遍歷數(shù)組區(qū)間找到最小值,時(shí)間復(fù)雜度是O(n),額外的空間復(fù)雜度O(1)链患。當(dāng)數(shù)據(jù)量特別大,而查詢操作很頻繁的時(shí)候贸毕,耗時(shí)可能會(huì)不滿足需求。

另一種解法:使用一個(gè)二維數(shù)組來保存提前計(jì)算好的區(qū)間[i,j]內(nèi)的最小值摊腋,那么預(yù)處理時(shí)間為O(n^2)兴蒸,查詢耗時(shí)O(1), 但是需要額外的O(n^2)空間蕾殴,當(dāng)數(shù)據(jù)量很大時(shí),這個(gè)空間消耗是龐大的议谷,而且當(dāng)改變了數(shù)組中的某一個(gè)值時(shí)卧晓,更新二維數(shù)組中的最小值也很麻煩。

我們可以用線段樹來解決這個(gè)問題:預(yù)處理耗時(shí)O(n)胜宇,查詢、更新操作O(logn)从诲,需要額外的空間O(n)。根據(jù)這個(gè)問題我們構(gòu)造如下的二叉樹
葉子節(jié)點(diǎn)是原始組數(shù)arr中的元素
非葉子節(jié)點(diǎn)代表它的所有子孫葉子節(jié)點(diǎn)所在區(qū)間的最小值

例如對于數(shù)組[2, 5, 1, 4, 9, 3]可以構(gòu)造如下的二叉樹(背景為白色表示葉子節(jié)點(diǎn)描扯,非葉子節(jié)點(diǎn)的值是其對應(yīng)數(shù)組區(qū)間內(nèi)的最小值,例如根節(jié)點(diǎn)表示數(shù)組區(qū)間arr[0...5]內(nèi)的最小值是1):
i

由于線段樹的父節(jié)點(diǎn)區(qū)間是平均分割到左右子樹宫峦,因此線段樹是完全二叉樹导绷,對于包含n個(gè)葉子節(jié)點(diǎn)的完全二叉樹,它一定有n-1個(gè)非葉節(jié)點(diǎn)檐盟,總共2n-1個(gè)節(jié)點(diǎn),因此存儲(chǔ)線段是需要的空間復(fù)雜度是O(n)羡忘。那么線段樹的操作:創(chuàng)建線段樹、查詢漫雕、節(jié)點(diǎn)更新 是如何運(yùn)作的呢(以下所有代碼都是針對求區(qū)間最小值問題)浸间?

2.1 創(chuàng)建線段樹

對于線段樹我們可以選擇和普通二叉樹一樣的鏈?zhǔn)浇Y(jié)構(gòu)躺彬。由于線段樹是完全二叉樹仿野,我們也可以用數(shù)組來存儲(chǔ)脚作,下面的討論及代碼都是數(shù)組來存儲(chǔ)線段樹劣针,節(jié)點(diǎn)結(jié)構(gòu)如下(注意到用數(shù)組存儲(chǔ)時(shí),有效空間為2n-1,實(shí)際空間確不止這么多襟己,比如上面的線段樹中葉子節(jié)點(diǎn)1擎浴、3雖然沒有左右子樹,但是的確占用了數(shù)組空間萌狂,實(shí)際空間是滿二叉樹的節(jié)點(diǎn)數(shù)目: 2 * 2 ^{\lceil \log_2{n} \rceil} - 1, \lceil \log_2{n} \rceil 是樹的高度务傲,但是這個(gè)空間復(fù)雜度也是O(n)的 )售葡。

struct SegTreeNode

{

int val;

};

定義包含n個(gè)節(jié)點(diǎn)的線段樹 SegTreeNode segTree[n]尖阔,segTree[0]表示根節(jié)點(diǎn)。那么對于節(jié)點(diǎn)segTree[i]齿坷,它的左孩子是segTree[2i+1],右孩子是segTree[2i+2]永淌。

我們可以從根節(jié)點(diǎn)開始照雁,平分區(qū)間饺蚊,遞歸的創(chuàng)建線段樹,線段樹的創(chuàng)建函數(shù)如下:

 1 const int MAXNUM = 1000;
 2 struct SegTreeNode
 3 {
 4     int val;
 5 }segTree[MAXNUM];//定義線段樹
 6 
 7 
14 void build(int root, int arr[], int istart, int iend)
15 {
16     if(istart == iend)//葉子節(jié)點(diǎn)
17         segTree[root].val = arr[istart];
18     else
19     {
20         int mid = (istart + iend) / 2;
21         build(root*2+1, arr, istart, mid);//遞歸構(gòu)造左子樹
22         build(root*2+2, arr, mid+1, iend);//遞歸構(gòu)造右子樹
23         //根據(jù)左右子樹根節(jié)點(diǎn)的值,更新當(dāng)前根節(jié)點(diǎn)的值
24         segTree[root].val = min(segTree[root*2+1].val, segTree[root*2+2].val);
25     }
26 }

2.2 查詢線段樹

已經(jīng)構(gòu)建好了線段樹苗缩,那么怎樣在它上面超找某個(gè)區(qū)間的最小值呢?查詢的思想是選出一些區(qū)間泻肯,使他們相連后恰好涵蓋整個(gè)查詢區(qū)間灶挟,因此線段樹適合解決“相鄰的區(qū)間的信息可以被合并成兩個(gè)區(qū)間的并區(qū)間的信息”的問題稚铣。代碼如下,具體見代碼解釋

 7 int query(int root, int nstart, int nend, int qstart, int qend)
 8 {
 9     //查詢區(qū)間和當(dāng)前節(jié)點(diǎn)區(qū)間沒有交集
10     if(qstart > nend || qend <<span style="font-family: 'Courier New' !important;"> nstart)
11         return INFINITE;
12     //當(dāng)前節(jié)點(diǎn)區(qū)間包含在查詢區(qū)間內(nèi)
13     if(qstart <= nstart && qend >= nend)
14         return segTree[root].val;
15     //分別從左右子樹查詢,返回兩者查詢結(jié)果的較小值
16     int mid = (nstart + nend) / 2;
17     return min(query(root*2+1, nstart, mid, qstart, qend),
18                query(root*2+2, mid + 1, nend, qstart, qend));
19 
20 }

舉例說明(對照上面的二叉樹):

1、當(dāng)我們要查詢區(qū)間[0,2]的最小值時(shí)椒楣,從根節(jié)點(diǎn)開始捧灰,要分別查詢左右子樹,查詢左子樹時(shí)節(jié)點(diǎn)區(qū)間[0,2]包含在查詢區(qū)間[0,2]內(nèi)煌寇,返回當(dāng)前節(jié)點(diǎn)的值1,查詢右子樹時(shí)银锻,節(jié)點(diǎn)區(qū)間[3,5]和查詢區(qū)間[0,2]沒有交集,返回正無窮INFINITE掉弛,查詢結(jié)果取兩子樹查詢結(jié)果的較小值1殃饿,因此結(jié)果是1.

2芋肠、查詢區(qū)間[0,3]時(shí)帖池,從根節(jié)點(diǎn)開始肴甸,查詢左子樹的節(jié)點(diǎn)區(qū)間[0,2]包含在區(qū)間[0,3]內(nèi)友扰,返回當(dāng)前節(jié)點(diǎn)的值1村怪;查詢右子樹時(shí)甚负,繼續(xù)遞歸查詢右子樹的左右子樹搅轿,查詢到非葉節(jié)點(diǎn)4時(shí)没宾,又要繼續(xù)遞歸查詢:葉子節(jié)點(diǎn)4的節(jié)點(diǎn)區(qū)間[3,3]包含在查詢區(qū)間[0,3]內(nèi),返回4会钝,葉子節(jié)點(diǎn)9的節(jié)點(diǎn)區(qū)間[4,4]和[0,3]沒有交集俭正,返回INFINITE,因此非葉節(jié)點(diǎn)4返回的是min(4, INFINITE) = 4,葉子節(jié)點(diǎn)3的節(jié)點(diǎn)區(qū)間[5,5]和[0,3]沒有交集澡罚,返回INFINITE,因此非葉節(jié)點(diǎn)3返回min(4, INFINITE) = 4, 因此根節(jié)點(diǎn)返回 min(1,4) = 1。

2.3單節(jié)點(diǎn)更新

單節(jié)點(diǎn)更新是指只更新線段樹的某個(gè)葉子節(jié)點(diǎn)的值肾请,但是更新葉子節(jié)點(diǎn)會(huì)對其父節(jié)點(diǎn)的值產(chǎn)生影響留搔,因此更新子節(jié)點(diǎn)后,要回溯更新其父節(jié)點(diǎn)的值铛铁。


 1 
 8 void updateOne(int root, int nstart, int nend, int index, int addVal)
 9 {
10     if(nstart == nend)
11     {
12         if(index == nstart)//找到了相應(yīng)的節(jié)點(diǎn)隔显,更新之
13             segTree[root].val += addVal;
14         return;
15     }
16     int mid = (nstart + nend) / 2;
17     if(index <= mid)//在左子樹中更新
18         updateOne(root*2+1, nstart, mid, index, addVal);
19     else updateOne(root*2+2, mid+1, nend, index, addVal);//在右子樹中更新
20     //根據(jù)左右子樹的值回溯更新當(dāng)前節(jié)點(diǎn)的值
21     segTree[root].val = min(segTree[root*2+1].val, segTree[root*2+2].val);
22 }

比如我們要更新葉子節(jié)點(diǎn)4(addVal = 6),更新后值變?yōu)?0,那么其父節(jié)點(diǎn)的值從4變?yōu)?哺窄,非葉結(jié)點(diǎn)3的值更新后不變生年,根節(jié)點(diǎn)更新后也不變。

2.4 區(qū)間更新

區(qū)間更新是指更新某個(gè)區(qū)間內(nèi)的葉子節(jié)點(diǎn)的值,因?yàn)樯婕暗降娜~子節(jié)點(diǎn)不止一個(gè)挑格,而葉子節(jié)點(diǎn)會(huì)影響其相應(yīng)的非葉父節(jié)點(diǎn)仪或,那么回溯需要更新的非葉子節(jié)點(diǎn)也會(huì)有很多旨巷,如果一次性更新完,操作的時(shí)間復(fù)雜度肯定不是O(lgn),例如當(dāng)我們要更新區(qū)間[0,3]內(nèi)的葉子節(jié)點(diǎn)時(shí)辆沦,需要更新出了葉子節(jié)點(diǎn)3,9外的所有其他節(jié)點(diǎn)郊闯。為此引入了線段樹中的延遲標(biāo)記概念,這也是線段樹的精華所在害捕。

延遲標(biāo)記:每個(gè)節(jié)點(diǎn)新增加一個(gè)標(biāo)記殿漠,記錄這個(gè)節(jié)點(diǎn)是否進(jìn)行了某種修改(這種修改操作會(huì)影響其子節(jié)點(diǎn)),對于任意區(qū)間的修改仪吧,我們先按照區(qū)間查詢的方式將其劃分成線段樹中的節(jié)點(diǎn),然后修改這些節(jié)點(diǎn)的信息,并給這些節(jié)點(diǎn)標(biāo)記上代表這種修改操作的標(biāo)記狞贱。在修改和查詢的時(shí)候别垮,如果我們到了一個(gè)節(jié)點(diǎn)p老充,并且決定考慮其子節(jié)點(diǎn)廷粒,那么我們就要看節(jié)點(diǎn)p是否被標(biāo)記,如果有派阱,就要按照標(biāo)記修改其子節(jié)點(diǎn)的信息,并且給子節(jié)點(diǎn)都標(biāo)上相同的標(biāo)記芋酌,同時(shí)消掉節(jié)點(diǎn)p的標(biāo)記旱易。

因此需要在線段樹結(jié)構(gòu)中加入延遲標(biāo)記域妄迁,本文例子中我們加入標(biāo)記與addMark,表示節(jié)點(diǎn)的子孫節(jié)點(diǎn)在原來的值的基礎(chǔ)上加上addMark的值度苔,同時(shí)還需要修改創(chuàng)建函數(shù)build 和 查詢函數(shù) query,修改的代碼用紅色字體表示,其中區(qū)間更新的函數(shù)為update鸥诽,代碼如下:


  1 const int INFINITE = INT_MAX;
  2 const int MAXNUM = 1000;
  3 struct SegTreeNode
  4 {
  5     int val;
  6     int addMark;//延遲標(biāo)記
  7 }segTree[MAXNUM];//定義線段樹
  8 
  9 
 16 void build(int root, int arr[], int istart, int iend)
 17 {
 18     segTree[root].addMark = 0;//----設(shè)置標(biāo)延遲記域
 19     if(istart == iend)//葉子節(jié)點(diǎn)
 20         segTree[root].val = arr[istart];
 21     else
 22     {
 23         int mid = (istart + iend) / 2;
 24         build(root*2+1, arr, istart, mid);//遞歸構(gòu)造左子樹
 25         build(root*2+2, arr, mid+1, iend);//遞歸構(gòu)造右子樹
 26         //根據(jù)左右子樹根節(jié)點(diǎn)的值,更新當(dāng)前根節(jié)點(diǎn)的值
 27         segTree[root].val = min(segTree[root*2+1].val, segTree[root*2+2].val);
 28     }
 29 }
 30 
 31 
 35 void pushDown(int root)
 36 {
 37     if(segTree[root].addMark != 0)
 38     {
 39         //設(shè)置左右孩子節(jié)點(diǎn)的標(biāo)志域,因?yàn)楹⒆庸?jié)點(diǎn)可能被多次延遲標(biāo)記又沒有向下傳遞
 40         //所以是 “+=”
 41         segTree[root*2+1].addMark += segTree[root].addMark;
 42         segTree[root*2+2].addMark += segTree[root].addMark;
 43         //根據(jù)標(biāo)志域設(shè)置孩子節(jié)點(diǎn)的值撒汉。因?yàn)槲覀兪乔髤^(qū)間最小值,因此當(dāng)區(qū)間內(nèi)每個(gè)元
 44         //素加上一個(gè)值時(shí)逗概,區(qū)間的最小值也加上這個(gè)值
 45         segTree[root*2+1].val += segTree[root].addMark;
 46         segTree[root*2+2].val += segTree[root].addMark;
 47         //傳遞后怀偷,當(dāng)前節(jié)點(diǎn)標(biāo)記域清空
 48         segTree[root].addMark = 0;
 49     }
 50 }
 51 
 52 
 58 int query(int root, int nstart, int nend, int qstart, int qend)
 59 {
 60     //查詢區(qū)間和當(dāng)前節(jié)點(diǎn)區(qū)間沒有交集
 61     if(qstart > nend || qend <<span style="font-family: 'Courier New' !important;"> nstart)
 62         return INFINITE;
 63     //當(dāng)前節(jié)點(diǎn)區(qū)間包含在查詢區(qū)間內(nèi)
 64     if(qstart <= nstart && qend >= nend)
 65         return segTree[root].val;
 66     //分別從左右子樹查詢恋捆,返回兩者查詢結(jié)果的較小值
 67     pushDown(root); //----延遲標(biāo)志域向下傳遞
 68     int mid = (nstart + nend) / 2;
 69     return min(query(root*2+1, nstart, mid, qstart, qend),
 70                query(root*2+2, mid + 1, nend, qstart, qend));
 71 
 72 }
 73 
 74 
 81 void update(int root, int nstart, int nend, int ustart, int uend, int addVal)
 82 {
 83     //更新區(qū)間和當(dāng)前節(jié)點(diǎn)區(qū)間沒有交集
 84     if(ustart > nend || uend <<span style="font-family: 'Courier New' !important;"> nstart)
 85         return ;
 86     //當(dāng)前節(jié)點(diǎn)區(qū)間包含在更新區(qū)間內(nèi)
 87     if(ustart <= nstart && uend >= nend)
 88     {
 89         segTree[root].addMark += addVal;
 90         segTree[root].val += addVal;
 91         return ;
 92     }
 93     pushDown(root); //延遲標(biāo)記向下傳遞
 94     //更新左右孩子節(jié)點(diǎn)
 95     int mid = (nstart + nend) / 2;
 96     update(root*2+1, nstart, mid, ustart, uend, addVal);
 97     update(root*2+2, mid+1, nend, ustart, uend, addVal);
 98     //根據(jù)左右子樹的值回溯更新當(dāng)前節(jié)點(diǎn)的值
 99     segTree[root].val = min(segTree[root*2+1].val, segTree[root*2+2].val);
100 }

區(qū)間更新舉例說明:當(dāng)我們要對區(qū)間[0,2]的葉子節(jié)點(diǎn)增加2矩欠,利用區(qū)間查詢的方法從根節(jié)點(diǎn)開始找到了非葉子節(jié)點(diǎn)[0-2]庞瘸,把它的值設(shè)置為1+2 = 3彤灶,并且把它的延遲標(biāo)記設(shè)置為2,更新完畢;當(dāng)我們要查詢區(qū)間[0,1]內(nèi)的最小值時(shí)刽酱,查找到區(qū)間[0,2]時(shí),發(fā)現(xiàn)它的標(biāo)記不為0娜氏,并且還要向下搜索,因此要把標(biāo)記向下傳遞记餐,把節(jié)點(diǎn)[0-1]的值設(shè)置為2+2 = 4猴仑,標(biāo)記設(shè)置為2朱浴,節(jié)點(diǎn)[2-2]的值設(shè)置為1+2 = 3芝囤,標(biāo)記設(shè)置為2(其實(shí)葉子節(jié)點(diǎn)的標(biāo)志是不起作用的先壕,這里是為了操作的一致性)瘩扼,然后返回查詢結(jié)果:[0-1]節(jié)點(diǎn)的值4;當(dāng)我們再次更新區(qū)間[0,1](增加3)時(shí)垃僚,查詢到節(jié)點(diǎn)[0-1],發(fā)現(xiàn)它的標(biāo)記值為2集绰,因此把它的標(biāo)記值設(shè)置為2+3 = 5,節(jié)點(diǎn)的值設(shè)置為4+3 = 7谆棺;

其實(shí)當(dāng)區(qū)間更新的區(qū)間左右值相等時(shí)([i,i])栽燕,就相當(dāng)于單節(jié)點(diǎn)更新,單節(jié)點(diǎn)更新只是區(qū)間更新的特例改淑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碍岔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溅固,更是在濱河造成了極大的恐慌付秕,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侍郭,死亡現(xiàn)場離奇詭異询吴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亮元,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門猛计,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爆捞,你說我怎么就攤上這事奉瘤。” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵盗温,是天一觀的道長藕赞。 經(jīng)常有香客問我,道長卖局,這世上最難降的妖魔是什么斧蜕? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮砚偶,結(jié)果婚禮上批销,老公的妹妹穿的比我還像新娘。我一直安慰自己染坯,他們只是感情好均芽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著单鹿,像睡著了一般掀宋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羞反,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天布朦,我揣著相機(jī)與錄音,去河邊找鬼昼窗。 笑死是趴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澄惊。 我是一名探鬼主播唆途,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掸驱!你這毒婦竟也來了肛搬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤毕贼,失蹤者是張志新(化名)和其女友劉穎温赔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鬼癣,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陶贼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了待秃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拜秧。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖章郁,靈堂內(nèi)的尸體忽然破棺而出枉氮,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布聊替,位于F島的核電站楼肪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏佃牛。R本人自食惡果不足惜淹辞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俘侠。 院中可真熱鬧,春花似錦蔬将、人聲如沸爷速。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫东。三九已至,卻和暖如春毙石,著一層夾襖步出監(jiān)牢的瞬間廉沮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工徐矩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滞时,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓滤灯,卻偏偏與公主長得像坪稽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鳞骤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 歸去來兮窒百。 1.1 說明 本篇為《挑戰(zhàn)程序設(shè)計(jì)競賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,296評論 0 160
  • 1 序 2016年6月25日夜,帝都豫尽,天下著大雨篙梢,拖著行李箱和同學(xué)在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,078評論 0 12
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子美旧。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外渤滞,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,199評論 0 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)陈症,斷路器蔼水,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 其實(shí),父親不抽煙的录肯。只在將醉未醉之際趴腋,點(diǎn)上一支,亂吸幾口罷了。 但這并不妨礙我從他身上偷學(xué)這樣的壞習(xí)慣优炬。喝酒颁井、抽煙...
    牧心_f2c3閱讀 331評論 0 11