【问题标题】:Trie Implementation: using Int vs CharTrie 实现:使用 Int 与 Char
【发布时间】:2017-06-08 10:08:16
【问题描述】:

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

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

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

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

我的问题如下:使用 int 类型作为 key 是否会影响内存/速度? char 是否直接被视为 int ?

谢谢!

【问题讨论】:

  • 实现的平台是什么?我猜想对于存储在 trie 中的中等大小的单词,这种差异几乎不会引起注意。
  • 在大多数机器上没有区别。指针需要对齐,因此如果是 char,则在 key 之后有填充,如果是 int,则填充较少,可能为零。
  • 重新排序并首先使用指针,然后是 key,可能比 char/int 产生更大的性能差异(将最常用的字段作为第一个字段。)。 IAC,“尝试”不同的方法并对其进行评分,
  • 回答您的问题的最佳方法是对其进行编码并在对其进行分析时通过迭代运行它。老实说,更改一种数据类型并不难最终测试。

标签: c design-patterns struct trie


【解决方案1】:

由于char 后面跟着两个指针,struct 将得到paddednextchildren 一个适当的对齐。假设int 的大小小于或等于系统上指针的大小,声明keyint 不会改变struct 的内存需求。

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

【讨论】:

    【解决方案2】:

    我的问题如下:使用 int 类型作为键是否会影响内存/速度?

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

    char 是否直接作为 int 处理?

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

    总体而言,如果代码与键入为 intchar 的密钥相同,那么您应该会发现两者之间的性能差异很小或没有差异。


    但是,我认为您提出了错误的问题。很可能intchar 类型之一更自然地适合成员key 的预期用途。我猜那是char,但无论是哪一个,都可以使用。努力编写有意义且正常工作的代码。为任务使用适当的算法,但除非你衡量你的表现并发现它有欠缺,否则不要担心细节表现细节。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-25
        • 2018-03-25
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 2010-10-15
        • 2011-08-27
        相关资源
        最近更新 更多