資料結構-集合

小墨魚3發表於2020-01-31

集合(Set)

集合特性

  • 元素不重複

利用二分搜尋樹實現集合

更具上面的特性, 集合中是不包含重複元素的, 而我們上一章(bst)學習的二分搜尋樹恰好就是一個不包含重複元素的樹結構
我們可以利用二分搜尋樹作為集合的底層實現結構。

我們先來看看集合介面的幾個方法把。

public interface Set<E> {
    void add(E e); // 新增元素
    void remove(E e); // 刪除元素
    boolean contains(E e); // 是否包含元素
    int getSize(); // 集合大小
    boolean isEmpty(); // 集合是否為空
}
複製程式碼

建立一個實現該介面的類



/**
 * 基於二分搜尋樹的集合類
 */
public class BSTSet<E extends Comparable<E>> implements Set<E> {
    private BST<E> bst;

    public BSTSet() {
        this.bst = new BST<>();
    }

    @Override
    public void add(E e) {
        bst.add(e);
    }

    @Override
    public void remove(E e) {
        bst.remove(e);
    }

    @Override
    public boolean contains(E e) {
        return bst.contains(e);
    }

    @Override
    public int getSize() {
        return bst.size();
    }

    @Override
    public boolean isEmpty() {
        return bst.isEmpty();
    }
}
複製程式碼

這裡可以看到, 所有的操作都是通過二分搜尋樹來實現的。

通過下面程式, 進行一個簡單測試


public class BSTSetTest {
    public static void main(String[] args) {
        Set<Integer> set = new BSTSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(5);
        set.add(1);
        set.add(1);
        set.add(1);
        set.add(2);
        System.out.println(set.getSize());

        set.remove(2);
        System.out.println(set.getSize());

        System.out.println(set.contains(11));
    }
}
複製程式碼

基於連結串列實現集合

這裡使用的是我們在學習連結串列時候的累, 但是需要擴充套件一個方法, 之前沒有刪除元素的方法, 現在新增一個.


// linkedlist.java
// 從連結串列中刪除元素
public void removeElement(E e) {
    Node prev = dummyHead;
    while (prev.next != null) {
        if (prev.next.e.equals(e)) {
            break;
        }

        prev = prev.next;
    }

    if (prev.next != null) {
        Node delNode = prev.next;
        prev.next = delNode.next;
        delNode.next = null;
        size -- ;
    }
}
複製程式碼
public class LinkedListSet<E> implements Set<E> {

    private LinkedList<E> list;

    public LinkedListSet() {
        this.list = new LinkedList<>();
    }

    @Override
    public void add(E e) {
        if (!list.contains(e)) {
            // 如果不包含元素則進行新增
            list.addFirst(e);
        }
    }

    @Override
    public void remove(E e) {
        list.removeElement(e);
    }

    @Override
    public boolean contains(E e) {
        return list.contains(e);
    }

    @Override
    public int getSize() {
        return list.getSize();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }
}
複製程式碼

測試方法

public static void main(String[] args) {
        Set<Integer> set = new LinkedListSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(2);
        set.add(1);
        set.add(3);
        set.add(3);
        set.add(3);
        System.out.println(set.getSize());

        set.remove(2);
        System.out.println(set.getSize());

}
複製程式碼

avatar

相關文章