資料結構實現 4.1:集合_基於二分搜尋樹實現(C++版)
阿新 • • 發佈:2018-11-27
資料結構實現 4.1:集合_基於二分搜尋樹實現(C++版)
1. 概念及基本框架
集合 是一種高階資料結構,其實現方法也不唯一,但儲存上使用 鏈式儲存(即記憶體的物理空間是不連續的)。這一節我們通過 二分搜尋樹 來實現集合這種資料結構。
集合 的基本特性:集合內的元素 不能重複 。
注:有些集合(多重集合)中元素也可以重複。
顯然,二分搜尋樹滿足集合的特性,所以我們嘗試利用二分搜尋樹來實現集合。
我們先利用一個由 純虛擬函式 構成的 抽象類 作為一個介面來定義這些操作。具體程式碼如下:
template <class T>
class Set{
public:
virtual int size() = 0;
virtual bool isEmpty() = 0;
//增加操作
virtual void add(T num) = 0;
//刪除操作
virtual void remove(T num) = 0 ;
//查詢操作
virtual bool contains(T num) = 0;
};
下面只需要通過繼承 抽象類,並且重寫 純虛擬函式 ,就可以完成 集合 的實現。集合類的框架如下:
template <class T>
class BSTSet : public Set<T>{
...
private:
BST<T> bst;
};
這裡為了避免重複設計就可以相容更多資料型別,引入了 泛型 ,即 模板 的概念。(模板的關鍵字是 class 或 typename)
這裡的 bst 表示一棵 二分搜尋樹 ,同樣,為了保護資料,變數設定為 private
注:這裡沒有顯式的給出建構函式,因為子類中除了二分搜尋樹物件之外沒有特別需要初始化的東西。編譯器會預設先呼叫 二分搜尋樹 類(即父類)的建構函式,再去呼叫 集合 類(即子類)的建構函式。
實現了前面的程式之後,接下來就是一個集合的增、刪、查以及一些其他基本操作,接下來利用程式碼去實現。
2. 基本操作程式實現
2.1 增加操作
template <class T>
class BSTSet : public Set<T>{
public:
...
//增加操作
void add(T num){
bst.add(num);
}
...
};
直接呼叫二分搜尋樹的增加操作。(因為二分搜尋樹中的元素本來就不重複)
2.2 刪除操作
template <class T>
class BSTSet : public Set<T>{
public:
...
//刪除操作
void remove(T num){
bst.remove(num);
}
...
};
直接呼叫二分搜尋樹的刪除操作。
2.3 查詢操作
template <class T>
class BSTSet : public Set<T>{
public:
...
//查詢操作
bool contains(T num){
return bst.contains(num);
}
...
};
2.4 其他操作
集合還有一些其他的操作,包括 集合大小 的查詢等操作。
template <class T>
class BSTSet : public Set<T>{
public:
int size(){
return bst.size();
}
bool isEmpty(){
return bst.isEmpty();
}
...
};
3. 演算法複雜度分析
因為集合操作直接呼叫了二分搜尋樹的操作,所以其操作的時間複雜度和二分搜尋樹相同。
3.1 增加操作
函式 | 最壞複雜度 | 平均複雜度 |
---|---|---|
add | O(n) | O(logn) |
3.2 刪除操作
函式 | 最壞複雜度 | 平均複雜度 |
---|---|---|
remove | O(n) | O(logn) |
3.3 查詢操作
函式 | 最壞複雜度 | 平均複雜度 |
---|---|---|
contains | O(n) | O(logn) |
總體情況:
操作 | 時間複雜度 |
---|---|
增 | O(logn) |
刪 | O(logn) |
查 | O(logn) |
很顯然,利用二分搜尋樹很容易實現集合這一高階資料結構。
4. 完整程式碼
程式完整程式碼(這裡使用了標頭檔案的形式來實現類)如下,本節不再提供 二分搜尋樹 類的實現程式碼,如有需要,可參看 3.1 。
抽象類 介面程式碼:
#ifndef __SET_H__
#define __SET_H__
template <class T>
class Set{
public:
virtual int size() = 0;
virtual bool isEmpty() = 0;
//增加操作
virtual void add(T num) = 0;
//刪除操作
virtual void remove(T num) = 0;
//查詢操作
virtual bool contains(T num) = 0;
};
#endif
集合類 程式碼:
#ifndef __BSTSET_H__
#define __BSTSET_H__
#include "BST.h"
#include "Set.h"
template <class T>
class BSTSet : public Set<T>{
public:
int size(){
return bst.size();
}
bool isEmpty(){
return bst.isEmpty();
}
//增加操作
void add(T num){
bst.add(num);
}
//刪除操作
void remove(T num){
bst.remove(num);
}
//查詢操作
bool contains(T num){
return bst.contains(num);
}
private:
BST<T> bst;
};
#endif