在AS3中搜索8个字符串的最佳方法?

时间:2011-11-19 04:10:40

标签: actionscript-3

如果有人回答,我会事先道歉,但我看了一眼,找不到我想要的东西。

我正在寻找在AS3中搜索8个字符串的最佳方法,看它是否包含一个或多个单词。我已经有一个加载到Flash中的单词词典,有......

[Embed(source = "../f-16.txt",mimeType = "application/octet-stream")]
private static const wordFile:Class;
var words:Array = new wordFile().toString().split("\n");

我正在考虑将每个起始字母进一步拆分为26个数组,并且可能将这些数组分成不同长度字的数组(因此所有8个以a开头的字母都在一起,依此类推)。 / p>

我需要做的是在AS3中搜索一个8字符串,以查看它是否包含字典数组中的任何单词或单词。下面是一些示例字符串以及我需要返回的内容......

  1. “beenpoet”=“已经”,“诗人”
  2. “itxitxit”=“it”,“it”,“it”
  3. “aardvark”=“aardvark”
  4. 等等。我能看到的问题是,单词可以从字符串中的任何一点开始,这使问题变得复杂。

    在as3中做到这一点的最佳(最快)方法是什么?

    感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

我......

我有点醉了。 (这可能会被SO模型删除。)(编辑:我很醉。)

但是,对于您的具体用例......

  

我正在寻找在AS3中搜索8个char字符串的最佳方法   如果它包含一个或多个单词。我已经有了一本单词词典   加载到Flash中,用...

     

我正在考虑将其进一步拆分为26个阵列   起始字母,而不是那些数组到数组   不同长度的单词(因此所有以a开头的8个字母单词都是   在一起,等等。

我可能会建议一个树形结构 - 这意味着你有26 ^ 8个字母组合。我认为这将是一个比数组查找更快的搜索,因为你不必遍历数组来找到你的值。

字符串的每个字符都是树的一层。理想情况下,在达到最大分支之前,您将能够很好地停止。无论数字是多少,你的最大查找次数都是26 ^ 8。

关于这种方法的最好的事情是,使用树结构,沿着树的递归在编写代码方面应该是微不足道的。您只需存储字典单词。因此,如果有人键入“cbyir”,您将知道(通过第二个字符)输入与字典单词不匹配。 (除非有一个单词以CB开头。哦韦伯斯特,你在哪里?)

这样做的另一个好处是 - 您可以轻松检查字符串的每个字符。如果进行中的角色不匹配(或第三个,或第四个...),您可以放弃该搜索并提前退出;你的功能不需要天真。

再一次,我喝醉了。不过,祝你好运! :-D如果您有任何问题,请发表评论,因为我知道这可能不太清楚。

编辑:我回到了这个答案,因为我正在思考它。可能的实现可以使用AS3 Dictionary类;你可以让Dictionaries指向Dictionaries。这将比数组查找快得多,因为字典的查找时间为O(1)。这意味着您的树查找真的非常 - 迭代次数将等于单词中的字母数,而不是单词中可能的字母组合数。

给这样的东西一个镜头;我很确定它会起作用。如果您有任何实施问题,请与我们联系。

答案 1 :(得分:0)

这样的事情怎么样:

public class WordFinder {

   public var searchFor:Array = [];

   public function search(value:String):Array {
      var result:Array=[];
      for each (var word:String in searchFor) {
         if (value.indexOf(word) >= 0) {
            result.push(word);
         }
      }
   }
}

答案 2 :(得分:0)

这是您需要做的事情:

public function verifyWord(word : String, wordList : Array) : Array
{
    var resultArray : Array = [];
    for(var i : int = 0; i < word.length; i++)
    {
        for(var j : int = word.length; j > i; j--)
        {
            var brokenWord : String = word.substring(i, j);
            if(wordList.indexOf(brokenWord) >= 0)  // We are performing a search on a array, so its O(n), super slow, change this for something good
            {
                resultArray.push(brokenWord);
            }
        }
    }
    return resultArray;
}

基本上:

  • 将输入词分成每个可能的组合;
  • 对于每个拆分的单词,您需要验证字典是否包含它们(当前使用数组搜索,即SLOW);

  • 要提高性能,您可以将字典存储为哈希表,也可以使用半间隔或更智能的搜索算法来检查单词是否在字典中(请参阅此AS3: Large text files with indexOf() on an array)< / p>