【问题标题】:Struggling with finding the smallest word in a TRIE努力在 TRIE 中找到最小的单词
【发布时间】:2021-05-20 00:53:50
【问题描述】:

对于我可能犯的任何英语错误,我深表歉意。 我有一个大学的学校项目,我必须使用 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' 只是一个返回两个值之间最大值的函数。

现在是最小单词函数。我正在考虑如何做到这一点,并尝试检查单词何时结束在每个元素之后寻找“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;

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

【问题讨论】:

  • 当且仅当它的V 的所有元素都是NULL 时,一个元素标记一个单词的结尾,对吗?
  • 如果不是这种情况,则需要额外的 if 来计算发生次数> 0但同时不是叶节点的“内部单词”。

标签: c function trie


【解决方案1】:

我认为没有优雅的方法可以做到这一点。问题是 -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 中有什么单词,它都会返回 1。
  • @JoãoFaro:你能给我们一个minimal complete example吗?也就是说,一个完整的工作程序,它将几个硬编码的单词放入 trie 并调用该函数。这段代码在我测试的时候有效,但是我是用自己写的代码来测试的,所以你的代码肯定有什么不同。
  • 抱歉,因为我还有其他一些项目,我已经休息了几天。我不知道我的问题到底是什么,但我专注于我必须做的其他功能,现在程序几乎完成了我再次尝试了你的功能并且它有效:)))我猜问题出在occurrences_word上。非常感谢你。我很期待这个现在几乎可以宣布完成的项目,我必须在 6 月 13 日之前交付它:))
【解决方案2】:

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

会有两个主要区别:

  • 使用返回最小值而不是最大值(最小而不是最大)的函数。您可以使用内置的 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;
}

【讨论】:

  • 你测试过这个吗?
  • 未测试。您可能需要为作为其他单词前缀的单词添加条件。因此,如果occurrences_word 为正,则将该节点也计为候选词。
  • 我想到了这一点,之前也尝试过类似的方法。我做了一个'Smallest'的功能并尝试了你的代码,但它不起作用:/。无论我在 trie 上说什么,它都会返回 1。它实际上只是将 1 添加到 Alt_min。我理解你的方法,但我不明白为什么它不起作用 ://
  • 对,alt min 需要先设置为非常大的值。
  • 这些答案都不起作用://。无论我在 trie 上有什么单词,这两个函数都总是返回 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2011-01-17
  • 2018-04-17
  • 2021-09-19
  • 2017-12-24
  • 1970-01-01
相关资源
最近更新 更多