一、有序表的歸併演算法
思想:(在不破壞原有表的情況下)將兩個有序表合併成乙個有序表可以採用二路歸併演算法。
分別掃瞄la和lb兩個有序表,當兩個有序表都沒有掃瞄完時迴圈:比較la、lb的當前元素,將其中較小的元素放入lc中,再從較小元素所在的有序表中取出下乙個元素。重複這一過程直到la或lb比較完畢,最後將為比較完的有序表中餘下元素放入lc中。
假設表的長度分別為m、n,則時間複雜度為o(m+n),最好情況下比較次數為m/n,最壞情況下為m+n-1
例如:la=;lb=,其二路歸併過程如圖所示:
二、雙端佇列
即兩端都可以進隊和出隊操作的佇列。
補充:環形佇列中,隊頭指標front指向佇列中隊首元素的前乙個位置,隊尾指標rear指向佇列中的隊尾元素
三、串
#概念:串(字串),由零個或多個字元組成的有限序列。
空串:不包含任何字元的串,長度為0。空串是任何串的子串。
串中所含字元的個數是該串的長度。通常表示為「a1a2...an」
當且僅當兩個串的長度相等並且各個對應位置上的字元都相同時,這兩個串才相等。
乙個串中任意個連續字元組成的序列稱為該串的子串。
在串中空格字元用□表示
#儲存結構:順序儲存結構(順序串)和鏈式儲存結構(鏈串)
%順序串的兩種儲存方法:
①非緊縮格式(儲存密度小):每個單元只存乙個字元。
②緊縮格式(儲存密度大):每個單元存放多個字元。
說明:圖中有陰影的位元組為空閒部分。
%鏈串:鏈串中的乙個節點可以儲存多個字元。通常將鏈串中每個節點儲存的字元個數稱為節點大小。
主要有節點大一1和節點等於1兩種。
優缺點:節點越大,儲存密度越大,但運算處理不方便;
節點越小,運算處理越方便,但儲存密度下降。
#串的模式匹配
模式匹配(定位):即在主串s(目標串)中找到乙個與子串t(模式串)相等的子串。
此處假設串採用順序儲存結構;
%bf(簡單匹配)演算法:
思路:從目標串s="s0s1...sn-1"的第乙個字元開始和模式串t="t0t1...tm-1"中的第乙個字元比較,若相等,則繼續逐個比較後序字元;否則從目標串s的第二個字元開始重新與模式串t的第乙個字元進行比較。以此類推,若從模式串s的第i個字元開始,每個字元依舊與目標串t中的對應字元相等,則匹配成功;否則,匹配失敗,返回-1;
例如:目標串s="aaaaab",模式串t="aaab",s長度n=6,m長度m=4
總結:①第k(k>=1)次比較是從s中字元sk-1開始與t中的第乙個字元t0比較。
②設某一次匹配有si不等於tj,其中0<=i<=n,0<=j=j,則應有si-1=tj-1,...,si-j+1=t1,si-j=t0;
(此時k=i-j)下一次比較目標串的字元si-j+1和模式串的字元t0;一般過程如下:
也就是說,某次匹配不成功時,下一次目標串s從si-j+1開始,t從t0開始比較。成功時返回匹配的第乙個字元的下標;
缺點:效率不高,原因:主串指標回溯(i=i-j+1);
最好情況下時間複雜度o(m);最壞情況下時間複雜度o(mn);
%kmp演算法:
kmp演算法主要消除bf演算法中主串指標回溯的問題,從而提高演算法效率。
kmp演算法思想:設s為目標串,t為模式串,並設i指標和j指標分別指示目標串和模式串中正在比較的字元,令i和j的初始值均為0;若有si=tj,則i和j分別增1,否則,i不變,j退回到j=next[j]的位置(即模式串右滑),比較si和tj,若相等,則指標各增1,否則j再退回到下乙個j=next[j]的位置(即模式串繼續右滑),再比較si和tj。以此類推,知道出現以下兩種情況之一:一是j退回到某個j=next[j]位置時有si=tj,則指標各增1後繼續匹配;二是j退回到j=-1,此時令i、j指標各增1,即從si+1和t0開始繼續匹配。
next陣列的解釋如下:
kmp演算法匹配過程如下:
複雜度分析:
設主串s的長度為n,子串t的長度為m,在kmp演算法中求next陣列的時間複雜度為o(n),在之後的匹配中主串s的下標i不回溯,比較次數為n,所以kmp演算法的時間複雜度為o(n+m)。
資料結構及演算法知識(二)
總結 線性結構 線性表 棧 佇列 串 陣列 廣義表 非線性結構 數 二叉樹 哈弗曼樹 帶權路徑長度最小的二叉樹。帶權路徑長度wpl 所有葉子節點的權值 路徑長度 一 並查集 並查集支援查詢乙個元素所屬的集合以及合併兩個元素各自所屬的集合等運算。在這種資料型別中,n個不同的元素被分為若干組,每組是乙個...
資料結構及演算法知識(四)
排序 內排序 在排序過程中,若整個表都是放在記憶體中處理,排序是不涉及內外存資料的交換,則稱之為內排序。外排序 若排序過程中要進行內外存資料的交換,則稱之為外排序。內排序適用於元素個數不是很多的小表,外排序適用於元素個數很多,不能一次將全部元素放入記憶體的大表。內排序有 插入排序 交換排序 選擇排序...
java資料結構及演算法一
第一章 概論 什麼是資料結構?有一定組織結構的資料。為什麼用資料結構?提高程式的執行效率。什麼是演算法?執行特定任務的過程。大多數演算法直接應用到某類資料結構上,我們需要知道演算法主要是 插入新值 查詢給定的值和刪除給定的值等操作,還有迭代,排序和遞迴。具體的資料結構有 組,有序組,棧,隊,鍊錶,二...