數據結構與演算法分析c語言版
《數據結構與演算法分析:C語言描述(原書第2版)》內容簡介:書中詳細介紹了當前流行的論題和新的變化,討論了演算法設計技巧,並在研究演算法的性能、效率以及對運行時間分析的基礎上考查了一些高級數據結構,從歷史的角度和近年的進展對數據結構的活躍領域進行了簡要的概括。由於《數據結構與演算法分析:C語言描述(原書第2版)》選材新穎,方法實用,題例豐富,取捨得當。《數據結構與演算法分析:C語言描述(原書第2版)》的目的是培養學生良好的程序設計技巧和熟練的演算法分析能力,使得他們能夠開發出高效率的程序。從服務於實踐又鍛煉學生實際能力出發,書中提供了大部演算法的C程序和偽碼常式,但並不是全部。一些程序可從互聯網上獲得。
《數據結構與演算法分析:C語言描述(原書第2版)》是《Data Structures and Algorithm Analysis in C》一書第2版的簡體中譯本。原書曾被評為20世紀頂尖的30部計算機著作之一,作者Mark Allen Weiss在數據結構和演算法分析方面卓有建樹,他的數據結構和演算法分析的著作尤其暢銷,並受到廣泛好評.已被世界500餘所大學用作教材。
在《數據結構與演算法分析:C語言描述(原書第2版)》中,作者更加精煉並強化了他對演算法和數據結構方面創新的處理方法。通過C程序的實現,著重闡述了抽象數據類型的概念,並對演算法的效率、性能和運行時間進行了分析。
全書特點如下:
●專用一章來討論演算法設計技巧,包括貪婪演算法、分治演算法、動態規劃、隨機化演算法以及回溯演算法
●介紹了當前流行的論題和新的數據結構,如斐波那契堆、斜堆、二項隊列、跳躍表和伸展樹
●安排一章專門討論攤還分析,考查書中介紹的一些高級數據結構
●新開辟一章討論高級數據結構以及它們的實現,其中包括紅黑樹、自頂向下伸展樹。treap樹、k-d樹、配對堆以及其他相關內容
●合並了堆排序平均情況分析的一些新結果
《數據結構與演算法分析:C語言描述(原書第2版)》是國外數據結構與演算法分析方面的標准教材,介紹了數據結構(大量數據的組織方法)以及演算法分析(演算法運行時間的估算)。《數據結構與演算法分析:C語言描述(原書第2版)》的編寫目標是同時講授好的程序設計和演算法分析技巧,使讀者可以開發出具有最高效率的程序。 《數據結構與演算法分析:C語言描述(原書第2版)》可作為高級數據結構課程或研究生一年級演算法分析課程的教材,使用《數據結構與演算法分析:C語言描述(原書第2版)》需具有一些中級程序設計知識,還需要離散數學的一些背景知識。
2. 數據結構與演算法分析:C語言描述的書評
現在的程序員總是用著別人封裝好的函數、類、庫、API,滿滿的,我們就會覺得編程不過是這么回事,搭積木而已,別人都把材料提供好了,至於材料是怎麼做的,不用理會。真的是這樣嗎?說數據結構和演算法沒用的人,那是因為他用不到。為什麼用不到?他的層次決定了他不會接觸到編程最關鍵最核心的部分——演算法。先不說那些反應演算法的力量的似乎變態的問題,也不說2006年第4期《程序員》的專題,只說,當我們遇到一個問題時,如何搭建數學模型?當我們在有限的硬體條件下要完成高速的數據處理,如何設計?當我們為客戶開發完一套軟體後,能不能保證未來幾年內數據猛增不會帶來計算量的指數級增長?當我們需要升級伺服器內存和硬碟是,能不能修改幾個函數就避免硬體的投資?這些問題的答案,請在這本書中尋找。表、棧、隊列、樹、圖等基本數據結構作者並未花大力氣描述,而是重在後面的對這些數據結構的應用上,每一個結論都給出了詳盡的數學證明,閱讀過程中,我們可以感受到蘊含在其中的匠心獨運的邏輯思維之美。借用GOOGLE黑板報的一個專題,演算法體現了——「數學之美」。並不是說本書就很完美了,有些章節講得太過籠統,讀起來跳躍感太強,比如第九章的網路流問題,介紹的太過簡單,推導過程中省略了不少步驟,對增廣路徑演算法講的太粗,至於預流推進演算法(Push-Relabel)則根本未提,不能不說是一個小小缺憾。
3. 數據結構 c語言版二叉樹(1) 建立一棵含有n個結點的二叉樹,採用二叉鏈表存儲;
#include<stdio.h>
#include<stdlib.h>
typedef struct node *tree_pointer;
struct node{
char ch;
tree_pointer left_child,right_child;
};
tree_pointer root=NULL;
tree_pointer create(tree_pointer ptr)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
ptr=NULL;
else{
ptr=(tree_pointer)malloc(sizeof(node));
ptr->ch=ch;
ptr->left_child=create(ptr->left_child);
ptr->right_child=create(ptr->right_child);
}
return ptr;
}
void preorder(tree_pointer ptr)
{
if(ptr){
printf("%c",ptr->ch);
preorder(ptr->left_child);
preorder(ptr->right_child);
}
}
void inorder(tree_pointer ptr)
{
if(ptr){
inorder(ptr->left_child);
printf("%c",ptr->ch);
inorder(ptr->right_child);
}
}
void postorder(tree_pointer ptr)
{
if(ptr){
postorder(ptr->left_child);
postorder(ptr->right_child);
printf("%c",ptr->ch);
}
}
void main()
{
printf("構建一個二叉樹(結點數為n):\n");
root=create(root);
printf("前序遍歷二叉樹:\n");
preorder(root);
printf("\n");
printf("中序遍歷二叉樹:\n");
inorder(root);
printf("\n");
printf("後序遍歷二叉樹:\n");
postorder(root);
printf("\n");
}
4. 數據結構與演算法-隊列
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
隊列這個概念非常好理解。你可以把它想像成排隊買票,先來的先買,後來的人只能站末尾,不允許插隊。先進者先出,這就是典型的「隊列」。
我們知道,CPU 資源是有限的,任務的處理速度與線程個數並不是線性正相關。相反,過多的線程反而會導致 CPU 頻繁切換,處理性能下降。所以,線程池的大小一般都是綜合考慮要處理任務的特點和硬體環境,來事先設置的。當我們向固定大小的線程池中請求一個線程時,如果線程池中沒有空閑資源了,這個時候線程池如何處理這個請求?是拒絕請求還是排隊請求?各種處理策略又是怎麼實現的呢?
看完下面隊列C語言實現,相信你會多少有些了解
隊列只支持兩個基本操作:入隊 enqueue(),放一個數據到隊列尾部;出隊 dequeue(),從隊列頭部取一個元素。
隊列跟棧一樣,也是一種操作受限的線性表數據結構。
隊列跟棧一樣,也是一種抽象的數據結構。它具有先進先出的特性,支持在隊尾插入元素,在隊頭刪除元素。
跟棧一樣,隊列可以用數組來實現,也可以用鏈表來實現。用數組實現的棧叫作順序棧,用鏈表實現的棧叫作鏈式棧。同樣,用數組實現的隊列叫作順序隊列,用鏈表實現的隊列叫作鏈式隊列。
隨著不停地進行入隊、出隊操作, front 和 rear 都會持續往後移動。當 rear 移動到最右邊,即使數組中還有空閑空間,也無法繼續往隊列中添加數據了。同時也不好判斷隊滿條件,可以使用循環隊列來實現
循環隊列,顧名思義,它長得像一個環。原本數組是有頭有尾的,是一條直線。現在我們把首尾相連,扳成了一個環。
經過推算,可以發現:
隊空 Q.rear==Q.front。
隊滿 (Q.rear+1)%MAXSIZE==Q.front。
注意,當隊列滿時,圖中的 Q.rear 指向的位置實際上是沒有存儲數據的。所以,循環隊列會浪費一個數組的存儲空間。
1.初始化空隊列
2.清空隊列
4.判斷隊滿
5.入隊
6.出隊
7.獲取隊列當前元素個數
8.若隊列不空,則用e返回Q的隊頭元素,並返回OK,否則返回ERROR
9.從隊頭到隊尾依次對隊列的每個元素數組
10.主函數中驗證
輸出結果
1.初始化
2.銷毀
3.置空
4.判斷隊列是否為空
5.獲取元素個數
6.入隊
7.出隊
8.獲取隊頭元素
9.遍歷隊列
驗證
輸出