定義:符號表是一種儲存鍵值對的資料結構,支援兩種操作:插入(put),即將一組新的鍵值對存入表中;查好(get),即根據給定的鍵得到相應的值。
目的:符號表最主要的目的就是將乙個鍵和乙個值聯絡起來。用例能夠將乙個鍵值對插入符號表並希望在之後能夠從符號表的所有鍵值對中按照鍵直接找到對應的值。
符號表是一種典型的抽象資料型別:它代表著一組定義清晰的值以及相應的操作,使得我們能夠將型別的實現和使用區分開來。
在查詢中我們乙個乙個地順序遍歷符號表中的所有鍵並使用equals()方法來尋找與被查詢的鍵匹配的鍵。
public
class sequenialsearchst
}//查詢給定的鍵,返回相關聯的值
public value get(key key)
}return
null;
}//查詢給定的鍵,找到則更新其值,否則在表中新建結點
public
void
put()
}first = new node(key,val,first);
}}
命題:在含有n對鍵值的基於(無序)鍊錶的符號表中,未命中的查詢和插入操作都需要n次比較。命中的查詢在最壞情況下需要n次比較。特別地,向乙個空表中插入n個不同的鍵需要~n^2/2次比較。
證明:在表中查詢乙個不存在的鍵時,我們會將表中的每個鍵和給定的鍵比較。因為不允許出現重複的鍵,每次插入操作之前我們都需要這樣查詢一遍。
推論:向乙個空表中插入n個不同的鍵需要~n^2/2次比較。
查詢乙個已經存在的鍵並不需要線性級別的時間。一種度量方法是查詢表中的每個鍵,並將總時間除以n。在查詢中的每個鍵的可能性都相同的情況下時,這個結果就是依稀查詢平均所有的比較數。我們將它稱為隨機命中。
public
class binarysearchst,value>
public
intsize()
public value get(key key)else
}publice int rank(key key)
//查詢鍵,找到則更新值,否則建立新的元素
public
void
put(key key, value val)
for(int j = n; j > i ; j--)
}publice void delete(key key)
}
在查詢時,我們先將被查詢的鍵和子陣列的中間鍵比較。如果被查詢的鍵小於中間鍵,我們就在左子陣列中繼續查詢,如果大於我們就在右子陣列中繼續查詢,否則中間鍵就是我們要找的鍵。
public
intrank(key key,int lo,int hi)
int mid = lo + (hi - lo)/2;
int cmp = key.compareto(keys[mid]);
if(cmp < 0)else
if(cmp >0)else
}
public
int rank(key key)else
if(cmp >0)else
}return lo;
}
使用的資料結構 | 實現 | 有點 | 缺點
鍊錶()| sequentialsearchst| 適用於小型問題|對大型符號表很慢
我們所使用的資料結構由結點組成,結點包含的鏈結可以指向空(null)或者其他結點。在二叉樹中,每個結點只能有乙個父結點指向自己(根結點沒有父結點),而且每個結點都只有在左右兩個鏈結,分別指向自己的左子結點,和右子結點。
定義:一顆二叉查詢樹是一顆二叉樹,其中每個結點都包含有乙個comparable的鍵(以及相關聯的值)且每個結點的鍵都大於其左子樹中的任意結點的鍵而小於右子樹的任意結點鍵。
演算法 查詢演算法
馬上秋招了,秋招考得多數是演算法,平常學別的過多,演算法基本都忘完了,今天回憶一下最基本的幾個。回憶起來突然發現當初的演算法也太簡單了,今天先從查詢法說起 二分查詢法 要求資料必須是從小到大 從大到小也行,反過來設計就可以了 像這樣的 1,3,5,6,9,10,11 查10先比較最中間的數 10 6...
查詢演算法 折半查詢演算法
折半查詢演算法 binary search param a 乙個有序的集合 本次為由小到大 param x 需要查詢的值 ps 首先使用折半演算法的時候 集合必須是有序的 eg a 1,3,5,7,9 x 3 a mid low height 1,3,5,7,9 2 0 1 1,3 0 1 1 3 ...
排序演算法 查詢演算法
排序演算法 交換排序 選擇排序 歸併排序 基數排序 查詢演算法 動態查詢 雜湊表查詢 簡介 n個資料,從1到n乙個乙個插入進行排序。空間複雜度 o 1 時間複雜度 o n2 演算法穩定性 穩定演算法 簡介 取幾個增量,如5,2,1 最後乙個增量必須為1 然後從左到右5個5個的排序 如 1到5資料排序...