Trie Implementation:使用Int vs Char

时间:2017-01-23 19:29:54

标签: c design-patterns struct trie

我目前正在尝试在C中实现trie,以便进行拼写检查(字典取自加载到trie结构中的文本文件)。

这是我当前的节点结构(取自https://www.cs.bu.edu/teaching/c/tree/trie/):

typedef struct trieNodeTag 
{
    char key;
    struct trieNodeTag *next, *children;
} trieNodeT;

key是要在内存中加载的每个单词的字母。

我的问题如下:对内存/速度有什么影响使用int类型的密钥? char是否直接作为int处理?

谢谢!

3 个答案:

答案 0 :(得分:2)

由于char之后是两个指针,structnext获得childrenint正确的对齐。假设key的大小小于或等于系统上指针的大小,声明int struct不会改变<SetupEntryPoint> <ExeHost> <Program>setup.bat</Program> <Arguments></Arguments> </ExeHost> </SetupEntryPoint> 的内存要求

就速度而言,很有可能你不会在任何方面看到太大的差异。一个好的实用方法是选择最适合程序逻辑的类型,并且只有在分析表明它会产生很大差异时才将其更改为其他类型。

答案 1 :(得分:1)

int的行为是否与char不同,也取决于平台。类型int可能是机器字,更容易解决;但是,char的内存大小可能会更小。

答案 2 :(得分:1)

  

我的问题如下:对内存/速度有什么影响,使用int类型的密钥?

如果您将struct trieNodeTag成员的类型从key修改为{{1},那么char的大小可能会保持不变,但不确定因为编译器可能会放置该结构,以便指针int从结构开头的偏移量是四个字节的倍数。如果您想确切知道,请将next运算符应用于每个版本的结构,并比较结果。结果将在某种程度上取决于您使用的C实现。

  

是否将char直接视为int?

在对大多数表达式的求值中,类型sizeof()的操作数在被操作之前被提升为char。这很便宜,甚至可能是免费的,但不是,int不会将直接视为char

总的来说,如果代码在键入intint时同样正确,那么您应该会发现两者之间的性能差异很小或没有。

但是,我认为你提出了错误的问题。 charint类型之一可能更适合成员char的预期使用。我猜这是key,但不管是哪个,都是使用它的人。努力编写有意义且正常工作的代码。使用适当的算法来完成任务,但除非您衡量您的表现并发现它缺乏,否则不要扼杀精细的表现细节。