Golang:过程花了太长时间。实施拼写检查

时间:2013-11-06 07:49:03

标签: arrays algorithm memory-management go

http://play.golang.org/p/H5E0ExL85d

我已经用Go实现了一些Peter Norvig的拼写检查算法。

奇怪的是, FIRST THREE 调用工作正常,为我提供了所需的输出。

但从第二个开始,它就是说“过程花了太长时间。”

有人可以查看我的代码并告诉我出错了吗?

这是可能出错的片段。

使用英文版的相同代码,一切都很完美。

UNICODE格式和边界根据语言而改变,因为英语每个字母包含1个字节,在这种情况下亚洲语言包含每个字符3个字节。

这是尝试运行与完美工作的英语相同的算法。 但这不起作用。

total_set := []string{}
for _, elem := range splits {

    if len(elem.str2) > 3 {
        //deletion
        total_set = append(total_set, elem.str1+elem.str2[3:])

        //replace
        for i:=0; i<len(koreanletter)/3; i++ {
            total_set = append(total_set, elem.str1+string(koreanletter[3*i:3*(i+1)])+elem.str2[3:])
        }

        //transpose
        if len(elem.str2) > 9 {
            total_set = append(total_set, elem.str1+string(elem.str2[3:6])+string(elem.str2[:3])+elem.str2[9:])
        }

    } else {
        //deletion
        total_set = append(total_set, elem.str1)
    }

    //insertion
    for _, c := range koreanletter {
        total_set = append(total_set, elem.str1+string(c)+elem.str2)
    }
    return RemoveDuplicateStringArrayForKorean(total_set)
}

英语版本如下。 这是完美的。

//Edits1 is to measure the distance between strings.
func (model *Model) Edits1(word string) []string {
  const alphabet = "abcdefghijklmnopqrstuvwxyz"

  splits := []Pair{}
  for i := 0; i <= len(word); i++ {
    splits = append(splits, Pair{word[:i], word[i:]})
  }

  total_set := []string{}
  for _, elem := range splits {

    if len(elem.str2) > 0 {
      //deletion
      total_set = append(total_set, elem.str1+elem.str2[1:])

      //replace
      for _, c := range alphabet {
        total_set = append(total_set, elem.str1+string(c)+elem.str2[1:])
      }

      //transpose
      if len(elem.str2) > 1 {
        total_set = append(total_set, elem.str1+string(elem.str2[1])+string(elem.str2[0])+elem.str2[2:])
      }

    } else {
      //deletion
      total_set = append(total_set, elem.str1)
    }

    //insertion
    for _, c := range alphabet {
      total_set = append(total_set, elem.str1+string(c)+elem.str2)
    }
  }
  return RemoveDuplicateStringArrayLowerCase(total_set)
}

添加:有序参数,现在我有三件事可以工作。

koreanletter中没有遗漏任何字符。

无论如何我能更具体地看到错误吗?我无法弄明白。

1 个答案:

答案 0 :(得分:5)

使用您的代码,似乎是您的KoreanKnownEdits2花了太长时间。在您的第四个示例(失败的那个)中,model.KoreanEdits1(input_word)的长度为28197,第一个model.KoreanEdits1(elem1)的长度为23499,这使得大约需要662百万个案例。似乎程序在第一个147,000之后失败了,因为它花了太长时间(playground)。

任何不需要调用KoreanKnownEdits2的示例似乎都有效,所以我怀疑你应该重写这个函数以避免穷举搜索,或者至少将它限制为更合理的大小如果你想使用它与游乐场的时间限制。我没有足够的细节研究你的代码以100%肯定,但我怀疑西方字母的26个字母使其可以管理英文版,而扩展的韩文字母使你的输入的大小太大而不能无论每个字符编码的字节数如何,都在操场的时间限制内处理。