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

在这里插入图片描述

(1)定义Set接口

/*
 * 集合:存储不重复元素的容器
          有序集合中的元素具有顺序性,基于搜索树实现
          无序集合中的元素没有顺序性,基于哈希表实现
          顺序性,是指按照元素的大小进行排序,并非指插入的顺序
          有序性,是指元素的进场顺序和出场顺序一致
         应用场合:
             客户统计
             词汇量统计
 */

	public interface Set<E> {
		public void add(E e); //添加指定元素
		public void remove(E e);//移除指定元素
		public boolean contains(E e);//查看指定元素是否包含
		public int getSize();
		public boolean isEmpty();//判断集合是否为空
	}

(2) LinkList实现的Set集合

import p02.动态链表.SingleLinkList;

public class LinkedSet<E> implements Set<E>{
	private SingleLinkList<E> list;
	public LinkedSet() {
		list=new SingleLinkList<>();
	}
	@Override
	public void add(E e) {	//O(n)
		/*
		 * 首先判断添加的元素是否原来就存在,如果不存在,就添加。
		 */
		if(!list.contains(e)){
			list.addLast(e);//O(1)
		}
	}

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

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

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

(3) 二分搜索树实现的Set集合

二分搜索树在添加元素的时候不用判断添加的元素是否存在
因为二分搜索树本来就不能存重复的元素。

!!!二分搜索树详解链接?:二分搜索树

/*
 * 基于二分搜索树实现的集合
 */
import.BinarySearchTree;

public class BstSet<E extends Comparable<E>> implements Set<E> {
	private BinarySearchTree<E> bst;

	public BstSet() {
		// TODO Auto-generated constructor stub
		bst = new BinarySearchTree<E>();
	}

	@Override
	public void add(E e) {
		// TODO Auto-generated method stub
		//二分搜索树在添加元素的时候不用判断添加的元素是否存在
		//因为二分搜索树本来就不能存重复的元素。
		bst.add(e);
	}

	@Override
	public void remove(E e) {
		// TODO Auto-generated method stub
		bst.remove(e);
	}

	@Override
	public boolean contains(E e) {
		// TODO Auto-generated method stub
		return bst.contains(e);
	}

	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return bst.size();
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return bst.isempty();
	}

}

(4)实例测试

统计双城记书中出现了多少个不重复的单词

import java.util.ArrayList;

/*
 * 计算一本英文书中有多少个不重复的单词
 */
public class Test1 {
	public static void main(String[] args) {
		ArrayList<String> words=new ArrayList<>();
		FileOperation.readFile("a-tale-of-two-cities.txt", words);
		long starttime=System.currentTimeMillis();
		LinkedSet<String> set=new LinkedSet<>();//linkset
		//BstSet<String> set=new BstSet<>();  bstset
		for(int i=0;i<words.size();i++) {
			set.add(words.get(i));
		}
		long endTime=System.currentTimeMillis();
		double second=(endTime-starttime)/1000.0;
		System.out.println("linkset用时:"+second+"s");
		//System.out.println("bst用时"+time+"s");
		System.out.println("双城记共有多少单词:"+words.size());
		System.out.println("双城记有多少单词:"+set.getSize());
	}
}

(5) 测试结果

5-1:linkset测试结果

在这里插入图片描述

5-2:bstset测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值