有没有什么巧妙的方法在C语言中实现一个集合数据结构(一个唯一值的集合)?集合中的所有元素将是相同类型,并且有巨大的内存。
据我所知,对于整数,可以使用值索引数组来快速轻松地完成此操作。但我想要一个非常通用的Set数据类型。如果一个集合可以包括自己,那就太好了。
有没有什么巧妙的方法在C语言中实现一个集合数据结构(一个唯一值的集合)?集合中的所有元素将是相同类型,并且有巨大的内存。
据我所知,对于整数,可以使用值索引数组来快速轻松地完成此操作。但我想要一个非常通用的Set数据类型。如果一个集合可以包括自己,那就太好了。
有多种实现集合(和映射)功能的方法,例如:
既然您提到了值索引数组,让我们尝试基于哈希的方法,它可以自然地建立在值索引数组技术之上。
请注意哈希和树的方法的优缺点。
您可以设计一个哈希集(哈希表的一种特殊情况),其中包含指向可哈希POD的指针,并使用链式法在内部表示为固定大小的哈希桶数组,其中:
如果您拥有大量的内存,可以慷慨地调整桶的大小,并与良好的哈希方法结合使用,大大减少冲突的概率,从而实现几乎恒定的性能。
您需要实现:
contains
/insert
/remove
功能。您还可以使用开放地址法作为维护和管理桶的替代方案。
void *
,因此您仍然需要使用指针,不同对象的指针是唯一的。这意味着您需要一个包含指针的哈希映射或二叉树,这将适用于所有数据对象。(void *) 5
,在实际情况下,这很可能适用于小整数,但是如果您的整数足够大以与指针竞争,则失败的概率非常小。char a [] ="Hello,World!"; char b [] ="Hello,World!";
,指针集将找到a
和b
是不同的。您可能希望对值进行哈希,但是如果您担心哈希冲突,应将字符串保存在集合中,并使用strncmp()
将存储的字符串与探测字符串进行比较。