整数集合的实现

来源:互联网 发布:北京爱亚卡普网络拍卖 编辑:程序博客网 时间:2024/05/23 15:01

  问题:很多应用都需要搜索一组数据,比如编译器查找变量名以得到其地址,拼写检查器查找字典,DNS查找域名来获得IP地址。这与如何存储这些数据紧密相关。比如存储一组整数,如果用集合来存储,如何实现整数集合?
  我们一般实现有序整数集合,这样就可以使用二分搜索搜索来快速进行搜索。为简单起见,下面的各种方案只集中于算法的关键部分,并没有考虑错误处理、虚构函数释放资源、拷贝构造等问题。
  (1)用标准模板库set来实现:通常标准模板库set是使用平衡二叉树来实现的。

  (2)用数组实现:适用于事先知道集合大小的情况。使用了一个哨兵元素,放置一个充分大的数(比集合中任何的元素都大)。这样一旦搜索到这个数,表明到达列表末尾,从而可以简化插入代码,提高运行速度。数组的优点就是可以随机访问。

  (3)用链表实现:使用递归遍历来进行有序插入。也使用了一个哨兵结点,其值大于所有实际的值。一旦到达哨兵结点,就表示到达链表末尾。

  (4)用二叉树实现:这里用二分搜索树来实现,它是有序的二叉树。将集合元素按序写入数组时使用了中序遍历。为简便,这里没有使用平衡二叉树。平衡二叉树的主要优点就是能确保在最坏情况下也有较好的性能。二叉树的插入时间效率最高,为O(logn)。

  (5)用位图实现:位图的优点就是使用移位运算,效率非常高。缺点是当n非常大时,位图会变得很大,占用大量的内存空间,这是一种空间换时间的策略。

  (6)使用散列表来实现:箱是一种散列表结构,它结合了链表和位向量的优点。所有的箱用一个数组表示,每个箱中的所有整数用一个有序链表存储。整数t被散列到箱bin[1+maxval/bins]中,这里bins为箱的个数,maxval为充分大的数(存放在哨兵位置处)。

  关键算法设计思想:线性结构(数组、链表、位图)、树形结构(二叉树、二分搜索树、平衡二叉树)、散列表结构、集合结构、递归、哨兵技术。