導航:首頁 > 創造發明 > 線段樹的發明者

線段樹的發明者

發布時間:2021-07-07 07:00:57

① 高級數據結構中,線段樹在現實項目中有用到嗎

相信對演算法設計或者數據結構有一定了解的人對線段樹都不會太陌生。它是能夠在log(MaxLen)時間內完成線段的添加、刪除、查詢等操作。但一般的實現都有點復雜而線段樹應用中有一種是專門針對點的。(點樹?)它的實現卻非常簡單。這種數據結構有什麼用?我們先來考慮一下下面的需求(全部要求在LogN時間內完成):如何知道一個點在一個點集里的大小「排名」?很簡單,開一個點數組,排個序,再二分查找就行了;如何在一個點集內動態增刪點?也很簡單,弄個平衡樹就行了(本來平衡樹比線段樹復雜得多,但自從世界上有了STLset這么個好東東,就……^_^)那如果我既要動態增刪點,也要隨時查詢到一個點的排名呢?那對不起,可能就要出動到我們的「點樹」了。其實現原理很簡單:每當增加(或刪除)一個大小為X的點時,就在樹上添加(或刪除)一條(X,MaxLen)的線段(不含端點),當要查詢一個點的排名時,只要看看其上有多少條線段就可以了。針對這一需求,這里有個非常簡單的實現(見以下代碼,十多行,夠短了吧?)其中clear()用於清空點集;add()用於添加一個點;cntLs()返回小於n的點的個數,也就是n的升序排名,類似地cntGt是降序排名。這個點樹有什麼用呢?其中一個應用時在O(NlogN)時間內求出一個排列的逆序數(tGt(x);然後再add(x)。這個實現還可以進行一些擴展。比如刪除del(intn),只要把add(intn)中的++size換成--size,把a[i/2]++改成a[i/2]--即可。另外還可以通過二分查找功能在O(logN)時間內查到排名第n的點的大小。應該也可以三四行內搞定。補充:楊弋同學在2008年信息學奧賽冬令營上新發明了一種線段樹的省空間堆式存儲法,具體方法可以見08年冬令營課件.template//表示可用區間為[0,N),其中N必須是2的冪數;classPointTree{inta[2*N];

② 樹狀數組和線段樹有什麼區別

時間復雜度一樣,但是樹狀數組常數小;
適用問題兩者一樣,但是線段樹更廣,因為線段樹本身只是一個區間樹,你可以在區間上添加很多的信息。。

③ 線段樹的解決實際問題

支持以下操作
1 x 若x不存在,插入x
2 x 若x存在,刪除x
3 輸出當前最小值,若不存在輸出-1
4 輸出當前最大值,若不存在輸出-1
5 x 輸出x的前驅,若不存在輸出-1
6 x 輸出x的後繼,若不存在輸出-1
7 x 若x存在,輸出1,否則輸出-1 //byhzwer#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#;intn,m;structseg{intl,r,v;}t[3000005];voidbuild(intk,intl,intr){t[k].l=l;t[k].r=r;if(l==r)return;intmid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);}intmn(intk){if(!t[k].v)return-1;intl=t[k].l,r=t[k].r;if(l==r)returnl;if(t[k<<1].v)returnmn(k<<1);elsereturnmn(k<<1|1);}intmx(intk){if(!t[k].v)return-1;intl=t[k].l,r=t[k].r;if(l==r)returnl;if(t[k<<1|1].v)returnmx(k<<1|1);elsereturnmx(k<<1);}voidinsert(intk,intval){intl=t[k].l,r=t[k].r;if(l==r){t[k].v=1;return;}intmid=(l+r)>>1;if(val<=mid)insert(k<<1,val);elseinsert(k<<1|1,val);t[k].v=t[k<<1].v+t[k<<1|1].v;}intfind(intk,intval){intl=t[k].l,r=t[k].r;if(l==r){if(t[k].v)return1;return-1;}intmid=(l+r)>>1;if(val<=mid)returnfind(k<<1,val);elsereturnfind(k<<1|1,val);}voiddel(intk,intval){intl=t[k].l,r=t[k].r;if(l==r){t[k].v=0;return;}intmid=(l+r)>>1;if(val<=mid)del(k<<1,val);elsedel(k<<1|1,val);t[k].v=t[k<<1].v+t[k<<1|1].v;}intfindpr(intk,intval){if(val<0)return-1;if(!t[k].v)return-1;intl=t[k].l,r=t[k].r;if(l==r)returnl;intmid=(l+r)>>1;if(val<=mid)returnfindpr(k<<1,val);else{intt=findpr(k<<1|1,val);if(t==-1)returnmx(k<<1);elsereturnt;}}intfindsu(intk,intval){if(!t[k].v)return-1;intl=t[k].l,r=t[k].r;if(l==r)returnl;intmid=(l+r)>>1;if(val>mid)returnfindsu(k<<1|1,val);else{intt=findsu(k<<1,val);if(t==-1)returnmn(k<<1|1);elsereturnt;}}intmain(){scanf(%d%d,&n,&m);build(1,0,n);intopt,x;for(inti=1;i<=m;i++){scanf(%d,&opt);switch(opt){case1:scanf(%d,&x);if(find(1,x)==-1)insert(1,x);break;case2:scanf(%d,&x);if(find(1,x)==1)del(1,x);break;case3:printf(%d ,mn(1));break;case4:printf(%d ,mx(1));break;case5:scanf(%d,&x);printf(%d ,findpr(1,x-1));break;case6:scanf(%d,&x);printf(%d ,findsu(1,x+1));break;case7:scanf(%d,&x);printf(%d ,find(1,x));break;}}return0;} 相信對演算法設計或者數據結構有一定了解的人對線段樹都不會太陌生。它是能夠在log(MaxLen)時間內完成線段的添加、刪除、查詢等操作。但一般的實現都有點復雜而線段樹應用中有一種是專門針對點的。(點樹?)它的實現卻非常簡單。
這種數據結構有什麼用?我們先來考慮一下下面的需求(全部要求在LogN時間內完成):如何知道一個點在一個點集里的大小「排名」?很簡單,開一個點數組,排個序,再二分查找就行了;如何在一個點集內動態增刪點?也很簡單,弄個平衡樹就行了(本來平衡樹比線段樹復雜得多,但自從世界上有了STL set這么個好東東,就……^_^)那如果我既要動態增刪點,也要隨時查詢到一個點的排名呢?那對不起,可能就要出動到我們的「點樹」了。
其實現原理很簡單:每當增加(或刪除)一個大小為X的點時,就在樹上添加(或刪除)一條(X,MaxLen)的線段(不含端點),當要查詢一個點的排名時,只要看看其上有多少條線段就可以了。針對這一需求,這里有個非常簡單的實現(見以下代碼,十多行,夠短了吧?)其中clear()用於清空點集;add()用於添加一個點;cntLs()返回小於n的點的個數,也就是n的升序排名,類似地cntGt是降序排名。
這個點樹有什麼用呢?其中一個應用是在O(NlogN)時間內求出一個排列的逆序數,方法是每讀到一個數x,就讓逆序數+=cntGt(x);然後再add(x)。
這個實現還可以進行一些擴展。比如刪除del(int n),只要把add(int n)中的++size換成--size,把a[i/2]++改成a[i/2]--即可。另外還可以通過二分查找功能在O(logN)時間內查到排名第n的點的大小。應該也可以三四行內搞定。
補充:楊弋同學在2008年信息學奧賽冬令營上新發明了一種線段樹的省空間堆式存儲法,具體方法可以見08年冬令營課件.
實現代碼及測試程序
#include<cstring>#include<iostream>usingnamespacestd;//實現代碼template<intN>//表示可用區間為[0,N),其中N必須是2的冪數classPointTree{public:PointTree(){clear();size=0;}~PointTree(){};voidclear(){memset(this,0,sizeof(*this));}voidadd(intn){inti=N+n;++size;for(++a[i];i>1;i/=2)if(~i&1)a[i/2]++;}intcntLs(intn){//統計小於intc=0;//若統計小於等於則c=a;for(inti=N+n;i>1;i/=2)if(i&1)c+=a[i/2];returnc;}intcntGt(intn){returnsize-a[N+n]-cntLs(n);}voiddel(intn){if(!a[n+=N])return;--size;for(--a[n];n>1;n/=2)if(~n&1)--a[n/2];}/*解決:求點集中第i小的數(由0數起)*注意:如果i>=size返回N-1*/intoperator[](intn)//下標從0開始{inti=1;while(i<N){if(n<a[i])i*=2;elsen-=a[i],i=i*2+1;}returni-N;}private:inta[2*N];intsize;};PointTree<8192>t;//測試程序intmain(intargc,charconst*argv[]){charc;intn;while(cin>>c){if(c=='c')t.clear();else{cin>>n;if(c=='a')t.add(n);if(c=='d')t.del(n);if(c=='q')cout<<t[n]<<endl;}}return0;} 另一種功能上比較類似的數據結構:「樹狀數組」。它們有不少相似之處:
針對點集的處理(添加、刪除、查找);
相似的時空復雜度(logN時間,2N空間);
相似的編程復雜度(都比線段樹簡短得多);
因此,所有可以用樹狀數組解決的問題都可以用這個「點樹」來解決,另外它還有以下好處:
更直觀的轉移;
同時支持自下而上和自上而下兩種方向的查找和更新,而後者樹狀數組不支持,所以樹狀數組不提供某些功能,比如說O(logN)求點集中第k小數。 ZKW線段樹由清華大學張昆瑋發現,是一種新的用非遞歸方式實現的線段樹,具體請參考張昆瑋先生本人的講稿《統計的力量》 。

④ 是的 計算機演算法

計算機演算法是以一步接一步的方式來詳細描述計算機如何將輸入轉化為所要求的輸出的過程,或者說,演算法是對計算機上執行的計算過程的具體描述。
編輯本段演算法性質一個演算法必須具備以下性質: (1)演算法首先必須是正確的,即對於任意的一組輸入,包括合理的輸入與不合理的輸入,總能得到預期的輸出。如果一個演算法只是對合理的輸入才能得到預期的輸出,而在異常情況下卻無法預料輸出的結果,那麼它就不是正確的。 (2)演算法必須是由一系列具體步驟組成的,並且每一步都能夠被計算機所理解和執行,而不是抽象和模糊的概念。 (3)每個步驟都有確定的執行順序,即上一步在哪裡,下一步是什麼,都必須明確,無二義性。 (4)無論演算法有多麼復雜,都必須在有限步之後結束並終止運行,即演算法的步驟必須是有限的。在任何情況下,演算法都不能陷入無限循環中。 一個問題的解決方案可以有多種表達方式,但只有滿足以上4個條件的解才能稱之為演算法。編輯本段重要演算法A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於游戲中的NPC的移動計算,或線上游戲的BOT的移動計算上。該演算法像Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
Beam Search
束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜索於20 世紀70年代中期首先被應用於人工智慧領域,1976 年Lowerre在其稱為HARPY的語音識別系統中第一次使用了束搜索方法,他的目標是並行地搜索幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找演算法
一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜索演算法每一次比較都使搜索范圍縮小一半。
Branch and bound
分支定界(branch and bound)演算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在文件存儲和分布式系統領域有著十分廣泛的應用。數據壓縮也代表著尺寸媒介容量的增大和網路帶寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellman key exchange,簡稱「D–H」,是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra』s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹(Edsger Wybe Dijkstra)發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。比較著名的應用實例有:求解最短路徑問題,背包問題,項目管理,網路流優化等。這里也有一篇文章說得比較詳細。
歐幾里得演算法
在數學中,輾轉相除法,又稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
最大期望(EM)演算法
在統計計算中,最大期望(EM)演算法是在概率(probabilistic)模型中尋找參數最大似然估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variable)。最大期望經常用在機器學習和計算機視覺的數據聚類(Data Clustering)領域。最大期望演算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在 E 步上求得的最大似然值來計算參數的值。M 步上找到的參數估計值被用於下一個 E 步計算中,這個過程不斷交替進行。
快速傅里葉變換(FFT)
快速傅里葉變換(Fast Fourier Transform,FFT),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)。編輯本段演算法特點1.有窮性。一個演算法應包含有限的操作步驟,而不能是無限的。事實上「有窮性」往往指「在合理的范圍之內」。如果讓計算機執行一個歷時1000年才結束的演算法,這雖然是有窮的,但超過了合理的限度,人們不把他是為有效演算法。 2. 確定性。演算法中的每一個步驟都應當是確定的,而不應當是含糊的、模稜兩可的。演算法中的每一個步驟應當不致被解釋成不同的含義,而應是十分明確的。也就是說,演算法的含義應當是唯一的,而不應當產生「歧義性」。 3. 有零個或多個輸入、所謂輸入是指在執行演算法是需要從外界取得必要的信息。 4. 有一個或多個輸出。演算法的目的是為了求解,沒有輸出的演算法是沒有意義的。 5.有效性。 演算法中的每一個 步驟都應當能有效的執行。並得到確定的結果。編輯本段演算法與程序雖然演算法與計算機程序密切相關,但二者也存在區別:計算機程序是演算法的一個實例,是將演算法通過某種計算機語言表達出來的具體形式;同一個演算法可以用任何一種計算機語言來表達。 演算法列表 圖論 路徑問題 0/1邊權最短路徑 BFS 非負邊權最短路徑(Dijkstra) 可以用Dijkstra解決問題的特徵 負邊權最短路徑 Bellman-Ford Bellman-Ford的Yen-氏優化 差分約束系統 Floyd 廣義路徑問題 傳遞閉包 極小極大距離 / 極大極小距離 Euler Path / Tour 圈套圈演算法 混合圖的 Euler Path / Tour Hamilton Path / Tour 特殊圖的Hamilton Path / Tour 構造 生成樹問題 最小生成樹 第k小生成樹 最優比率生成樹 0/1分數規劃 度限制生成樹 連通性問題 強大的DFS演算法 無向圖連通性 割點 割邊 二連通分支 有向圖連通性 強連通分支 2-SAT 最小點基 有向無環圖 拓撲排序 有向無環圖與動態規劃的關系 二分圖匹配問題 一般圖問題與二分圖問題的轉換思路 最大匹配 有向圖的最小路徑覆蓋 0 / 1矩陣的最小覆蓋 完備匹配 最優匹配 穩定婚姻 網路流問題 網路流模型的簡單特徵和與線性規劃的關系 最大流最小割定理 最大流問題 有上下界的最大流問題 循環流 最小費用最大流 / 最大費用最大流 弦圖的性質和判定 組合數學 解決組合數學問題時常用的思想 逼近 遞推 / 動態規劃 概率問題 Polya定理 計算幾何 / 解析幾何 計算幾何的核心:叉積 / 面積 解析幾何的主力:復數 基本形 點 直線,線段 多邊形 凸多邊形 / 凸包 凸包演算法的引進,卷包裹法 Graham掃描法 水平序的引進,共線凸包的補丁 完美凸包演算法 相關判定 兩直線相交 兩線段相交 點在任意多邊形內的判定 點在凸多邊形內的判定 經典問題 最小外接圓 近似O(n)的最小外接圓演算法 點集直徑 旋轉卡殼,對踵點 多邊形的三角剖分 數學 / 數論 最大公約數 Euclid演算法 擴展的Euclid演算法 同餘方程 / 二元一次不定方程 同餘方程組 線性方程組 高斯消元法 解mod 2域上的線性方程組 整系數方程組的精確解法 矩陣 行列式的計算 利用矩陣乘法快速計算遞推關系 分數 分數樹 連分數逼近 數論計算 求N的約數個數 求phi(N) 求約數和 快速數論變換 …… 素數問題 概率判素演算法 概率因子分解 數據結構 組織結構 二叉堆 左偏樹 二項樹 勝者樹 跳躍表 樣式圖標 斜堆 reap 統計結構 樹狀數組 虛二叉樹 線段樹 矩形面積並 圓形面積並 關系結構 Hash表 並查集 路徑壓縮思想的應用 STL中的數據結構 vector deque set / map 動態規劃 / 記憶化搜索 動態規劃和記憶化搜索在思考方式上的區別 最長子序列系列問題 最長不下降子序列 最長公共子序列 一類NP問題的動態規劃解法 樹型動態規劃 背包問題 動態規劃的優化 四邊形不等式 函數的凸凹性 狀態設計 規劃方向 線性規劃 常用思想 二分 最小表示法 串 KMP Trie結構 後綴樹/後綴數組 LCA/RMQ 有限狀態自動機理論 排序 選擇/冒泡 快速排序 堆排序 歸並排序 基數排序 拓撲排序 排序網路
擴展閱讀:
1
《計算機演算法設計與分析導論》朱清新等編著人民郵電出版社
開放分類:
計算機,演算法

⑤ b站問答求救

網路一下應該會有吧,對著答案去看問題,如果沒有的話,再刷新一下,換幾道問題,(PS彈幕禮儀方面的問題一定要特別留心,因為B站改版之後,這種問題答錯一次就要重來的,祝好運~~多試幾次吧)

⑥ c++中 需要熟練掌握的 理論知識。

勸你先配合c++研究些演算法會更好:

第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡代碼,因為太常用,所以要練到寫時不用想,10-15分鍾內打完,甚至關掉顯示器都可以把程序打出來。

1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分查找. (代碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 調用系統的qsort, 技巧很多,慢慢掌握.
9. 任意進制間的轉換

第二階段:練習復雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進製法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜索、A*演算法,最小耗散優先.

第三階段:
前兩個階段是打基礎,第三階段是鍛煉在比賽中可以快速建立模型、想新演算法。這就要平時多做做綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。
2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來做:-P )
3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力.
4. 一道題不要過了就算,問一下人,有更好的演算法也打一下。
5. 做過的題要記好 :-)

下面轉自:http://hi..com/wilworld/blog/item/88b1b844d37e4049500ffe6a.html

演算法書有很多可以參考:

1、Concrete Mathematics --- A Foundation For Computer Science
Ronald L. Graham , Donald E. Knuth , Oren Patashnik
這本書《具體數學》是Stanford計算機系的教材(1970 年開始給研究生授課),書的內容是Knuth的巨著TAOCP第一章的擴展,涉及了計算機科學領域內幾乎所有可能遇到的數學知識。書中許多經典問題的解答比目前廣泛流傳的解法更易懂。對於提高大家的數學修養有很大幫助。

2、Introction to Algorithms
Thomas H. Cormen ,Charles E. Leiserson ,Ronald L. Rivest ,Clifford Stein
《演算法導論》MIT計算機系的經典演算法教材。作者Rivest獲得過ACM Turing Award,牛!本書內容全面,語言通俗,很適合大家入門。

3、實用演算法的分析和程序設計
吳文虎 王建德
大名鼎鼎的「黑書」。內容包括了競賽需要的各種演算法,各種層次的讀者都適合。

【這里是我自己加的:其實所謂"黑書",還有一本,《演算法藝術與信息學競賽》作者:劉汝佳 黃亮,很經典,很流行】
4、網路演算法與復雜性理論
謝政 李建平
內容很豐富的圖論教材

5、演算法+數據結構=程序
N.Wirth
Pascal語言的發明人Wirth教授的名著,深入闡述了演算法與數據結構的關系,對每個演算法都提供詳細的Pascal源程序,適合各種水平的讀者。

最後,在學習演算法提升戰鬥力的同時,也要多做題目,實戰是很有必要的。其實並不是所有的題目都是靠演算法的,有一些題目是有多種可以優化的手段,也有一些工程性比較強的題目。上手做和把題做精還是有很大區別的(慚愧的說,我就是屬於上手做,沒有做精,所以……)。

願每一位程序設計競賽愛好者挑戰極限!

⑦ 什麼是數據結構和演算法學演算法還需要去了解數據結構嗎

  1. 你這理解不完全正確。

因為數據結構不只是內存中數據的排列,它是對數據的一種組織方式,就像圖書館要排書一樣,是為了便於操作,同時它本身也集成了對通用操作:比如查找、比較等的支持。數組不是一種數據結構,而是一種數據類型。一個完整的數據結構包括邏輯結構和存儲結構。通常選擇了數據結構,演算法也隨之確定,是數據而不是演算法是系統構造的關鍵因素。

因此在語言實現上,數據結構通常也會包含與之相對應的演算法集合,這些演算法是指基本演算法:查找、索引、比較等。


數據結構的邏輯結構和硬體是沒有關系的,而其存儲結構受到計算機硬體系統工作方式的影響,通常這點影響在於數據時順序存儲還是離散存儲。演算法的基礎是數據結構。只有指定明確的數據結構,演算法才能設計完成,脫離數據結構,演算法是無法,也不可能成立的。因為不需要數據的演算法就不是一個有效的計算機演算法,演算法中任何對數據的組織形式都可以被稱之為數據結構。


2.數據結構在編程中的地位是極其重要的,是一個程序實現的基礎中的基礎,在此基礎上才能構建演算法。通常而言,你不了解什麼高深的演算法,一樣能完成工作,但是如果你不了解基本的數據結構,那麼可以說,你根本就不能完成一個任何有實質性內容的程序。Donald Ervin Knuth教授在其《計算機程序設計藝術》的第一卷《基本演算法》中花費的絕大部分的篇幅去論述數據結構。由此可見數據結構對演算法的重要性。

⑧ 動態線段樹怎麼寫

相信對演算法設計或者數據結構有一定了解的人對線段樹都不會太陌生。它是能夠在log(MaxLen)時間內完成線段的添加、刪除、查詢等操作。但一般的實現都有點復雜而線段樹應用中有一種是專門針對點的。(點樹?)它的實現卻非常簡單。
這種數據結構有什麼用?我們先來考慮一下下面的需求(全部要求在LogN時間內完成):如何知道一個點在一個點集里的大小「排名」?很簡單,開一個點數組,排個序,再二分查找就行了;如何在一個點集內動態增刪點?也很簡單,弄個平衡樹就行了(本來平衡樹比線段樹復雜得多,但自從世界上有了STL set這么個好東東,就……^_^)那如果我既要動態增刪點,也要隨時查詢到一個點的排名呢?那對不起,可能就要出動到我們的「點樹」了。
其實現原理很簡單:每當增加(或刪除)一個大小為X的點時,就在樹上添加(或刪除)一條(X,MaxLen)的線段(不含端點),當要查詢一個點的排名時,只要看看其上有多少條線段就可以了。針對這一需求,這里有個非常簡單的實現(見以下代碼,十多行,夠短了吧?)其中clear()用於清空點集;add()用於添加一個點;cntLs()返回小於n的點的個數,也就是n的升序排名,類似地cntGt是降序排名。
這個點樹有什麼用呢?其中一個應用時在O(NlogN)時間內求出一個排列的逆序數(http://acm.zju.e.cn/show_problem.php?pid=1484,你有更好的演算法嗎?歡迎交流)方法是每讀到一個數x,就讓逆序數+=cntGt(x);然後再add(x)。
這個實現還可以進行一些擴展。比如刪除del(int n),只要把add(int n)中的++size換成--size,把a[i/2]++改成a[i/2]--即可。另外還可以通過二分查找功能在O(logN)時間內查到排名第n的點的大小。應該也可以三四行內搞定。

補充:楊弋同學在2008年信息學奧賽冬令營上新發明了一種線段樹的省空間堆式存儲法,具體方法可以見08年冬令營課件.
template < int N > // 表示可用區間為[0,N),其中N必須是2的冪數;
class PointTree {
int a[ 2 * N];

⑨ C++裡面」>>「和」<<「各是什麼意思

<<和>>在c中是用來做位運算的,在C++中被重載了,即可以做位運算也可以做輸入輸出流。

區別如下:

1、應用場合不同:

C語言是結構化和模塊化的語言,是面向過程的。當程序的規模較小時,C語言運用起來得心應手。但是當問題比較復雜、程序的規模比較大的時候,C語言就會展現出它的局限性;

正是因為有大規模的程序需要去處理,C++就應運而生了。C++是由C發展而來的,與C語言兼容。C++既可用於面向過程的結構化程序設計,也可用於面向對象的程序設計,是一種功能強大的混合型的程序設計語言。

2、輸入/輸出函數不同:

C語言:inta=1;doubled=3.1415926;printf("%d\n",a);printf("a=%d ",a);printf("b=%6.3f, b=%6.2f, b=%.3f ",b,b,b);scanf("%d",&a);//取地址,輸入a的值,%d和%f稱為格式說明符,表示以此格式輸出對應表達式的值, 表示換行。%6.3f中的6表示佔六列,表示輸出對應浮點表達式值時只輸出三位小數。

C++:int a=5;float b;cout << "a="<cin >>b;cout必須要和」<<「一起使用,cin必須要和」>>「一起使用。得C++中的輸入輸出流是很強大的,不像C裡面還要指定格式,endl表示換行。

(9)線段樹的發明者擴展閱讀:

C語言之所以命名為C,是因為C語言源自Ken Thompson發明的B語言,而B語言則源自BCPL語言。

1967年,劍橋大學的Martin Richards對CPL語言進行了簡化,於是產生了BCPL(Basic Combined Programming Language)語言。

20世紀60年代,美國AT&T公司貝爾實驗室(AT&T Bell Laboratory)的研究員Ken Thompson閑來無事,手癢難耐,想玩一個他自己編的,模擬在太陽系航行的電子游戲——Space Travel。他背著老闆,找到了台空閑的機器——PDP-7。但這台機器沒有操作系統,而游戲必須使用操作系統的一些功能,於是他著手為PDP-7開發操作系統。後來,這個操作系統被命名為——UNIX。

⑩ 勝者樹和線段樹有什麼區別

自己看書吧

閱讀全文

與線段樹的發明者相關的資料

熱點內容
基本公共衛生服務考核方案 瀏覽:660
公共服務平台建設領導小組 瀏覽:165
人類創造了那些機器人 瀏覽:933
公共文化服務保障法何時實施 瀏覽:169
遼寧育嬰師證書領取 瀏覽:735
劃撥土地使用權轉讓能轉讓嗎 瀏覽:97
2019年公需科目知識產權考試答案 瀏覽:256
關於知識產權管理辦法 瀏覽:331
公共衛生服務培訓筆記 瀏覽:532
基層公共衛生服務技術題庫 瀏覽:497
中國城市老年體育公共服務體系的反思與重構 瀏覽:932
網路著作權的法定許可 瀏覽:640
工商局黨風廉政建設工作總結 瀏覽:325
公共服務平台建設可行性研究報告 瀏覽:428
投訴華爾街英語 瀏覽:202
榆次區公共衛生服務中心 瀏覽:990
申發明5G 瀏覽:815
矛盾糾紛排查調處工作協調會議記錄 瀏覽:94
版權貿易十一講 瀏覽:370
綜治辦矛盾糾紛排查調處工作總結 瀏覽:903