在C中检查字典中的单词

时间:2016-10-22 16:46:29

标签: 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)对应于单词I' m的第一个字母。对于。该矩阵的每个元素都是一个带有index1字母的单词列表,以字母index2开头。

示例:

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

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

所以"狗"将在矩阵[3] [D]内的列表中。

问题1:如果没有包含所有不同字母数或不同第一个字母的单词,则矩阵将有洞 - >太多的记忆浪费了?

问题2:在我使用之前必须总结每个列表的元素数量之前,要知道我问过的位置。

示例:" dog"位置将是

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

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

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

1 个答案:

答案 0 :(得分:2)

  

在C中实现此功能的最佳数据结构是什么,因此它占用的内存和时间最少?

很难同时获得least memoryleast time。如果您希望尽可能降低内存使用率,那么在考虑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 * ..."数组,每个字长只使用一个大字符数组。像:

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

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

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

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

#define MAX_WORD_LEN 50
struct x dic[MAX_WORD_LEN];
相关问题