第四天
列舉:
揹包問題:
列舉策略:1)可能的方案:2n
2)對每一方案進行判斷.
列舉法一般流程:
while(還有其他可能方案)
}列舉策略:
例:把所有排列列舉出來 p6=6!.
min:123456
max:654321
a1a2a3a4a5a6=>?(下一排列)=>?
比如:312654的下和種情況=>314256
遞迴
遞迴演算法通常具有這樣的特徵:為求解規模為n的問題,設法將它分解成一些規模較小的問題,然後從這些較小問題的解能方便地構造出題目所需的解。而這些規 模較小的問題也採用同樣的方法分解成規模更小的問題,通過規模更小的問題構造出規模校小的問題的解,如此不斷的反覆分解和綜合,總能分解到最簡單的能直接 得到解的情況。
因此,在解遞迴演算法的題目時,要注意以下幾點:
1) 找到遞迴呼叫的結束條件或繼續遞迴呼叫條件.
2) 想方設法將處理物件的規模縮小或元素減少.
3) 由於遞迴呼叫可理解為並列同名函式的多次呼叫,而函式呼叫的原則是一層一層呼叫,一層一層返回.因此,還要注意理解呼叫返回後的下乙個語句的作用.在一些 簡單的遞迴演算法中,往往不需要考慮遞呼叫返回後的語句處理.而在一些複雜的遞迴演算法中,則需要考慮遞迴呼叫返回後的語句處理和進一步的遞迴呼叫.
4) 在讀遞迴程式或編寫遞迴程式時,必須要牢記遞迴函式的作用,這樣便於理解整個函式的功能和知道哪兒需要寫上遞迴呼叫語句.當然,在解遞迴演算法的題目時,也需要分清遞迴函式中的內部變數和外部變數.
表現形式:
●定義是遞迴的(二叉樹,二叉排序樹)
●儲存結構是遞迴的(二叉樹,鍊錶,陣列)
●由前兩種形式得出的演算法是遞迴的
一般流程: function(variable list(規模為n))
}例1:求乙個煉表裡的最大元素.
大家有沒想過這個問題用遞迴來做呢?
非遞迴方法大家應該都會哦?
max(nodetype *h)
p=p->next;
}return q;
}下面真經來了,嘻嘻嘻~~~
*max(nodetype *h)
大家有空想想下面這個演算法:求鍊錶所有資料的平均值(我也沒試過),不許偷懶,用遞迴試試哦!
遞迴程式設計師考試題目型別:1)就是鍊錶的某些操作(比如上面的求平均值)
2)二叉樹(遍歷等)
例2.判斷陣列元素是否遞增
int jidge(int a,int n)
例3.求二叉樹的高度(根據二叉樹的遞迴性質:(左子樹)根(右子樹))
int depth(nodetype *root)
}自己想想求二叉樹結點個數(與上例類似)
例4.已知中序遍歷和後序遍歷,求二叉樹.
設一二叉樹的:
中序 s:e d f b a g j h c i
^start1 ^j ^end1
後序 t:e f d b j h g i c a
^start2 ^end2
node *create(char *s,char *t, int start1,int start2,int end1,int end2)
例5.組合問題
n 個數: (1,2,3,4,…n)求從中取r個數的所有組合.
設n=5,r=3;
遞迴思想:先固定一位 5 (從另四個數當中選二個)
5,4 (從另三個數當中選乙個)
5,4,3 (從另二個數當中選零個)
即:n-2個數中取r-2個數的所有組合
…程式:
void combire(int n,int r)
}
程式設計師資料結構筆記2
第二天 轉眼又過了一周了,前面一周裡面我編了一些程式 鍊錶,長整型數相加,三元組表轉置以及一些簡單的函式.其實有些演算法想想是很簡單,不過寫起來還是需要一定耐心和c基礎的,如果你自己覺得各演算法都很懂了,不妨開機編編試試.或許會有一些新的發現與體會.棧和佇列 1 知識點 棧的定義 操作受限的線性表 ...
黑馬程式設計師 學習筆記 資料結構 概念
資料結構與數學 計算機硬體和軟體有十分密切的關係。資料結構是介於數學 計算機硬體和計算機軟體之間的一門電腦科學與技術專業的核心課程,是高階程式語言 編譯原理 作業系統 資料庫 人工智慧等課程的基礎。同時,資料結構技術也廣泛應用於資訊科學 系統工程 應用數學以及各種工程技術領域。資料結構課程集中討論軟...
黑馬程式設計師 學習筆記 資料結構 順序表
一 儲存 線性表的順序儲存是指在記憶體中用位址連續的一塊儲存空間順序存放線性表的各元素,用這種儲存形式儲存的線性表稱其為順序表。因為記憶體中的位址空間是線性的,因此,用物理上的相鄰實現資料元素之間的邏輯相鄰關係是既簡單,又自然的。如圖2.1 所示。設a 的儲存位址為loc a 每個資料元素佔d個儲存...