什麼是集合?
在數學上集合是一個或多個元素所構成的整體,集合有三個特性,即確定性、無序性、互異性。在 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) 級別。