检查 C 字典中的单词

标签 c dictionary data-structures

我有一个项目,其中有一个文件(.dic),其中包含许多不同大小的单词。另一个文件(.pal)包含一些文字。对于 .pal 文件中的每个单词,我必须在具有相同单词数的单词列表中找到它的位置,这些单词按 .dic 文件中的字母顺序排列。

例如, 在 .dic 文件中:

car
banana
dog
flower
tar

所以字典会是这样的:

3 letters: [car->dab->dog->tar]
6 letters: [banana->flower]

在 .pal 文件中:

dog
flower

所以输出将是:

dog in position 3 
flower in position 2

我的问题是:在 C 中实现此功能的最佳数据结构是什么,以便占用最少的内存和时间?

我正在考虑有一个矩阵,其中每个第一个索引(index1)对应于单词中的字母数量,第二个索引(index2)对应于我要查找的单词的第一个字母。该矩阵的每个元素都是具有索引 1 字母并从字母索引 2 开始的单词列表。

示例:

 | A  | B  | C  | .....
_______________

1|list|list|list|
2|list|....|....|
3|...
.
.

因此“dog”将位于矩阵[3][D]内的列表中。

问题1:如果没有字母数量或首字母不同的单词,矩阵就会出现漏洞 -> 浪费太多内存?

问题 2:要知道我之前询问的位置,我必须对我正在使用的列表之前的每个列表的元素数量进行求和。

示例:“狗”位置为

number of element in list [3][A]+number of element in list [3][B]+number of element in list [3][C]+"dog" position in the list

因此,当我在列表中插入一个单词时,我必须更新下一个矩阵元素中列表的元素数量。 -> 耗时?

那么你觉得这个方法怎么样?您有更好的想法吗?

最佳答案

What is the best data structure to implement this in C, so that it takes the least memory and time?

同时获得最少内存最少时间是很困难的。如果您想保持尽可能低的内存使用量,则需要动态内存分配,考虑到时间,这会非常昂贵。

为了降低内存使用量,您可以采用以下数据结构:

 #define MAX_WORD_LEN 50
 char** dic[MAX_WORD_LEN];

你可以像这样使用它:

index 0: -----> char*, char*, char*, ...   // Words with length 1
                 |      |      |
                 |      |      ------> string (i.e. char, '\0')
                 |      |
                 |      ------> string (i.e. char, '\0')
                 |
                 ------> string (i.e. char, '\0')

index 1: -----> char*, char*, ...   // Words with length 2
                 |      |
                 |      ------> string (i.e. char, char, '\0')
                 |
                 ------> string (i.e. char, char, '\0')

这允许您为每个长度存储可变数量的单词,并且您不会为每个字符串分配超出所需的内存。它就像一个矩阵,但好处是每行可以有不同数量的列。

但是,您将需要相当多的动态内存处理,即 mallocreallocstrdup

为了节省一些执行时间,您应该将“char*, char*, char*, ...”数组增大大于 1 的 N,并将未使用的条目设置为 NULL。这将节省大量的realloc,但您需要跟踪每行中分配的元素数量。这可能需要这样的东西:

struct x
{
    char** data;
    int number_allocated;
}

#define MAX_WORD_LEN 50
struct x dic[MAX_WORD_LEN];

如果内存使用量非常大,您可以避免使用“char*, char* ...”数组,而只为每个字长使用一个大的 char 数组。喜欢:

index 0: -----> 'a', '\0', 'I', '\0', ...
index 1: -----> 'b', 'e', '\0', 't', 'o', '\0', ....

您可以这样做,因为字符数组中的所有单词都具有相同的长度。

在这种情况下,你会得到类似的东西:

struct x
{
    char* data;
    int bytes_allocated;
    int number_of_words;
}

#define MAX_WORD_LEN 50
struct x dic[MAX_WORD_LEN];

关于检查 C 字典中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40194600/

相关文章:

c - 结束对 AT 命令的响应

Python - 将数据中的代码映射到描述的最佳方法

python - 在字典中存储 lambda

c - dev-cpp\collect2.exe [Error] ld returned 1 exit status 编译器指出什么错误?

c++ - 二叉树数据存储实现

C - 指向字符串数组的指针不起作用

c - 需要左值作为赋值的左操作数,找不到问题

c++ - 如何防止pcre(C库)在一个字符串失败时继续匹配?

python - 为什么 dict.update(key=value) 不使用 key 引用的字符串?

data-structures - 计算机研究中数据结构的实际例子?