【慢速学数据结构】集合篇
2016-07-13 15:00
369 查看
概述
集合ADT,表示一种非顺序容器,且容器内的元素不重复。其实就是将数学里的概念应用到计算机。
复习一下数学里的集合概念。
并操作:
交操作:
差操作:
其实数据结构中的set,也是类似的,求两个集合的并,交,差等,它的重头是在它的那些方法,结构本身没有多少特点,我们不用把它想的太复杂。
实现
实现集合的方式有很多种,数组,链表等。《数据结构与算法分析》那本书里实现的是不相交集(并查集),我会在下一篇文章讲它。这里我们用链表来实现,先看类的声明:
template<typename T> class set { public: set(); virtual ~set(); public: // public interface void insert( const T& data ); void remove( const T& data ); bool find( const T& data ); bool isSubset( const set<T> &a ); bool isEqual( const set<T> &a ); bool isEmpty(); const T traversal(); public: list<T> container_; } template<typename T> const set<T> set_union( set<T> &a, set<T> &b )... template<typename T> const set<T> set_difference( set<T> &a, set<T> &b )... template<typename T> const set<T> set_intersection( set<T> &a, set<T> &b )...
每个函数都很简单,因为用了STL和泛型算法,看一个
set_union函数吧。思路就是建一个新集合,将a复制过去,然后将b中的元素插进去,insert函数会检测插入的值是否重复,所以不用担心破坏了集合规则。
template<typename T> const set<T> set_union( set<T> &a, set<T> &b ) { set<T> result; result = a; for(auto i : b.container_) { result.insert(i); } return result; }
其他的函数都大同小异,都是在这个
list上的操作,就不一一展开讲了。
应用
Spell Checker。我们写Word的时候,会有拼写错误提示,你有没有想过它是怎么实现的呢。简单的来想一下,就是两份文件,一份是代表单词字典的文件,一份是我们的输入文件,它们都被加载到各自的hash表里,然后求它们的交集,再把交集和输入文件去比较,把错的单词找出来。当然,实际的实现绝对很复杂,因为还要考虑语法等因素。参考
http://blog.csdn.net/ab198604/article/details/8473709http://www.slideshare.net/Tech_MX/set-data-structure-i
https://en.wikipedia.org/wiki/Set_(abstract_data_type)#Dynamic_sets
https://en.wikipedia.org/wiki/Spell_checker#Design
相关文章推荐
- 数据结构学习之路-第一章:绪论
- spark优化之优化数据结构
- 各种算法和数据结构
- 基于顺序存储结构的线性表
- 【数据结构与算法】十九 二叉树遍历 BFS 广度优先 迭代算法
- 数据结构---图---邻接表
- 【数据结构】链栈
- 第4章第1节练习题7 交换二叉树所有节点左右子树
- 算法导论 第四部分——基本数据结构——第15章:动态规划
- 数据结构---图---邻接矩阵
- 数据结构---图的存储结构
- 性能优化小技巧
- 数据结构——线段树详解(超详细)
- 【NOIP2013模拟11.5A组】游戏节目
- 简陋hash算法
- 数据结构与算法简记:根据层次顺序存储结构构建二叉树
- MFT的文件名属性数据结构
- 数据结构和算法系列 - 八大排序算法
- 数据结构【二叉树】 二叉树的创建
- 【数据结构】—— 优先队列