一尘不染

C-如何实现Set数据结构?

algorithm

有什么棘手的方法可以在C中实现集合数据结构(唯一值的集合)?集合中的所有元素将具有相同的类型,并且具有巨大的RAM内存。

据我所知,对于整数,使用值索引数组可以非常快地完成。但是我想拥有一个非常通用的Set数据类型。如果集合可以包含自身,那将是很好的。


阅读 520

收藏
2020-07-28

共1个答案

一尘不染

多种实现 集合(和映射)功能的方法,例如:

  • 基于树的方法(有序遍历)
  • 基于散列的方法(无序遍历)

既然 您提到了值索引数组 ,让我们尝试基于散列的方法,该方法 自然地建立在值索引数组技术之上

注意 基于散列的方法与基于树的方法的优缺点

可以设计出 散列的组 (的特例哈希表的指针),以 可哈希
POD
S,与链接,内部表示为的铲斗的固定大小的数组
hashables ,其中:

  • 所有 hashables 水桶具有相同的哈希值
  • 存储桶可以实现为动态数组 哈希表的链接列表
  • 一个 可哈希哈希值用于索引到桶的阵列 (散列值索引的阵列)
  • 散列 集中包含的一个或多个 散列 可以是(指向另一个散列)甚至是散列集本身的指针(即可以 自我包含

有了大量的内存供您使用,您就可以慷慨地调整存储桶阵列的大小,并与良好的哈希方法结合使用,可以大大降低发生冲突的可能性,从而实现几乎恒定的性能。

您将必须实现:

  • 散列类型的散列函数
  • 类型的相等性函数,用于测试两个哈希值是否相等
  • 散列集contains/ insert/ remove功能。

您还可以使用开放式寻址作为维护和管理存储桶的替代方法。

2020-07-28