map:map內部實現是紅黑樹,具有自動排序的功能,因此map內部元素都是有序的,紅黑樹的每乙個節點都代表著map的乙個元素。map的查詢、插入、刪除操作的時間複雜度都是o(logn)。
unordered_map:unordered_map內部實現是雜湊表(也叫雜湊表,通過把關鍵碼值對映到hash表中乙個位置來訪問記錄,查詢的時間複雜度可達到o(1))。因此,其元素的排列順序是無序的。
紅黑樹是一種是一種不嚴格的平衡二叉查詢樹,是「近似平衡」的。
1、紅黑樹放棄了追求完全平衡,追求近似平衡,在與平衡二叉樹的時間複雜度相差不大的情況下,保證每次插入最多隻需要三次旋轉就能達到平衡,實現起來也更為簡單。紅黑樹的高度近似 log2n,插入、刪除、查詢操作的時間複雜度都是 o(logn)。
2、平衡二叉樹追求絕對平衡,條件比較苛刻,實現起來比較麻煩,每次插入新節點之後需要旋轉的次數不能預知。
雜湊函式:
雜湊函式計算得到的雜湊值是乙個非負整數;
如果 key1 = key2,那 hash(key1) == hash(key2);
如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。
雜湊衝突解決方法:
開放定址法:線性探測,二次探測,雙重雜湊
線性探測:往雜湊表中插入資料時,如果某個資料經過雜湊函式雜湊之後,儲存位置已經被占用了,我們就從當前位置開始,依次往後查詢,看是否有空閒位置,直到找到為止。
我們可以將刪除的元素,特殊標記為 deleted。當線性探測查詢的時候,遇到標記為 deleted 的空間,並不是停下來,而是繼續往下探測。
鍊錶法(鍊錶可以使用紅黑樹或者跳表進行優化)
使用紅黑樹或者跳表這樣的資料結構(同上)
第一,雜湊表中的資料是無序儲存的,如果要輸出有序的資料,需要先進行排序。而對於紅黑樹來說,只需要中序遍歷,就可以在 o(n) 的時間複雜度內,輸出有序的資料序列。
第二,雜湊表擴容耗時很多,而且當遇到雜湊衝突時,效能不穩定,儘管二叉查詢樹的效能不穩定,但是在工程中,我們最常用的平衡二叉查詢樹的效能非常穩定,時間複雜度穩定在 o(logn)。
第三,儘管雜湊表的查詢等操作的時間複雜度是常量級的,但因為雜湊衝突的存在,這個常量不一定比 logn 小,所以實際的查詢速度可能不一定比 o(logn) 快。加上雜湊函式的耗時,也不一定就比平衡二叉查詢樹的效率高。
第四,雜湊表的構造比二叉查詢樹要複雜,需要考慮的東西很多。比如雜湊函式的設計、衝突解決辦法、擴容、縮容等。平衡二叉查詢樹只需要考慮平衡性這乙個問題,而且這個問題的解決方案比較成熟、固定。
考慮分治法,每兩個鍊錶進行合併
類似歸併的思路
字典樹的應用
擴充套件:如果搜尋的字串在匹配字串中間,也需要作為結果輸出,怎麼辦?
ac自動機?
js資料結構 知識點 陣列
1.join和tostring 同 都可將陣列轉換為字串。異 join可自定義拼接的連線符號,預設為 而tostring只有 例如 var a 1,2,3 a.join 1,2,3 a,join 1 2 3 a.tostring 1,2,3 2.深拷貝,淺拷貝,一層深拷貝 針對引用資料型別產生的問題...
資料結構 知識點
定義 度 兒子數 分支節點 除了根和葉子的節點 根的深度為1 資料結構的分類 資料結構分為邏輯結構和物理結構。邏輯結構 表現資料之間的關係的一種資料結構,分為線性結構和非線性結構。物理結構 表現資料如何儲存的一種資料結構,通常分為順序結構 鏈式結構 索引結構和雜湊結構。有序表,也叫有序線性表,資料按...
資料結構知識點
1 線性結構與非線性結構 線性結構 線性表,棧,隊 乙個根節點,最多乙個前節點乙個後節點 首節點無前節點,尾接點無後節點 非線性結構 樹形結構,圖形結構 線性表 由一組資料元素構成,資料元素的位置只取決於自己的序號 陣列 棧 限定只能在表的一端進行插入和刪除,先進後出,只能在棧頂進出 佇列 只能在表...