A. 請問數據結構單鏈表中的存儲池概念表示什麼意思
什麼是數據、數據對象、數據元素、數據結構、數據的邏輯結構與物理結構、邏輯結構與物理結構間的關系。
2、面向對象概念:理解什麼是數據類型、抽象數據類型、數據抽象和信息隱蔽原則。了解什麼是面向對象。由於目前關於這個問題有許多說法,我們採用了一種最流行的說法,即Coad與Yourdon 給出的定義:面向對象 = 對象 + 類 + 繼承 + 通信。
要點:
·抽象數據類型的封裝性
·面向對象系統結構的穩定性
·面向對象方法著眼點在於應用問題所涉及的對象
3、數據結構的抽象層次:理解用對象類表示的各種數據結構
4、演算法與演算法分析:理解演算法的定義、演算法的特性、演算法的時間代價、演算法的空間代價。
要點:·演算法與程序的不同之處需要從演算法的特性來解釋
·演算法的正確性是最主要的要求
·演算法的可讀性是必須考慮的
·程序的程序步數的計算與演算法的事前估計
·程序的時間代價是指演算法的漸進時間復雜性度量
第二章 數組
1、作為抽象數據類型的數組:數組的定義、數組的按行順序存儲與按列順序存儲
要點:
·數組元素的存放地址計算
2、順序表:順序表的定義、搜索、插入與刪除
要點:
·順序表搜索演算法、平均比較次數的計算
·插入與刪除演算法、平均移動次數的計算
3、多項式:多項式的定義
4、字元串:字元串的定義及其操作的實現
要點:
·串重載操作的定義與實現
第三章 鏈接表
1、單鏈表:單鏈表定義、相應操作的實現、單鏈表的游標類。
要點:
·單鏈表的兩種定義方式(復合方式與嵌套方式)
·單鏈表的搜索演算法與插入、刪除演算法
·單鏈表的遞歸與迭代演算法
2、循環鏈表:單鏈表與循環鏈表的異同
3、雙向鏈表:雙向鏈表的搜索、插入與刪除演算法、鏈表帶表頭結點的優點
4、多項式的鏈接表示
第四章 棧與隊列
1、棧:棧的特性、棧的基本運算
要點:
·棧的數組實現、棧的鏈表實現
·棧滿及棧空條件、抽象數據類型中的先決條件與後置條件
2、棧的應用:用後綴表示計算表達式,中綴表示改後綴表示
3、隊列:隊列的特性、隊列的基本運算
要點:
·隊列的數組實現:循環隊列中隊頭與隊尾指針的表示,隊滿及隊空條件
·隊列的鏈表實現:鏈式隊列中的隊頭與隊尾指針的表示、
4、雙向隊列:雙向隊列的插入與刪除演算法
5、優先順序隊列:優先順序隊列的插入與刪除演算法
第五章 遞歸與廣義表
1、遞歸:遞歸的定義、遞歸的數據結構、遞歸問題用遞歸過程求解
要點:·鏈表是遞歸的數據結構,可用遞歸過程求解有關鏈表的問題
2、遞歸實現時棧的應用
要點:·遞歸的分層(樹形)表示:遞歸樹
·遞歸深度(遞歸樹的深度)與遞歸工作棧的關系
·單向遞歸與尾遞歸的迭代實現
3、廣義表:廣義表定義、廣義表長度、廣義表深度、廣義表表頭、廣義表表尾
要點:
·用圖形表示廣義表的存儲結構
·廣義表的遞歸演算法
第六章 樹與森林
1、樹:樹的定義、樹的基本運算
要點:
·樹的分層定義是遞歸的
·樹中結點個數與高度的關系
2、二叉樹:二叉樹定義、二叉樹的基本運算
要點:
·二叉樹性質、二叉樹中結點個數與高度的關系、不同種類的二叉樹棵數
·完全二叉樹的順序存儲、完全二叉樹的雙親、子女和兄弟的位置
·二叉樹的前序·中序·後序·層次遍歷
·前序
·中序
·後序的線索化二叉樹、前驅與後繼的查找方法
3、霍夫曼樹:霍夫曼樹的構造方法、霍夫曼編碼、帶權路徑長度的計算
4、樹的存儲:樹的廣義表表示、樹的雙親表示、樹與二叉樹的對應關系、樹的先根·中根·後根·層次遍歷。
5、堆:堆的定義、堆的插入與刪除演算法
要點:
·形成堆時用到的向下調整演算法及形成堆時比較次數的上界估計
·堆插入時用到的向上調整演算法
第七章 集合與搜索
1、集合的概念:集合的基本運算、集合的存儲表示
要點:
·用位數組表示集合時集合基本運算的實現
·用有序鏈表表示集合時集合基本運算的實現
2、並查集:並查集定義、並查集的三種基本運算的實現
3、基本搜索方法
要點:
·對一般表的順序搜索演算法(包括有監視哨和沒有監視哨)
·對有序順序表的順序搜索演算法、用判定樹(即擴充二叉搜索樹)描述搜索,以及平均搜索長度(成功與不成功)的計算。
·對有序順序表的折半搜索演算法、用判定樹(即擴充二叉搜索樹)描述搜索,以及平均搜索長度(成功與不成功)的計算。
4、二叉搜索樹:
要點:
·動態搜索樹與靜態搜索樹的特性
·二叉搜索樹的定義、二叉搜索樹上的搜索演算法、二叉搜索樹搜索時的平均搜索長度(成功與不成功)的計算。
·AVL樹結點上的平衡因子、AVL樹的平衡旋轉方法
·高度為h的AVL樹上的最少結點個數與最多結點個數
· AVL樹的搜索方法、插入與刪除方法
第八章 圖
1、圖:圖的定義與圖的存儲表示
要點:
·鄰接矩陣表示(通常是稀疏矩陣)
·鄰接表與逆鄰接表表示
·鄰接多重表(十字鏈表)表示
2、深度優先遍歷與廣度優先遍歷
要點:
·生成樹與生成樹林的定義
·深度優先搜索是個遞歸的過程,而廣度優先搜索是個非遞歸的過程
·為防止重復訪問已經訪問過的頂點,需要設置一個訪問標志數組visited
3、圖的連通性
要點:
·深度優先搜索可以遍歷一個連通分量上的所有頂點
·對非連通圖進行遍歷,可以建立一個生成森林
·對強連通圖進行遍歷,可能建立一個生成森林
·關節點的計算和以最少的邊構成重連通圖
4、最小生成樹
要點:
·對於連通網路、可用不會構成環路的權值最小的n-1條邊構成最小生成樹
·會畫出用Kruskal演算法及Prim演算法構造最小生成樹的過程
5、單源最短路徑
要點:
·採用逐步求解的方式求某一頂點到其他頂點的最短路徑
·要求每條邊的權值必須大於零
6、活動網路
要點:
·拓撲排序、關鍵路徑、關鍵活動、AOE網
·拓撲排序將一個偏序圖轉化為一個全序圖。
·為實現拓撲排序,要建立一個棧,將所有入度為零的頂點進棧
·關鍵路徑的計算
第九章 排序
1、基本概念:關鍵碼、初始關鍵碼排列、關鍵碼比較次數、數據移動次數、穩定性、附加存儲、內部排序、外部排序
2、插入排序:
要點:
·當待排序的關鍵碼序列已經基本有序時,用直接插入排序最快
3、選擇排序:
要點:
·用直接選擇排序在一個待排序區間中選出最小的數據時,與區間第一個數據對調,而不是順次後移。這導致方法不穩定。
·當在n個數據(n很大)中選出最小的5 ~ 8個數據時,錦標賽排序最快
·錦標賽排序的演算法中將待排序的數據個數n補足到2的k次冪2k-1<n≤2k
·在堆排序中將待排序的數據組織成完全二叉樹的順序存儲。
4、交換排序:
要點:
·快速排序是一個遞歸的排序方法
·當待排序關鍵碼序列已經基本有序時,快速排序顯著變慢。
5、二路歸並排序:
要點:
·歸並排序可以遞歸執行
·歸並排序需要較多的附加存儲。可以採用一種"推拉法"(參見教科書上習題)實現歸並排序,演算法的時間復雜度為O (n)、空間復雜度為O(1)
·歸並排序對待排序關鍵碼的初始排列不敏感,排序速度較穩定
6、外排序
要點:
·多路平衡歸並排序的過程、I/O緩沖區個數的配置
·外排序的時間分析、利用敗者樹進行多路平衡歸並
·利用置換選擇方法生成不等長的初始歸並段
·最佳歸並樹的構造及WPL的計算
第十章 索引與散列
1、線性索引:
要點:
·密集索引、稀疏索引、索引表計算
·基於屬性查找建立倒排索引、單元式倒排表
2、動態搜索樹
要點:
·平衡的m路搜索樹的定義、搜索演算法
·B樹的定義、B樹與平衡的m路搜索樹的關系
·B樹的插入(包括結點分裂)、刪除(包括結點調整與合並)方法
·B樹中結點個數與高度的關系
·B+樹的定義、搜索、插入與刪除的方法
3、散列表
要點:
·散列函數的比較
·裝填因子 a 與平均搜索長度的關系,平均搜索長度與表長m及表中已有數據對象個數n的關系
·解決地址沖突的(閉散列)線性探查法的運用,平均探查次數的計算
·線性探查法的刪除問題、散列表類的設計中必須為各地址設置三個狀態
·線性探查法中的聚集問題
·解決地址沖突的(閉散列)雙散列法的運用,平均探查次數的計算
·雙散列法中再散列函數的設計要求與表長m互質,為此m設計為質數較宜
·解決地址沖突的(閉散列)二次散列法的運用,平均探查次數的計算
·注意:二次散列法中裝填因子 a 與表長m的設置
·解決地址沖突的(開散列)鏈地址法的運用,平均探查次數的計算
B. 什麼事靜態鏈表我是個數據結構初學者,有點不理解。請各位幫忙解釋一下,希望能有例子。
以前學習的各種鏈表都是由指針實現的,鏈表中結點的分配和回收(即釋放)都是由系統提供的標准函數malloc和free動態實現的,故稱之為動態鏈表。但是有的高級語言,如BASIC、FORTRAN等,沒有提供」指針」這種數據類型,此時若想採用鏈表做存儲結構,就必須使用」游標」來模擬指針,由程序員自己編寫」分配結點」和」回收結點」的過程。
用游標實現鏈表,其方法是:定義一個較大的結構數組作為備用結點空間(即存儲池)。當申請結點時,每個結點應含有兩個域:data域和cursor域。data域用來存放結點的數據信息,需注意的是,此時的cursor域不在是指針而是游標指示器,游標指示器指示其後繼結點在結構數組中的相對位置(即數組下標)。數組的第0個分量可以設計成表的頭結點,頭結點的next域指示了表中第一個結點的位置。表中當前最後一個結點的域為0,表示靜態單鏈表的結束。我們把這種用游標指示器實現的單鏈表叫做靜態單鏈表,static linked list。靜態單鏈表同樣可以藉助一維數組來描述:
#define Maxsize = 鏈表可能達到的最大長度
typedef struct
{
ElemType data;
int cursor;
}Component, StaticList[Maxsize];
假如有如上的靜態鏈表S中存儲這線性表(a,b,c,d,e,f,g,h,i),Maxsize=11,如圖所示,要在第四個元素後插入元素e,方法是:先在當前表尾加入一個元素e,即:S[9].data = e;然後修改第四個元素的游標域,將e插入到鏈表中,即:S[9].cursor = S[4].cursor; S[4].cursor = 9;,接著,若要刪除第8個元素h,則先順著游標鏈通過計數找到第7個元素存儲位置6,刪除的具體做法是令S[6].cursor = S[7].cursor。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zzhangjiej/archive/2008/09/04/2880675.aspx
C. 存儲裡面,存儲池到底是怎麼樣一個概念呢一直比較困惑~~
存儲池是 Data Protection Manager (DPM) 伺服器在其中存儲副本、卷影副本和傳輸日誌的一組磁碟。您必須向存儲池添加至少一個磁碟才可開始保護數據。添加到存儲池的磁碟應是空的。為了准備數據保護,DPM 重新格式化磁碟並擦除磁碟上的任何數據。DPM 伺服器必須安裝至少兩個磁碟,_一個專用於啟動、系統和 DPM 安裝文件,而另一個專用於存儲池。在 DPM
環境中,"磁碟"是指在 Windows 磁碟管理工具中顯示為磁碟的任何磁碟設備。DPM 不會將含有啟動文件、系統文件或 DPM
安裝的任何組件的任何磁碟添加到存儲池。
D. 靜態鏈表的結點類型slonde
鏈表中結點的分配和回收是由系統提供的標准函數malloc和free動態實現的,稱之為動態鏈表。而通過定義一個較大的結構體數組來作為備用結點空間(即存儲池),每個結點應至少含有兩個域:data域和cursor域;
E. 創建存儲池是什麼意思
存儲池是 Data Protection Manager (DPM) 伺服器在其中存儲副本、卷影副本和傳輸日誌的一組磁碟。在主菜單中選擇存儲管理器 -存儲池,然後單擊即可創建儲存池
常用的儲存池套件是都支持Btrfs格式,有部分套件只支持ext4格式。
F. 順序鏈表到底是什麼,在哪裡講的
順序鏈表
順序鏈表其實就是一個動態的數組而已。在該鏈表的結構體中包含鏈表的基地址和鏈表當前的長度和鏈表當前已分配的存儲容量。
注意:順序鏈表不和單鏈表和雙鏈表一樣,它並不是每個元素都包含在一個結點裡面。它是類似於數組,有一個類似數組名的基地址和一個表示鏈表當前長度的變數以及一個表示當前已分配容量的變數。並且這些均屬於整個鏈表。並不屬於某個元素。
#include <iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef bool Status;
#define OK true
#define ERROR false
//定義一個鏈表結點
typedef struct
{
int *elem; //基地址指針,可以理解為就是一個動態數組的名字而已
int length;//當前長度
int listsize;//當前分配的存儲容量
}SqList;
//初始化鏈表函數
Status InitList(SqList &L)
{
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L.elem)
{
cout << "Error!" << endl;
exit(0);
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
Status ListInsert(SqList &L,int i,int e)
{
if (i<1 || i>L.length+1)
return ERROR;
if (L.length >= L.listsize)
{
int *newbase = (int *)realloc(L.elem,(L.listsize + LISTINCREAMENT)*sizeof(int));
if (!newbase)
{
cout << "Error!" << endl;
exit(0);
}
L.listsize += LISTINCREAMENT;
L.elem = newbase;
}
int *q = &(L.elem[i-1]);//獲得i元素的指針
for (int *p = &(L.elem[L.length - 1]);p >= q; --p)
{
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
Status ListDelete(SqList &L,int i,int &e)
{
int *p = &(L.elem[i]);
e = *p;
int *q = &(L.elem[L.length]);
for (; p != q; ++p)
{
*(p - 1) = *p;
}
--L.length;
return OK;
}
int main()
{
SqList q;
InitList(q);
for (int i = 0;i < 10; i++)
{
cin >> q.elem[i];
q.length++;
}
for (i = 0;i < q.length; i++)
{
cout << q.elem[i] << " ";
}
cout << endl;
ListInsert(q,5,6);
for (int *p = q.elem;p != &(q.elem[q.length]);++p)
{
cout << *p << " ";
}
cout << endl;
int e;
ListDelete(q,5,e);
for (p = q.elem;p != &(q.elem[q.length]);++p)
{
cout << *p << " ";
}
return 0;
}
G. 什麼是存儲池
您必須向存儲池添加至少一個磁碟才可開始保護數據。添加到存儲池的磁碟不應具有任何分區。為了將磁碟用於數據保護,DPM 會重新格式化磁碟並擦除磁碟上的任何數據。DPM 伺服器必須至少安裝兩個磁碟:一個專用於啟動、系統和 DPM 安裝文件;另一個專用於存儲池。在 DPM 環境中,「磁碟」是指在 Windows 磁碟管理工具中顯示為磁碟的任何磁碟設備。DPM 不會將含有啟動文件、系統文件或 DPM 安裝的任何組件的任何磁碟添加到存儲池。
H. 靜態鏈表和動態鏈表的區別
靜態鏈表是用數組實現的,是順序的存儲結構,在物理地址上是連續的,而且需要預先分配大小。動態鏈表是用申請內存函數(C是malloc,C++是new)動態申請內存的,所以在鏈表的長度上沒有限制。動態鏈表因為是動態申請內存的,所以每個節點的物理地址不連續,要通過指針來順序訪問。靜態鏈表在插入、刪除時也是通過修改指針域來實現的,與動態鏈表沒有什麼分別(動態鏈表還需要刪除內存)。。不知道我的回答是不是解決了你的問題,希望可以幫到你。 (其實用鏈表一般都是動態鏈表或者結構數組)
I. 靜態單鏈表和動態單鏈表有什麼區別
靜態鏈表: 所有結點都是在程序中定義,不是臨時開辟的,也不能用完後釋放。
動態鏈表: 在需要時才開辟一個結點的存儲單元。
靜態鏈表內存大小是規定了的 動態鏈表可以根據類型來申請不同的內存大小