自定義集合(Set)
阿新 • • 發佈:2019-01-03
通過學習自定義集合,瞭解集合的資料結構。
本篇分別以連結串列的方式和以二分搜尋樹的方式實現了集合。
首先寫一個集合的介面,描述其具有的基本功能。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();
}
}