数据结构之集合详解

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/qq_24095055/article/details/89043574

集合(set)

  • 回忆我们之前实现的二分搜索树,它是不能存放重复元素的,它本身就是非常好的实现“集合”的底层数据结构

Set<E>

  • void add(E) 不能添加重复元素 典型应用:客户统计、词汇量统计
  • void remove(E)
  • boolean contains(E)
  • int getSize()
  • boolean isEmpty()

首先我们定义了一个set接口

public interface Set<E> {

    void add(E e);
    boolean contains(E e);
    void remove(E e);
    int getSize();
    boolean isEmpty();
}

一个以二分搜索树为底层实现的集合

import java.util.ArrayList;

public class BSTSet<E extends Comparable<E>> implements Set<E> {

    private BST<E> bst;

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

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

    @Override
    public boolean isEmpty(){
        return bst.isEmpty();
    }

    @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);
    }
}

一个以链表为底层实现的集合

import java.util.ArrayList;

public class LinkedListSet<E> implements Set<E> {

    private LinkedList<E> list;

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

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

    @Override
    public boolean isEmpty(){
        return list.isEmpty();
    }

    @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);
    }
}

集合的时间复杂度分析

在这里插入图片描述
h为二分搜索树的高度,考虑特殊情况下高度h会等于n,使用平衡二叉树可以解决这个问题。

唯一摩尔斯密码词 LeetCode804号问题

问题链接:https://leetcode-cn.com/problems/unique-morse-code-words/

解答代码

import java.util.TreeSet;

/**
 * Created by binzhang on 2019/4/5.
 */
class Solution {
    public int uniqueMorseRepresentations(String[] words) {

        String[] codes = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};

        TreeSet<String> set = new TreeSet<>();
        for (String word : words){

            StringBuilder res = new StringBuilder();
            for (int i = 0 ; i < word.length() ; i ++)
                res.append(codes[word.charAt(i) - 'a']);

            set.add(res.toString());
        }

        return set.size();
    }
}

有序集合和无序集合

  • 有序集合的元素具有顺序性 基于搜索树的实现
  • 无序集合中的元素没有顺序性 基于哈希表的实现(比搜索树更快)

多重集合

  • 集合中的元素可以重复

猜你喜欢

转载自blog.csdn.net/qq_24095055/article/details/89043574
今日推荐