假设我们有一组字符串
{"abc","def","ghia"}
存储字符串的节省空间的方法是什么?
另外,给定一个像“abc”或“abc1”这样的输入字符串,我需要找出"abc"
(是)或"abc1"
(否)是否在字符串列表中,如果不是,添加到字符串列表。
进一步假设我们所有字符串只有26个小写字母,字符串的长度为0到无限。
答案 0 :(得分:1)
听起来像是在寻找trie。
但请注意,考虑到元素是无序的(并且在一个天真的实现中)不支持重复,因此trie更像是一个集合而不是列表。
答案 1 :(得分:0)
这取决于你的限制。 R-way trie是检索存储数据的快捷方式之一,它也提供了一种确定数据是否在集合中的方法,但R-way需要(R + 1)N个存储空间,所以27N在你的case(N代表数据的数量,R代表你的角色域)。
还有其他类型的trie需要更少的内存,例如Ternary Search Trie。但它需要4N的空间。 如果内存的足迹是第一个问题,那么这比OrderedDict更好。
因此,如果您不能使用那些类似的东西,您可以制作自己的数据类型,5位数据类型。 因为26个字符只能用5位表示。 例如," abc"的ISO9959-1编码是" 0b01100001,0b01100010,0b01100011", 但这些可以是0b00001 00010 00011 [0](填充为0)。
nChars 1 2 3 4 5
8byte-rep 8 16 16 24 32
5bits-rep. 5 10 15 20 25
actual-req 8 16 24 32 40
(with 8bits-packing)
diff(saving) 0 0 8 8 8