设计一个字典dictionary,数据结构自己定。
输入是一些字母。
输出由这些字母组成的单词。例子:
输入:a e l p p
输出:apple
(但是pale这样的单词不行,必须是对应长度)请大家帮忙谈谈思路,主要是定一个数据结构,分析一下效率,谢谢。

解决方案 »

  1.   

    我只想到常规的trie tree作为字典,然后把输入的字母所有顺序都拿进去遍历一次,至于效率嘛应该是O(N*P)N是输入字母的长度,P是字母排列组合的总共数量
      

  2.   

    哪怎么判断这个单词是有效的呢?比如
    输入:a e l p p 
    ppela算不算呢?怎么知道这个词是无效的
      

  3.   

    用HashMap。
    Key使用自定义的类(比如叫做DictKey),用字符数组构造(DictKey(char[])),其hashCode()与字符个数和每个字符相关,与字符顺序无关;euqals()也是如此。
    构建字典的时候,使用单词字符串转换的字符数组构造那个Key类(DictKey)的实例,值就是单词本身。
    这样就可以较为快速的找到了,因为可以有效的减少equals()调用的次数。
    剩下的难题(当然也许并不是很难),就是hashCode()和equals()的算法了。
      

  4.   

    个人理解:
    1.效率最高的就是数组了
    空间上有可能不够用,需要优化空间存储
    不同的语言有不同的实现方式
    把每个输入进行hash
    用值作为索引去取数组中的元素
    就是这个hash不太好找
    需要把单词任意改变字母顺序后得到的hash值一样
    还要处理冲突问题
    2.树
    比较节省空间
    时间复杂度上应该也过得去
    具体用双数组trie tree?(细节没想过)
    或直接26个结点的树(26个字母,不考虑大小写)
    9个结点的树(手机键盘输入问题)
    这个可能在最后比较上要花时间,因为有冲突问题,而且不会少
    不过单词长度都比较短
    字符串匹配算法又很多
    这块有可能优化成:
    先把单词按字母进行排序
    再存储
    有可能省去查找时间
    具体复杂度出入不好估计
      

  5.   

    假设词库为S,其中有m个单词
    输入为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
      

  6.   

    可以考虑使用一个特别结构的词库,存储为结构为HashMap<String, HashSet<String>>。算法分为入库算法和匹配算法。入库算法:1. 将输入的单词按字母表顺序重新排列,如输入tip,重排后为ipt,这个重排的字符串将作为HashMap的key。
    2. 如果这个key不存在于Map中,就加入这个key,同时创建一个HashSet作为value,再把单词加入到那个HashSet中。
    3. 如果key已存在,则取出对应的HashSet值,并往其中加入单词,如pit的key也是ipt,它和tip存储于同一个key下。如,将tip和pit相继入库以后,Map中的结构如下:{
      "ipt" : {"tip", "pit"}
    }匹配算法就很简单了,读取用户的输入并去除空白字符,再按字母表排序,作为查找key;查找Map中与该key对应的值,再依次显示所有匹配结果就可以了。该算法要增加词库体积,所以空间效率不高,不过时间效率肯定是最高的。
      

  7.   

    额7楼说的东西我不是很清楚,我只是看过一小段遗传算法的代码。
    楼主,你这个需求还是不是特别的清晰
    像aepple对应apple的情况是很清晰的一种情况。但是当appla的时候呢?aappl的时候呢?
    这种纠错的力度到底有多大?都会最终影响你的数据结构
      

  8.   

    计算hashcode的算法楼上也已经指出来了,就是把字符数组转变成按字母表排列的字符数组,再算hashcode