1. 程式人生 > >資料結構實現 4.1:集合_基於二分搜尋樹實現(C++版)

資料結構實現 4.1:集合_基於二分搜尋樹實現(C++版)

資料結構實現 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;
};

這裡為了避免重複設計就可以相容更多資料型別,引入了 泛型 ,即 模板 的概念。(模板的關鍵字是 classtypename
這裡的 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