假设我们有一组字符串
{"abc","def","ghia"}
存储字符串的节省空间的方法是什么?此外,给定一个输入字符串,如"abc"或"abc1",我需要找出"abc"
(是)或"abc1"
(否)是否在字符串列表中,如果不在,则添加到字符串列表中。
进一步假设所有字符串只有26个小写字母,字符串的长度从0到无穷大。
听起来你正在寻找一个trie。
然而,请注意,trie更像是一个集合,而不是一个列表,因为元素是无序的,并且(在一个简单的实现中)不支持重复。
这取决于您的限制。R-way trie是检索存储数据的快速方法之一,它还提供了一种确定数据是否在集合中的方法,但R-way需要(R+1)N内存空间,因此在您的情况下为27N(N表示数据数量,R表示您的字符域)。
还有其他类型的trie需要较少的内存,比如三元搜索trie。但它需要4N的空间。如果首先考虑的是内存的足迹,那么这就是OrderedDict。
因此,如果你不能忍受这样的使用,你可以创建自己的数据类型,5位数据类型。因为26个字符只能用5位来表示。例如,"abc"的ISO9959-1编码为"0b01100001、0b01100010、0b011000 11",但是这些可以是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