没有合适的资源?快使用搜索试试~ 我知道了~
程序员必备数据结构知识
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 127 浏览量
2023-08-29
09:12:26
上传
评论
收藏 22.77MB PDF 举报
温馨提示
试读
287页
数据结构中最核心最常用的几个结构,各种树的介绍,比较实用
资源推荐
资源详情
资源评论
数据结构
1.
2.
3.
TreeSet的实现
TreeSet的实现
写在前面
建议阅读时间:5 ~ 10 分钟
本文相对比较轻松,算是对红黑树系列收个尾吧(之后我们就要进军哈希表了,虽然里面也
使用了红黑树,嘿嘿~)
文章摘要
初识集合Set
利用List、红黑树、TreeMap实现Set
粗略比较红黑树和List的速度
一、初识Set集合
先来看一个很简单的问题
给你一组数据,如: 需要你将其中重复arr = [1, 3, 5, 5, 2, 6, 10, 20, 2, 6, 10, 20];
的元素去掉
让我猜猜你的第一反应: ,哈哈,被我猜对了吧!Set
别着急反驳我,往下看看,是不是真的猜对了~
相比于其他集合,它最主要的特征:不存放重复的元素
就因为这一点,当有需求谈及去重时,大部分人应该都会想到Set
如果是Java中, 集合,继承自 ,拥有的接口和 的差不多Set Collection List
当谈到 ,它的实现类主要有两个: (不谈中间抽取的类)JavaSet HashSetTreeSet
今天我们主要研究的是 ,另一个之后再说~TreeSet
二、Set的实现
(1)接口定义
<E> {public interface Set
;int size()
;boolean isEmpty()
;void clear()
;boolean contains(E element)
;void add(E element)
;void remove(E element)
TreeSet的实现
第 1 页 /共
285 页
/**
*
* visitor@param
*/
;void traversal(Visitor<E> visitor)
/**
*
*/
<E> {abstract class Visitor
stop;boolean
;public abstract boolean visit(E element)
}
}
都是一些很简单的接口,就不解释太多了
可以看到, 的接口与 的有一个很大的区别:它没有,也就不能够根据索引获取对应Set List
的元素了。这也说明了 是无序的Set
所以我们提供了一个用于遍历的方法,并且允许外界传入一个访问器。如上代码所示
(2)使用List实现Set
哎哎哎,不是说要用红黑树来实现Set吗?怎么整到List去了!!!
别着急,就当做我们来复习一下之前的List集合了,一会你就知道了~
我这里采用双向链表来实现,因为它是List的最优实现嘛
<E> <E> {public class ListSet implements Set
//
List<E> list = <>();private final new DoubleLinkedList
@Override
{public int size()
list.size();return
}
@Override
{public boolean isEmpty()
list.isEmpty();return
}
@Override
{public void clear()
list.clear();
}
@Override
{public boolean contains(E element)
list.contains(element);return
}
@Override
{public void add(E element)
list.indexOf(element); int index =
// -1
(index != list.ELEMENT_NOT_FOUND) { if
//
TreeSet的实现
第 2 页 /共
285 页
list.set(index, element);
} { else
//
list.add(element);
}
}
@Override
{public void remove(E element)
list.remove(element);
}
@Override
{public void traversal(Visitor<E> visitor)
(visitor == ) ;if null return
list.size();int size =
( ; i < size; i++) {for int i = 0
(visitor.visit(list.get(i))) ;if return
}
}
}
看看上面的实现,其实很简单,毕竟大部分逻辑直接使用原先List的即可
需要修改的就是:
①: ,因为要保证Set中的值是唯一的嘛add()
在添加前,查找一下存在链表中的索引。若存在,用新值覆盖掉旧值。若不存在,才
真正的添加
②: ,上面说了,因为没有索引,所以我们给外界提供一个遍历的方法traversal()
去遍历内部的链表,但是注意终止的判断即可
如果需要查看链表内部的实现,可以看看之前的文章:《动态数组、链表、栈、队列的总
结》
具体的我们来看,如何用红黑树实现 ~TreeSet
(3)使用红黑树实现Set
<E> <E> {public class TreeSet implements Set
//
RBTree<E> tree = <>();private final new RBTree
@Override
{public int size()
tree.size();return
}
@Override
{public boolean isEmpty()
tree.isEmpty();return
}
TreeSet的实现
第 3 页 /共
285 页
剩余286页未读,继续阅读
资源评论
北极象
- 粉丝: 1w+
- 资源: 345
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功