【发布时间】:2012-03-13 09:04:04
【问题描述】:
我有一组集合,我想将它们放在trie 中。
普通的尝试是由元素的字符串组成的——也就是说,元素的顺序很重要。集合缺乏明确的顺序,因此有可能进行更大的压缩。
例如,给定字符串 "abc"、"bc" 和 "c",我将创建 trie:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
但考虑到集合 { 'a', 'b', 'c' }、{ 'b', 'c' }、{ 'c' },我可以创建上述特里树或这十一个中的任何一个:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('c',2) -> ('a',1)
(*,3) -> ('a',1) -> ('c',1) -> ('b',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
(*,3) -> ('a',1) -> ('c',1) -> ('b',1)
-> ('c',2) -> ('a',1)
(*,3) -> ('b',2) -> ('a',1) -> ('c',1)
-> ('c',1)
-> ('c',1)
(*,3) -> ('b',1) -> ('a',1) -> ('c',1)
-> ('c',2) -> ('b',1)
(*,3) -> ('b',2) -> ('c',2) -> ('a',1)
-> ('c',1)
(*,3) -> ('b',1) -> ('c',1) -> ('a',1)
-> ('c',2) -> ('b',1)
(*,3) -> ('c',2) -> ('a',1) -> ('b',1)
-> ('b',1) -> ('c',1)
(*,3) -> ('c',2) -> ('a',1) -> ('b',1)
-> ('b',1)
(*,3) -> ('c',2) -> ('b',1) -> ('a',1)
-> ('b',1) -> ('c',1)
(*,3) -> ('c',3) -> ('b',2) -> ('a',1)
因此显然有压缩空间(7 个节点到 4 个节点)。
我怀疑根据子节点的相对频率在每个节点上定义一个本地顺序会做到这一点,但我不确定,而且可能过于昂贵。
所以在我敲白板并开始研究我自己的压缩算法之前,有没有现成的压缩算法?它有多贵?它是一个批量过程,还是可以按插入/删除完成?
【问题讨论】:
-
我认为 trie 不是一个很好的表示集合的结构。位数组的集合不是更好吗?您希望进行哪些操作?为什么这么担心内存?
-
@svick:也许吧,但是我的集合是从大量元素中提取的,所以位数组可能不是很有效。遍历(子集,频率)对。因为我有很多数据。
-
你打算做什么操作?传统的 trie 可以有效地告诉您给定字符串是否包含在它所代表的字符串集中。如果您的 trie 重新排序其字符串以最小化结构大小,您如何实际测试给定的一组字符是否包含在 trie 中?似乎您需要搜索每个排列。
-
@Weeble:您可以将每个节点的本地订单与每个节点的子节点一起存储。当查看一个节点时,遍历其子节点,并遍历到第一个与您包含的元素匹配的节点。
-
您是在寻找只是压缩以便稍后解压,还是您还想对压缩结构执行集合操作?
标签: algorithm language-agnostic compression trie