2014-07-25 69 views
2

我创建了一个Trie来存储几百万字。序列化Trie

typedef struct trie 
{ 
    struct trie* c[38]; 
    unsigned int occ; 
} trie_t; 

occ只是一个数字,用于存储单词的出现次数。如果0:节点不是一个单词。 c [38]用于:26个字母+10个数字+'_'+'。'

我想序列化它,以便我可以将它映射回内存,而无需每次都构建它。 问题是我用malloc来创建Trie,所以所有的内存都不是连续的。

我想强制Trie创建的内存是连续的,所以我可以用offset来替换指针并序列化整个结构。

这是正确的路吗? 它甚至可能与malloc或我应该建立自己的内存分配器来做到这一点?

+0

那么这个静态一旦建立 - 你不更新它? –

+0

是的。没有更新。 Trie是从不会改变的单词列表创建的。 – IggY

+0

然后只是建立它。理解你可能会“弯曲”一些C规则,并且不得不依靠可怕的“无证行为”来进行寻址,但没有什么大不了的。 –

回答

2

分配单个结构数组并按顺序使用它们。如果你不知道你将需要的结构的总大小,那么你重新分配数组。

最终结果是指向全部的连续的结构数组。

+0

嗯......你的意思是我只是分配一个大数组,做一个“my_malloc(大小)”,它有一个静态的int“偏移量”指向我在这个数组中的位置,并执行:return array [offset];偏移+ =大小; (+ realloc的东西),对吧? – IggY

+0

如果您决定使用某个功能,就会出现这种情况。你有两个变量total_size和current_position,并在达到total_size时重新分配。既然你有一个结构数组,你不会按大小递增1。 – this

+0

“既然你有一系列的结构,你会增加1而不是大小”:我总是犯这个错误:) – IggY