1. 程式人生 > >自定義集合(Set)

自定義集合(Set)

通過學習自定義集合,瞭解集合的資料結構。

 

本篇分別以連結串列的方式和以二分搜尋樹的方式實現了集合。

 

首先寫一個集合的介面,描述其具有的基本功能。Set.java

然後寫一個介面的實現類:

其中,方式一: 用的是連結串列的方式。 LinkedListSet.java

    用到了     自定義連結串列   中的   LinkedList.java

方式二:用的是二分搜尋樹的方式。  BSTSet.java

  用到了   

二分搜尋樹   中的   BinarySearchTree.java
 

方式一與方式二的時間複雜度分析:

其中:  字母h代表樹的深度。

 

LinkedListSet

BSTSet                   平均情況              最壞情況

add

O(n)

O(h)

O(log n)

O(n)

contains

O(n)

O(h)

O(log n)

O(n)

remove

O(n)

O(h)

O(log n)

O(n)

 

此外還分:有序集合、無序集合、多重集合。

有序集合:元素具有順序性。(基於搜尋樹的實現)

無序集合:元素沒有順序性。(基於雜湊表的實現)

多重集合:元素可以重複。

包結構:

 

Set.java:

package SetAndMap;

public interface Set<E> {
	
	void add(E e);//不可重複
	boolean contains(E e);
	void remove(E e);
	int getSize();
	boolean isEmpty();

}

方式一:

 

package SetAndMap;

public class LinkedListSet<E> implements Set<E> {
	
	private LinkedList<E> list;//內部維護了一個自定義的連結串列。
	/**
	 * 無參建構函式
	 */
	public LinkedListSet() {
		list=new LinkedList<E>();
	}
	/**
	 * 向集合中新增元素
	 * 
	 */
	@Override
	public void add(E e) {
		if(!list.contains(e)) {//去除重複元素
			list.addFirst(e);
		};
		
	}
	/**
	 * 判斷是否包含指定元素
	 */
	@Override
	public boolean contains(E e) {
		
		return list.contains(e);
	}
	/**
	 * 刪除指定元素
	 */
	@Override
	public void remove(E e) {
		list.removeElement(e);;
		
	}
	/**
	 * 獲取集合大小
	 */
	@Override
	public int getSize() {
		
		return list.getSize();
	}	
	/**
	 * 判斷集合是否為空
	 */
	@Override
	public boolean isEmpty() {
		
		return list.isEmpty();
	}
}

 

 

方式二:

package SetAndMap;

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

	
	private BinarySearchTree<E> bst;//內部維護了一個自定義的二分搜尋樹。
	/**
	 * 無參建構函式
	 */
	public BSTSet() {
		bst=new BinarySearchTree<E>();
	}
	/**
	 * 向集合中新增元素
	 * 重複元素已捨棄
	 */
	@Override
	public void add(E e) {
		bst.add(e);
		
	}
	/**
	 * 判斷是否包含指定元素
	 */
	@Override
	public boolean contains(E e) {
		
		return bst.contains(e);
	}
	/**
	 * 刪除指定元素
	 */
	@Override
	public void remove(E e) {
		bst.remove(e);
		
	}
	/**
	 * 獲取集合大小
	 */
	@Override
	public int getSize() {
		
		return bst.size();
	}	
	/**
	 * 判斷集合是否為空
	 */
	@Override
	public boolean isEmpty() {
		
		return bst.isEmpty();
	}
	
}