设计一个字典dictionary,数据结构自己定。
输入是一些字母。
输出由这些字母组成的单词。例子:
输入:a e l p p
输出:apple
(但是pale这样的单词不行,必须是对应长度)请大家帮忙谈谈思路,主要是定一个数据结构,分析一下效率,谢谢。
输入是一些字母。
输出由这些字母组成的单词。例子:
输入:a e l p p
输出:apple
(但是pale这样的单词不行,必须是对应长度)请大家帮忙谈谈思路,主要是定一个数据结构,分析一下效率,谢谢。
输入:a e l p p
ppela算不算呢?怎么知道这个词是无效的
Key使用自定义的类(比如叫做DictKey),用字符数组构造(DictKey(char[])),其hashCode()与字符个数和每个字符相关,与字符顺序无关;euqals()也是如此。
构建字典的时候,使用单词字符串转换的字符数组构造那个Key类(DictKey)的实例,值就是单词本身。
这样就可以较为快速的找到了,因为可以有效的减少equals()调用的次数。
剩下的难题(当然也许并不是很难),就是hashCode()和equals()的算法了。
1.效率最高的就是数组了
空间上有可能不够用,需要优化空间存储
不同的语言有不同的实现方式
把每个输入进行hash
用值作为索引去取数组中的元素
就是这个hash不太好找
需要把单词任意改变字母顺序后得到的hash值一样
还要处理冲突问题
2.树
比较节省空间
时间复杂度上应该也过得去
具体用双数组trie tree?(细节没想过)
或直接26个结点的树(26个字母,不考虑大小写)
9个结点的树(手机键盘输入问题)
这个可能在最后比较上要花时间,因为有冲突问题,而且不会少
不过单词长度都比较短
字符串匹配算法又很多
这块有可能优化成:
先把单词按字母进行排序
再存储
有可能省去查找时间
具体复杂度出入不好估计
输入为n个字母方案1:
遍历词库,看看每一个单词是否与输入的字母匹配。
时间复杂度大约为 O(m)
如果词库不大的话,这种方案还是挺快的方案2:
生成n个输入字母的所有排列,对每一种排列,到词库里去找是否有对应单词。
时间复杂度大约为 O(n!)
n=8的话 n! = 40320
n=9, n! = 362880
n=10 n! = 3628800
方案3:回溯法
与方案2类似,但是能够直接忽略掉大量不可能是单词的排列
以a p p l e 为例
因为没有以pp开头的单词,所有ppxxx都不用再尝试了也可以将以上几种方案结合起来,比如在n很小的时候使用方案2,在n很大的时候使用方案1
2. 如果这个key不存在于Map中,就加入这个key,同时创建一个HashSet作为value,再把单词加入到那个HashSet中。
3. 如果key已存在,则取出对应的HashSet值,并往其中加入单词,如pit的key也是ipt,它和tip存储于同一个key下。如,将tip和pit相继入库以后,Map中的结构如下:{
"ipt" : {"tip", "pit"}
}匹配算法就很简单了,读取用户的输入并去除空白字符,再按字母表排序,作为查找key;查找Map中与该key对应的值,再依次显示所有匹配结果就可以了。该算法要增加词库体积,所以空间效率不高,不过时间效率肯定是最高的。
楼主,你这个需求还是不是特别的清晰
像aepple对应apple的情况是很清晰的一种情况。但是当appla的时候呢?aappl的时候呢?
这种纠错的力度到底有多大?都会最终影响你的数据结构