努力寻找 TRIE 中最小的单词

问题描述

对于我可能犯的任何英语错误,请提前道歉。 我有一个大学的学校项目,我必须使用 trie 来索引单词,并且有多种功能可以做多种事情。 我正在用 C 编程。 我做了一个递归函数来找到树中最大的词,它正在工作。 这是函数

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' 只是一个返回两个值之间最大值的函数

现在是最小的单词函数。我正在考虑如何去做,并试图在每个元素之后单词结束寻找 '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;
}

我找不到让它工作的方法。 我还想过尝试在每个单词之后指出单词的结尾,然后尝试遍历特里的每个分支并找到最小的单词。 这是我的第一个半年编码,我发现尝试学习它有一些困难。 如果有人可以通过给我提示或试图给我提供去哪里的线索来帮助我,我将不胜感激,因为这是一个非常重要的项目,我必须完成并做好。

另外,我的数据结构如下:

#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;

提前感谢所有帮助我的人 问候

解决方法

您可以对最大(最长 - 对吗?)字重复使用您的解决方案。

有两个主要区别:

  • 使用返回 min 而不是 max(最小而不是最大)的函数。您可以使用内置的最小值/最大值函数,也可以实现自己的函数。
  • 您需要一个特殊的“-1”来表示没有结果。它曾经可以正常工作最长,因为 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;
}