一、緒論
1.算法的時間複雜度取決於問題的規模和待處理數據的初態
2.計算機算法必須具備:有窮性、確定性、可行性,
3.從邏輯上把數據結構分爲線性結構和非線性結構兩大類
4.與數據的存儲結構無關的術語:棧
5.多型數據類型:多型就是數據元素的類型不確定,比如字符串。
6.單鏈表屬於存儲結構
7.抽象數據類型的定義只取決於他的一組邏輯特性,而與其在計算機內部的表現形式無關,即不論其內部結構如何變化,只要他的數學特性不變,都不影響其外部使用
二、線性表
1.存儲密度大是順序存儲結構的一個優點
2.某線性表中最常用的操作是在最後一個元素之後插入一個元素和刪除第一個元素,則採用僅有尾指針的單循環鏈表存儲方式最節省運算時間
3.設一個鏈表最常用的操作是在末尾插入結點和刪除尾結點,則選用帶頭結點的雙循環鏈表最節省時間。
4.線性表既可以用順序存儲結構表示也可以用鏈式存儲結構表示
5.根據指針的連接方式,鏈表可以分爲動態鏈表和靜態鏈表
6.數據元素及直接後繼的存儲位置(地址)組成一個數據元素的存儲結構,稱爲:節點
7.頭結點:在單鏈表開始結點之前增設一個類型相同的結點
三、棧和隊列
1.、棧是實現過程和函數等子程序所必需的結構
2.採用鏈接方式存儲的隊列,在進行刪除操作時,鏈頭鏈尾指針都可能需要修改
3.隊列邏輯上是一個下端和上端既能增加又能減少的線性表。//這句話是對的,因爲這裏說的是邏輯上而不是實質上,即可以當作雙向隊列處理。
4.消除遞歸不一定需要使用棧//比如尾遞歸的消除
5.在循環隊列下,通常採用“犧牲一個存儲單元”或“作標記”的方法解決“隊滿”和“隊空”的判定問題。
6.由於棧只在棧頂操作,所以鏈棧通常不設頭結點
7.一個函數在結束本函數之前,直接或間接調用函數自身,稱爲遞歸。
四、串
1.串是一種數據元素和操作都特殊的線性表
五、數組與廣義表
1.b對角矩陣的b條對角線,在主對角線上方和下方各有b/2條對角線(爲敘述方便,下面設a=b/2)。從第1行至第a行,每行上的元素數依次是a+1,a+2,...,b-2,b-1,最後的a行上的元素個數是 b-1,b-2,...,a+1。中間的(n-2a )行,每行元素個數都是b。故b條對角線上元素個數爲 (n-2a)b+a*(a+b)。存放在一維數組V[1..nb-a(b-a)]中,其下標k與元素在二維數組中下標i和j的關係爲。。。
2.數組是具有相同性質的數據元素的集合,包括元素的值與下標
3.稀疏矩陣壓縮存儲後,必會失去隨機存取功能。
4.對長度爲無窮大的廣義表,由於存儲空間的限制,不能在計算機中實現。
六、樹和二叉樹
1.樹的根節點是有且只有一個,二叉樹爲0或1個
2.一棵哈夫曼樹的帶權路徑長度等於其中所有分支結點的權值之和。//這句話是錯的,因爲這裏說的是分支結點而不是葉子結點
3.在中序線索二叉樹中,每一非空的線索均指向其祖先結點。(沒弄懂)
4.若度爲m的哈夫曼樹中,其葉結點個數爲n,則非葉結點的個數爲(n-1)/(m-1)向下取整
5.一棵二叉樹高度爲h,所有結點的度或爲0,或爲2,則這棵二叉樹最少有2h-1結點(斜着向下)
6.. 利用二叉鏈表存儲樹,則根結點的右指針是空的(因爲二叉鏈表存儲的是,左孩子右兄弟,而根結點沒有兄弟)
7.若二叉樹採用二叉鏈表存儲結構,要交換其所有分支結點左、右子樹的位置,利用後序遍歷方法最合適。
8.樹(不是二叉樹)的存儲形式,有3中常用的存儲結構:①雙親表示法;②孩子表示法;③孩子兄弟表示法
樹的存儲方式有多種,既可以採用順序存儲,也可以採用鏈式存儲,無“順序存儲表示法”這一說法
9.哈夫曼樹(最優二叉樹)可以成爲二叉樹......
10.左子樹爲空的二叉樹的根結點的左線索爲空(無前驅),先序序列的最後結點的右線索爲空(無後繼),共2個空鏈域。
11.一棵左右子樹均不空的二叉樹在先序線索化後,其中空的鏈域的個數是1個
12.若X是二叉中序線索樹中一個有左孩子的結點,且X不爲根,則x的前驅爲x左子樹的最右結點
12.1若有一個結點是它的雙親的左子女,且它的雙親有右子女,則這個結點在後序遍歷中的後繼結點是其雙親右子樹最靠左的葉子結點
12.2後序線索樹中結點的後繼(根結點無後繼),要麼是其右線索(當結點的rtag=1時),要麼是其雙親結點右子樹中最左下的葉子結點。對中序線索二叉樹某結點,若其左標記等於1,則左子女爲線索,指向直接前驅;否則,其前驅是其左子樹上按中序遍歷的最後一個結點。
13. 後序線索樹 仍然需要棧的支持
14..二叉樹在線索後,仍不能有效求解的問題是後序線索樹求後序後繼
先序遍歷(中左右)、中序遍歷(左中右)的最後訪問的節點都是左或右葉節點,葉節點是沒有子樹的,所以兩個指針域空出來了,可以存放線索指針。但是後續遍歷(左右中),最後訪問的是子樹的根節點,而子樹根節點的兩個指針域都指向子樹了,所以不能空出來存放線索信息
15.設F是一個森林,B是由F變換得的二叉樹。若F中有n個非終端結點,則B中右指針域爲空的結點有n+1個
16.有向樹/有序樹/二叉樹。。。
17.哈夫曼樹父結點上出現的不是關鍵字的值,而是關鍵字出現的頻率
18.最優二叉樹(哈夫曼樹)、最優查找樹均爲平均查找路徑長度最小的樹,其中對最優二叉樹,n表示葉結點數,對最優查找樹,n表示結點數,構造這兩種樹均需要n個關鍵字的查找概率表)
19.在中序線索二叉樹中,每一非空的線索均指向其祖先結點
20.含有n個結點的滿二叉樹其葉子結點有(n+1)/2個,非葉子結點有(n-1)/2個
21.中綴表達式轉前綴或後綴,對中綴表達式按照運算優先級加括號,然後將運算符移到括號前面,去掉括號即前綴表達式/反之則爲後綴表達式
21.1計算後綴表達時,不需要進行運算符的優先次序的比較,只需依次計算即可
22.一棵算術表達式樹,可以用後序遍歷得到後綴表達式,再對錶達式進行求值
23.對m個權值,建k叉樹,若(m-1)%(k-1)=0,則不需要加“虛權值”,否則,第一次歸併時需(m-1)%(k-1)+1個權值歸併。
七、圖
1.n個頂點的強連通圖最少有n條邊,比如一個環
1.1n個頂點的連通圖最少有n-1條邊,比如一個點/一條線
2.BFS樹的高度小於或不等於DFS樹的高度
3.1)普里姆算法的時間複雜度爲O(n2),與網中的邊無關,因此適用於求邊稠密的網的生成樹。
2)克魯斯卡爾算法恰恰相反,他的時間複雜度爲O(eloge)(e爲網中的邊數),因此它相對於普里姆算法而言,適合於求邊稀疏的網的最小生成樹。
4.對於含有n個結點的帶權連通圖,它的最小生成樹是指圖中任意一個由n個頂點構成的權值之和最小的連通子圖
5.用DFS遍歷一個無環有向圖,並在DFS算法退棧返回時打印相應的頂點,則輸出的頂點序列是逆拓撲有序
6.當各邊上的權值均相等時,BFS算法可用來解決單源最短路徑問題。
7.一個n個結點的圖,最少有1個連通分量,最多有n個(不含有邊的時候)
8.鄰接多重表適合用來存儲稀疏無向圖
9.深度優先遍歷與拓撲排序可以用來判斷圖是否有環
10.一個事件的最遲開始時間爲以該事件爲尾的弧的活動最遲完成時間與該活動的持續時間的差
11..樹中的結點和圖中的頂點就是指數據結構中的數據元素
12.在n個結點的無向圖中,若邊數大於n-1,則該圖必是連通圖。(這句話是錯的,可能是若干連通分量)
13.有向圖的鄰接表和逆鄰接表中結點的個數一定是相等的
14.pirm算法中,邊的權不允許沒負數
15.既使有向無環圖的拓撲序列唯一,也不能唯一確定該圖(這句話是錯的,但是很迷...)
16.對一個AOV網,從源點到終點的路徑最長的路徑稱作關鍵路徑(這句話是錯的,aov網沒有這個說法)
17.能求出關鍵路徑的AOE網一定是有向無環圖
18.判斷一個無向圖是一棵樹的條件是有n個頂點和n-1條邊的無向連通圖
19.一個圖的生成樹是圖的極小連通子圖
20.連通圖一定指的是無向圖,有向圖稱爲強連通圖
21.所謂圖的遍歷,實際上指的是查找頂點的鄰接點的過程
21.1BFS/DFS的差異體現在訪問頂點的先後順序,體現在數據結構上,則是隊列和棧
22.弱連通有向圖指把有向圖看作無向圖時,仍是連通的
23.二部圖的鄰接矩陣是一個分塊對稱矩陣
24.稀疏矩陣的定義是非零個數遠小於該矩陣元素個數,且分佈無規律
25.如何對有向圖中的頂點號重新安排可使得該圖的鄰接矩陣中所有的1都集中到對角線以上(按照出度排序)
26.對圖進行不同方式遍歷得到的遍歷結果不同的原因:開始遍歷的頂點不同;存儲結構不同;在鄰接表情況下鄰接點的順序不同
27.在有相同權值的條件下,pirm/kruskal算法會生成不同的MST
28.AOE網的始點是入度爲零的頂點,該頂點所代表的事件無任何先決條件,可首先開始。終點是出度爲零的頂點,表示一項工程的結束。正常的AOE網只有一個始點和一個終點。
八、查找:
1.在各種查找方法中,平均查找長度與結點個數n無關的查法方法是哈希表查找法
2..哈希函數構造的原則是:它的函數值應以同等概率的取其值域的每一個值。
2.1採用直接定址法構造的哈希函數一定不會發生衝突
3.二次探測再散列,探測的步長是一個正負平方
4.評價哈希函數的好壞主要看:能否將關鍵字均勻影射到哈希空間上,有無好的解決衝突的方法,計算哈希函數是否簡單高效
5.對大小均爲n的有序表和無序表分別進行順序查找,在等概率查找的情況下,對於查找失敗,它們的平均查找長度是不相同的 ,對於查找成功,他們的平均查找長度是相同的
6.B-樹的根結點中的數據(應該是關鍵字)是有序的
7.B樹只適合隨機檢索,B+樹同時支持隨機檢索和順序檢索;
8.採用鏈地址法/再哈希法解決衝突,不易產生聚集
9.平衡二叉樹本質上是二叉排序樹,但是完全二叉樹雖然平衡因子滿足平衡二叉樹的要求,但是他未必是排序樹
10.B-樹中所有結點的平衡因子都爲零
10.1B-樹的關鍵字都在葉子結點中
11.採用線性探測法處理散列時的衝突,當從哈希表刪除一個記錄時,不應將這個記錄的所在位置置空,因爲這會影響以後的查找。
12.用分離的同義詞和結合的同義詞解決碰撞的方法均屬於鏈地址法
13.散列表的關鍵字查找,就是計算其mod值,然後根據情況依次比較
14.在B-樹中查找關鍵字從根結點開始,從根往下查找結點,然後在結點內查找關鍵字,得出查找成功與否的結論。B+樹的非終端結點是索引部分,其查找從根開始,從根往下查到關鍵字後,要繼續查到最下層結點,得到查找成功與否的結論。另外,B+樹還可以在最下層從最小關鍵字開始,從左往右進行順序查找,B-樹則不能作順序查找。
15.m階的B+樹和B-樹主要區別有三:(1)有n棵子樹的結點中含有n(B-樹中n-1)個關鍵字;(2)B+樹葉子結點包含了全部關鍵字信息,及指向含關鍵字記錄的指針,且葉子結點本身依關鍵字大小自小到大順序鏈接;(3)B+樹的非終端結點可以看成是索引部分,結點中只含其子樹(根結點)中最大(或最小)關鍵字。B+樹的查找既可以順序查找,也可以隨機查找,B-只能順序查找。
16.B-樹中葉子結點數s與關鍵字數n的關係式:s=n+1
17. 滿二叉檢索樹符合B樹定義,B樹的插入和刪除算法不適用於滿二叉檢索樹,滿二叉樹的插入和刪除操作都破壞了多路平衡查找樹葉子結點都在同一層上的條件
九、排序
1.一個堆是一棵完全二叉樹
2.若要求儘可能快地對序列進行穩定的排序,則應該選歸併排序
4在初始序列已基本有序(除去n個元素中的某k個元素後即呈有序,k<<n)的情況下,排序效率最高的算法是:直接插入排序
5.鏈接:https://www.nowcoder.com/questionTerminal/cfae9292fe3c41e392f9522a0857b9eb
來源:牛客網
5.1、總排序趟數與初始狀態無關的有:(除了快速排序和冒泡,其他都是)
5.2、算法複雜度與初始狀態無關的有:堆排序、歸併排序、選擇排序、基數排序。
5.3、元素總比較次數與初始狀態無關的有:選擇排序、基數排序/歸併排序/折半排序
5.4、元素總移動次數與初始狀態無關的有:歸併排序、基數排序。
6.採用敗者樹進行k路平衡歸併的外部排序算法,其總的歸併效率與k有關
7. 外排序的基本操作過程是生成初始有序歸併段與歸併,而提高排序速度很重要的是減少歸併趟數,我們將採用增加歸併路數和減少初始歸併段個數方法來提高排序速度。
8.對於有n個有序的關鍵字,緩衝區大小爲m,可以產生n/m(向上取整)個初始歸併段