数组 – Golang:进程耗时太长.实施拼写检查
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,c := range alphabet { total_set = append(total_set,elem.str1+string(c)+elem.str2) } } return RemoveDuplicateStringArrayLowerCase(total_set) } 增加:有序的论点,现在我有三件事可行. 韩国通讯中没有遗漏任何字符. 反正我是否可以更具体地看到错误?我只是想不通. 解决方法
玩你的代码,似乎是你的KoreanKnownEdits2花了太长时间.在你的第四个例子中(一个失败),model.KoreanEdits1(input_word)的长度是28197,第一个模型的长度.KoreanEdits1(elem1)是23499,这使得大约需要662百万个案例.似乎该计划在第一批147,000之后失败,因为它需要太长时间(
playground).
任何不需要调用KoreanKnownEdits2的例子似乎都有效,所以我怀疑你应该重写这个函数以避免穷举搜索,或者至少将它限制在一个更合理的大小,如果你想在游乐场的时间限制内使用它.我没有足够的细节研究你的代码,以确保100%确定,但我怀疑西方字母的26个字母使其可以管理英文版,而扩展的韩文字母使你的输入的大小太大而不能无论每个字符编码的字节数,都在操场的时间限制内处理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |