在 C 中是否有任何棘手的方法来实现集合数据结构(唯一值的集合)?集合中的所有元素都属于相同类型,并且有巨大的 RAM 内存。
据我所知,对于整数,使用值索引数组可以非常快速且轻松地完成。但我想要一个非常通用的 Set 数据类型。如果一个集合可以包含它自己那就太好了。
有多种实施方式设置(和映射)功能,例如:
- 基于树的方法(有序遍历)
- 基于哈希的方法(无序遍历)
Since 你提到了值索引数组,让我们尝试基于哈希的方法自然地构建在值索引数组技术之上.
当心的优点和缺点 http://en.wikipedia.org/wiki/Hash_table#Features基于哈希的方法与基于树的方法的比较。
你可以设计一个hash-set(一个特殊情况是哈希表 http://en.wikipedia.org/wiki/Hash_table) 的指针hashable POD http://en.wikipedia.org/wiki/Plain_old_data_structures, with chaining https://en.wikipedia.org/wiki/Hash_table#Collision_resolution,内部表示为固定大小的存储桶数组哈希表, where:
- all 哈希表在一个桶中具有相同的哈希值
- 一个bucket可以实现为动态数组or哈希表的链表 http://en.wikipedia.org/wiki/Hash_table#Separate_chaining
- a hashable's 哈希值用于索引存储桶数组(哈希值索引数组)
- 一项或多项哈希表包含在哈希集中的可以是(指向)另一个哈希集的指针,甚至是哈希集本身(即指向)。自我包容是可能的)
有了大量的内存可供使用,您可以慷慨地调整存储桶数组的大小,并结合良好的散列方法,大大降低碰撞 http://en.wikipedia.org/wiki/Hash_collision,实现几乎恒定时间的性能。
你必须实施:
- the 哈希函数 http://en.wikipedia.org/wiki/Hash_function对于被散列的类型
- 用于测试两个哈希值是否相等的类型的相等函数
- 哈希集
contains
/insert
/remove
功能。
您还可以使用开放寻址 https://en.wikipedia.org/wiki/Hash_table#Open_addressing作为维护和管理存储桶的替代方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)