我有一个项目,其中我有一个文件(.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
因此,当我在列表中插入一个单词时,我将不得不更新下一个矩阵元素中列表元素的数量。 - >耗费时间?
那你觉得这个方法怎么样?你有更好的想法吗?
答案 0 :(得分:2)
在C中实现此功能的最佳数据结构是什么,因此它占用的内存和时间最少?
很难同时获得least memory
和least 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')
这允许您为每个长度存储可变数量的单词,并且您不会为每个字符串分配比所需更多的内存。它就像一个矩阵,但好处是每行可以有不同的列数。
但是,您需要进行一些动态内存处理,即malloc
,realloc
和strdup
。
为了节省一些执行时间,你应该增加" 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];