2011-11-19 48 views
2

如果这个问题已经得到解答,我很抱歉,但是我看了一下,找不到我正在寻找的东西。在AS3中搜索8个字符的字符串的最佳方法是什么?

我正在寻找在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个阵列的每个首字母,而且比那些可能阵列分成不同的阵列(所以以a开头的所有8个字母单词都在一起,等等)。

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

  1. “beenpoet”= “被”, “诗人”
  2. “itxitxit”= “它”, “它”, “它”
  3. “土豚”= “土豚”

等。我可以看到的问题是,单词可以从字符串中的任何一点开始,这会使事情变得复杂。

在as3中做什么最好(最快)的方法是?

感谢您的任何帮助。

+0

“catscat”(或类似的东西)如何分裂? – Ryan

+0

您是否在寻找一种通用算法,或者您是否遇到与AS3相关的特定问题? – arootbeer

+0

特定于AS3会更有用,但基本上只是最有效的方法。我敢肯定,我可以想出一些代码来做到这一点,但最好的方式做一些建议会有所帮助,所以我不会在错误的方向:) – Phil

回答

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); 
     } 
     } 
    } 
} 
3

我......

我有点醉了。 (这可能是由SO MODS被删除。)(编辑:我很醉了。)

但是,对于您的具体使用情况....

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

我想分裂,截至进一步进入26个阵列的每个 首字母,而且比那些可能阵列成的 阵列不同(所以以a开头的所有8个字母词都是 ,等等)。

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

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

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

这样的另一个好处 - 你可以很容易地检查你的字符串的每个字符。如果前进角色不匹配(或第三个或第四个......),则可以放弃该搜索并尽早退出;你的功能不需要太天真。

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

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

给这样的一个镜头;我很确定它会起作用。如果您有任何实施问题,请告诉我。

+0

谢谢,这是一个有趣的虽然我不知道如何编程搜索树,但它也能处理同一个字符串中的多个单词吗?希望你不会感觉太累了! :) – Phil

+0

@Phil多个单词不应该是一个问题。您只需从字符串中的每个字母开始运行搜索算法,而不仅仅是开始。一旦它们不再有效,你可以修剪它们。是的,今天早上会很糟糕。 :P –

+0

@Phil - 查看我的编辑可能的实施计划。 –

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

相关问题