在第三章裡面,並不是一開始就講的查詢,第一節中首先介紹的是符號表。
符號表,其實就是儲存了鍵值對的一種資料結構,鍵值對用於將乙個鍵和乙個值聯絡起來。符號表支援兩種操作:插入(put),即將一組新的鍵值對存入表中;查詢(get),即根據給定的鍵得到對應的值。下面看一下書中關於符號表的應用以及api
書中對於符號表的要求就不貼了,基本上就是set集合對於元素的要求。
符號表中使用的資料結構的乙個簡單選擇是鍊錶,每個節結點儲存乙個鍵值對。get()的實現即為遍歷鍊錶,用equals()方法比較需要被查詢的鍵和每個結點中的鍵,匹配成功就返回相應的值,否則返回null。
演算法3.1 (基於無序鍊錶)
在上面的符號表中,未命中的查詢和插入操作都需要n次比較。命中的查詢最壞需要n此比較,向乙個空表中插入n個不同的鍵需要 n^2^/2(另外一種寫法npublic
class sequentialsearchst
}public value get(key key)
public
void
put(key key, value val) //命中,更新
first = new node(key, val, first); //未命中,新建結點}}
2 2
/2)次比較。
演算法3.2(binarysearchst)可以保證陣列中comparable型別的鍵有序,然後使用陣列的索引來高效地實現get()和其他操作。
這份實現的核心是rank()方法,它返回表中小於給定鍵的鍵的數量。對於get()方法只要給定的鍵存在於表中,rank()方法就能夠精確地告訴我們在**能夠找到它。
演算法3.2 二分查詢(基於有序陣列)
這個二分查詢的rank方法使用的不是遞迴,而是迭代,需要仔細地思考一下。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) {}//刪除操作
}
從上面可以知道,二分查詢的符號表的插入和查詢操作時間複雜度級別相差很大,而二叉查詢樹可以保證查詢和插入操作都是對數級別的。
演算法3.3 二叉查詢樹的查詢和排序方法的實現
演算法 3.3 (續) 二叉查詢樹中max()、min()、floor()、ceiling()方法的實現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)
上面方法中每個公有方法都有乙個私有方法,它接收乙個額外的鏈結作為引數指向某個節點,通過正文中描述的遞迴方法查詢返回null或者含有指定key的節點node。max()和ceiling的實現分別與min()和floor()方法基本相同,知識將**中的left和right(以及》和public key min()
private node min(node x)
//向下取整
public key floor(key key)
private node floor(node x, key key)
}
演算法 3.3(續) 二叉查詢樹中select()和rank()方法的實現
rank()是select()的逆方法,它會返回給定鍵的排名。它的實現和select()類似;
演算法 3.3(續) 二叉查詢樹的delete()方法的實現public key select(int k)
private node select(node x, int k)
public
intrank(key key)
private
intrank(key key, node x)
二叉查詢樹中最難實現的就是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 計算最優解 利用計算出的資訊構造乙個最優解...