在第三章裡面,並不是一開始就講的查詢,第一節中首先介紹的是符號表。
符號表,其實就是儲存了鍵值對的一種資料結構,鍵值對用於將乙個鍵和乙個值聯絡起來。符號表支援兩種操作:插入(put),即將一組新的鍵值對存入表中;查詢(get),即根據給定的鍵得到對應的值。下面看一下書中關於符號表的應用以及api
書中對於符號表的要求就不貼了,基本上就是set集合對於元素的要求。
符號表中使用的資料結構的乙個簡單選擇是鍊錶,每個節結點儲存乙個鍵值對。get()的實現即為遍歷鍊錶,用equals()方法比較需要被查詢的鍵和每個結點中的鍵,匹配成功就返回相應的值,否則返回null。
演算法3.1 (基於無序鍊錶)
public
class sequentialsearchst
}public value get(key key)
public
void
put(key key, value val) //命中,更新
first = new node(key, val, first); //未命中,新建結點}}
在上面的符號表中,未命中的查詢和插入操作都需要n次比較。命中的查詢最壞需要n此比較,向乙個空表中插入n個不同的鍵需要 n^2^/2(另外一種寫法n
2 2
/2)次比較。
演算法3.2(binarysearchst)可以保證陣列中comparable型別的鍵有序,然後使用陣列的索引來高效地實現get()和其他操作。
這份實現的核心是rank()方法,它返回表中小於給定鍵的鍵的數量。對於get()方法只要給定的鍵存在於表中,rank()方法就能夠精確地告訴我們在**能夠找到它。
演算法3.2 二分查詢(基於有序陣列)
public
class binarysearchst, value>
public
intsize()
public value get(key key)
public
intrank(key key)
return lo;
}public
void
put(key key, value val)
for(int j = n; j > i; j--)
keys[i] = key; vals[i] = val;
n++;
}public
void
delete(key key) {}//刪除操作
}
這個二分查詢的rank方法使用的不是遞迴,而是迭代,需要仔細地思考一下。
從上面可以知道,二分查詢的符號表的插入和查詢操作時間複雜度級別相差很大,而二叉查詢樹可以保證查詢和插入操作都是對數級別的。
演算法3.3 二叉查詢樹的查詢和排序方法的實現
public
class bst, value>
}public
intsize()
public
intsize(node x)
public value get(key key)
private value get(node x, key key)
public
void
put(key key, value val)
private node put(node x, key key, value val)
演算法 3.3 (續) 二叉查詢樹中max()、min()、floor()、ceiling()方法的實現public key min()
private node min(node x)
//向下取整
public key floor(key key)
private node floor(node x, key key)
}
上面方法中每個公有方法都有乙個私有方法,它接收乙個額外的鏈結作為引數指向某個節點,通過正文中描述的遞迴方法查詢返回null或者含有指定key的節點node。max()和ceiling的實現分別與min()和floor()方法基本相同,知識將**中的left和right(以及》和
演算法 3.3(續) 二叉查詢樹中select()和rank()方法的實現
rank()是select()的逆方法,它會返回給定鍵的排名。它的實現和select()類似;
public key select(int k)
private node select(node x, int k)
public
intrank(key key)
private
intrank(key key, node x)
演算法 3.3(續) 二叉查詢樹的delete()方法的實現
二叉查詢樹中最難實現的就是delete()演算法,即從符號表中刪除乙個鍵值對。
書中是這樣去實現delete()演算法的
}演算法 3.3(續) 二叉查詢樹的範圍查詢操作
public iterable keys()
public iterable keys(key lo, key hi)
private
void keys(node x, queue
queue, key lo, key hi)
上面這些演算法一下子看完的話頭還是挺暈的。。。 演算法第三章
單調遞增最長子序列分析 1.1 i 0時 dp 0 1 其餘情況 dp i max dp i dp j 1 0 j i 1.2填表的維度 一維 填表的範圍 dp 0 到 dp n 1 填表順序 從左向右 1.3因為要以每乙個數字終點,然後從頭遍歷到他本身,所以時間複雜度位o n 2 空間複雜度 建立...
第三章 演算法概述
3.5.1 模板語法 模板函式的模型和實現從乙個模板參數列開始。其語法包括關鍵字template,後面緊跟用角擴號括起來的形式型別的非空表在這個參數列中,每種型別前面都有關鍵字typename 不同的型別之間用逗號隔開。乙個模板型別的參數列 template 多個模板型別的參數列 template ...
演算法第三章總結
動態規劃演算法的理解 就是把乙個大問題變成很多個小問題,並通過求出小問題的最優解,利用他們的關係逐一求出其他問題的最優解。動態規劃應用於子問題重疊的情況 要去刻畫最優解的結構特徵 嘗試遞迴地定義最優解的值 就是我們常說的考慮從 i 1 i 1 轉移到 ii 計算最優解 利用計算出的資訊構造乙個最優解...