什么是集合?
在数学上集合是一个或多个元素所构成的整体,集合有三个特性,即确定性、无序性、互异性。在 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) 级别。