基于链表和二分搜索树的集合实现

什么是集合?

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

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