努力寻找 TRIE 中的最小单词
Struggling with finding the smallest word in a TRIE
对于我可能犯的任何英语错误提前道歉。
我有一个大学学校项目,我必须使用 trie 索引单词并具有多种功能来做多种事情。
我正在用 C 编程。
我做了一个递归函数来找到 trie 中最大的词并且它正在工作。
这是函数:
int BiggestWord(ELEMENT *P)
{
if (!P) return -1;
int Alt_max = 0;
for (int i = 0; i < MAX_VECTOR; i++)
Alt_max = Biggest(BiggestWord(P->V[i]), Alt_max);
return 1 + Alt_max;
}
'Biggest'只是一个returns两个值之间的最大值的函数。
现在求最小字函数。我正在考虑如何去做,并尝试检查单词何时结束寻找每个元素后的 'NULL'。
这是我的尝试:
int SmallestWord(ELEMENT *P)
{
if (!P) return -1;
int Alt_min = 1;
for (int i = 0; i < MAX_VECTOR; i++)
{
if(P->V[i] != NULL)
{
SmallestWord(P->V[i]);
Alt_min++;
}
}
return Alt_min;
}
我找不到让它工作的方法。
我还想过尝试在每个单词之后指出单词的结尾,然后尝试遍历 trie 的每个分支并找到最小的单词。
这是我第一个半年的编码,我发现在尝试学习它时遇到了一些困难。
如果有人可以通过给我提示或尝试给我去哪里的线索来帮助我,我将非常感激,因为这是一个非常重要的项目,我必须完成并做好。
此外,我的数据结构如下:
#define MAX_VECTOR 26
// 我使用的字母表的 26 个字母
typedef struct ELEMENT
{
int occurrences_word; // this is used for counting number of occurrences of a word
struct ELEMENT *V[MAX_VECTOR];
} ELEMENT;
typedef struct TRIE
{
ELEMENT *root_trie;
int num_words;
} TRIE;
提前感谢所有帮助我的人
此致
您可以将您的解决方案重复用于最大(最长 - 对吧?)字。
有 2 个主要区别:
- 使用 returns 最小而不是最大(最小而不是最大)的函数。您可以使用内置 min/max 函数或实现您自己的函数。
- 您需要“-1”的特殊情况,表示没有结果。它过去可以正常工作 longest,因为 max 函数会自动跳过它,但这里这个 -1 将立即作为最短的单词返回,所以你需要一个 IF.
代码:
int SmallestWord(ELEMENT *P)
{
if (!P) return -1;
int Alt_min = 1000000000;
for (int i = 0; i < MAX_VECTOR; i++) {
int candidate = SmallestWord(P->V[i]);
if (candidate != -1)
Alt_min = min(candidate, Alt_min);
}
return 1 + Alt_min;
}
我看不出有什么优雅的方法可以做到这一点。问题是 -1
表示空指针必须与表示短字的低数区别对待。
她是一个粗略但可行的解决方案:
int SmallestWord(ELEMENT *P)
{
if (!P) return -1;
if(P->occurrences_word != 0) // this is the end of a word
return 1;
int Alt_min = -1;
for (int i = 0; i < MAX_VECTOR; i++)
{
int n = SmallestWord(P->V[i]);
if(n!=-1)
if(n<Alt_min || Alt_min == -1)
Alt_min = n;
}
return 1 + Alt_min;
}
对于我可能犯的任何英语错误提前道歉。 我有一个大学学校项目,我必须使用 trie 索引单词并具有多种功能来做多种事情。 我正在用 C 编程。 我做了一个递归函数来找到 trie 中最大的词并且它正在工作。 这是函数:
int BiggestWord(ELEMENT *P)
{
if (!P) return -1;
int Alt_max = 0;
for (int i = 0; i < MAX_VECTOR; i++)
Alt_max = Biggest(BiggestWord(P->V[i]), Alt_max);
return 1 + Alt_max;
}
'Biggest'只是一个returns两个值之间的最大值的函数。
现在求最小字函数。我正在考虑如何去做,并尝试检查单词何时结束寻找每个元素后的 'NULL'。 这是我的尝试:
int SmallestWord(ELEMENT *P)
{
if (!P) return -1;
int Alt_min = 1;
for (int i = 0; i < MAX_VECTOR; i++)
{
if(P->V[i] != NULL)
{
SmallestWord(P->V[i]);
Alt_min++;
}
}
return Alt_min;
}
我找不到让它工作的方法。 我还想过尝试在每个单词之后指出单词的结尾,然后尝试遍历 trie 的每个分支并找到最小的单词。 这是我第一个半年的编码,我发现在尝试学习它时遇到了一些困难。 如果有人可以通过给我提示或尝试给我去哪里的线索来帮助我,我将非常感激,因为这是一个非常重要的项目,我必须完成并做好。
此外,我的数据结构如下:
#define MAX_VECTOR 26
// 我使用的字母表的 26 个字母
typedef struct ELEMENT
{
int occurrences_word; // this is used for counting number of occurrences of a word
struct ELEMENT *V[MAX_VECTOR];
} ELEMENT;
typedef struct TRIE
{
ELEMENT *root_trie;
int num_words;
} TRIE;
提前感谢所有帮助我的人 此致
您可以将您的解决方案重复用于最大(最长 - 对吧?)字。
有 2 个主要区别:
- 使用 returns 最小而不是最大(最小而不是最大)的函数。您可以使用内置 min/max 函数或实现您自己的函数。
- 您需要“-1”的特殊情况,表示没有结果。它过去可以正常工作 longest,因为 max 函数会自动跳过它,但这里这个 -1 将立即作为最短的单词返回,所以你需要一个 IF.
代码:
int SmallestWord(ELEMENT *P)
{
if (!P) return -1;
int Alt_min = 1000000000;
for (int i = 0; i < MAX_VECTOR; i++) {
int candidate = SmallestWord(P->V[i]);
if (candidate != -1)
Alt_min = min(candidate, Alt_min);
}
return 1 + Alt_min;
}
我看不出有什么优雅的方法可以做到这一点。问题是 -1
表示空指针必须与表示短字的低数区别对待。
她是一个粗略但可行的解决方案:
int SmallestWord(ELEMENT *P)
{
if (!P) return -1;
if(P->occurrences_word != 0) // this is the end of a word
return 1;
int Alt_min = -1;
for (int i = 0; i < MAX_VECTOR; i++)
{
int n = SmallestWord(P->V[i]);
if(n!=-1)
if(n<Alt_min || Alt_min == -1)
Alt_min = n;
}
return 1 + Alt_min;
}