给定一串字符时查找所有有效单词(递归/二进制搜索)

时间:2017-06-18 03:16:42

标签: java recursion binary-search

我希望对我尝试实施的方法提供一些反馈,而这种方法并非100%正常工作。我正在为练习制作一个Android应用,其中用户被给予20个随机字母。然后,用户使用这些字母来制作任何大小的单词。然后它检查字典以查看它是否是有效的英语单词。 给我带来麻烦的部分是显示"提示"。如果用户卡住了,我想显示可以发出的单词。我最初想的是递归。但是,使用20个字母可能需要很长时间才能执行。所以,我还实现了二进制搜索,以检查当前递归路径是否是字典中任何内容的前缀。我确实得到了有效的提示,但它没有返回所有可能的单词。在我的递归思考中,我有错吗?此外,是否有推荐的,更快的算法?我已经看过一种方法,你可以检查字典中的每个单词,看看字符是否可以创建每个单词。但是,我想知道我的方法与那个方法的效果如何。

 function getLUISData(urlLUIS){
        //Get LUIS.ai JSON data
     return new Promise((resolve, reject) => {
        request({url:urlLUIS, json:true}, function (error, response, body) {
            if (err) return reject(err);
            try {
                resolve(body);
            } catch(e) {
                reject(e);
            }
        });//end of request

  });//end of promise
}

app.post('/query', function(request, response) {
    query = request.body.query;
    luisURL = luisURL.concat(encodeURIComponent(query));
    getLUISData(luisURL).then(function(data){ // execution will wait here until request completes. here promise gives you data. 
         response.send(data);
    });
});

2 个答案:

答案 0 :(得分:1)

加速算法的最简单方法可能是使用Trie(前缀树)

Trie数据结构提供了两种相关方法。 isWord(String)和isPrefix(String),两者都进行O(n)比较,以确定字典中是否存在单词或前缀(其中n是参数中的字母数)。这非常快,因为字典的大小并不重要。

为了比较,使用二进制搜索检查词典中是否存在前缀的方法是O(n * log(m))其中n是字符串中的字母数,m是字典中的单词数

我使用Trie为您编写了一个类似的算法,并将其与您发布的代码(经过微小修改)在一个非正式的基准测试中进行了比较。 使用20-char输入,Trie花费了9ms。原始代码在合理的时间内没有完成,因此我不得不将其删除。

编辑: 至于为什么你的代码没有返回所有提示,如果前缀不在你的字典中,你就不想破坏。你应该继续检查下一个前缀。

答案 1 :(得分:0)

  

是否有推荐的更快的算法?

参见" String searching algorithm"上的维基百科文章,特别是名为" Algorithms using a finite set of patterns"的部分,其中"有限的模式集&# 34;是你的字典。

首先列出的Aho–Corasick algorithm可能是个不错的选择。