基於鏈表和二分搜索樹的集合實現

什麼是集合?

在數學上集合是一個或多個元素所構成的整體,集合有三個特性,即確定性、無序性、互異性。在 Java 中的集合叫做 set ,是一個無序的集合,並且不允許重複元素存在,集合無序性體現在元素的存儲順序和輸入順序關。這裏將會利用兩種底層數據結構來實現集合這種高級數據結構,即鏈表和二分搜索樹。

Set 集合中的接口

public interface Set<E> {
	void add(E e);
	void remove(E e);
	boolean contains(E e);
	int getSize();
	boolean isEmpty();
}

這裏我們只是實現 set 中比較基礎的幾個接口。

基於鏈表的集合實現

實現思路:複用鏈表的代碼,集合中的元素以鏈表的形式存儲。

public class LinkedListSet<E extends Comparable<E>> implements Set<E> {
	MyLinkedList<E> linkedList;
	
	public LinkedListSet() {
		linkedList = new MyLinkedList<>();
	}
	
	@Override
	public void add(E e) {
		if(linkedList.contains(e))
			return;
		linkedList.addFirst(e);
	}

	@Override
	public void remove(E e) {
		int idx = linkedList.find(e);
		linkedList.remove(idx);
	}

	@Override
	public boolean contains(E e) {
		return linkedList.contains(e);
	}

	@Override
	public int getSize() {
		return linkedList.getSize();
	}

	@Override
	public boolean isEmpty() {
		return linkedList.isEmpty();
	}

}

鏈表類的具體實現見:《Java數據結構:鏈表的簡單實現》

時間複雜度分析:

基於鏈表的增刪查操作的時間複雜度都是 O(n) 級別的,因爲這三個操作中都直接或者間接用到了鏈表的查詢操作。

基於二分搜索樹的集合實現

實現思路:以組合方式複用二分搜索樹的代碼,集合中的元素以樹的形式存儲。

public class BSTSet<E extends Comparable<E>> implements Set<E>{

	BST<E> bst;
	public BSTSet() {
		bst = new BST<>();
	}

	@Override
	public int getSize() {
		return bst.getSize();
	}

	@Override
	public boolean isEmpty() {
		return bst.isEmpty();
	}
	
	@Override
	public void remove(E e) {
		bst.removeNode(e);
	}
	
	@Override
	public boolean contains(E e) {
		return bst.contains(e);
	}
	
	@Override
	public void add(E e) {
		bst.add(e);
	}
}

二分搜索樹的具體實現見:《被二分查找樹灌了迷魂湯?醒醒吧,看看這篇文章!》

時間複雜度分析:

基於二分搜索樹,分析複雜度轉移至分析二分搜索樹的高度,故時間複雜度爲 O(log n) 級別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章