【问题标题】:AS3 - Fast search through array with stringsAS3 - 使用字符串快速搜索数组
【发布时间】:2014-11-24 21:43:37
【问题描述】:

我需要帮助。我正在制作字典之类的东西(但您自己填写)。我需要快速搜索其中的单词。我需要使用对象或数组(因为 JSON 不支持字典。有保存文件的选项)。我有这段代码,但是当数组中有很多单词时,恐怕它没有优化到快速搜索。请帮忙。

public function Search (string:String,section:String = Wordbook.NEWW):int
    {
        var str:String = string.toUpperCase();
        for (i = 0; i < NewWords.length; i++)
        {
            if (NewWords[i].toUpperCase.indexOf(str) > -1)
            {
                return i;
            }
        }
        return -1;//If not found
    }

以及它应该如何工作的示例:(SearchTxt - 文本字段,用户应在此处输入他需要查找的单词;WB - Wordbook 类;WB.NewWords & WB.NewWordsT - 该类中的数组)

var index:int = WB.Search(SearchTxt.text,Wordbook.NEWW);
if(index>-1){
  WordTxt.text = WB.NewWords[index];
  TranslationTxt.text = WB.NewWordsT[index];
} else {
  dispatchEvent(new EventWithMessage(EventWithMessage.ERROR,{error:"No match!"}));
}

【问题讨论】:

  • 为什么Dictionary 会更快?它不包含任何特殊的搜索功能,它只是强制进行严格的相等测试
  • @CyanAngel 好的。谢谢你的智慧之珠,但也许你还有一颗,这对我有帮助吗? :)
  • 添加一小部分您搜索的数据和您可能期望的搜索条件。我对搜索优化不抱任何期望,但这样的样本会让那些可能知道一些事情的人更容易
  • @CyanAngel 现在好点了吗?还是我误会了你?
  • 不,我的意思是 WB.Words 中的内容以及您希望 SearchTxt.text 中的内容的示例

标签: arrays performance actionscript-3 search


【解决方案1】:

这里有两种解决方案,具体取决于您的用例。

解决方案 1:别管它!

如果您要构建的最大字典只有一百个左右,那么线性搜索的性能会很好。

解决方案 2:实现二分查找算法

如果您确实需要处理包含数千个单词的大型词典,则二进制搜索算法将提供更好的性能。为此,您需要保证您的搜索数组已排序。

这样的事情应该可以解决问题:

public function Search (string:String,section:Array = NewWords, offset:int = 0):int
{
    if (section.length == 0) {
        return -1;
    }
    var str:String = string.toUpperCase();
    var firstCharCode:int = str.charCodeAt(0);
    var middleWord:String = section[section.length / 2];
    var middleWordCharCode:int = middleWord.charCodeAt(0);


    if (middleWord.substr(0,str.length) == str) {
        return (section.length / 2) + offset;
    } else {
        var comparison:int = str.localeCompare(middleWord);
        if (comparison < 0) {
            return Search(string, section.splice(0, section.length / 2), offset);
        } else { // then comparison > 0
            var newOffset:int = offset + section.length / 2;
            return Search(string, section.splice(section.length / 2, section.length-1), newOffset);
        }
    }
}

【讨论】:

  • 谢谢!顺便说一句,字典是由应用程序的用户填写的,所以我不知道会有多少单词:) 那么排序数组,这段代码将是我的解决方案吗?
  • @HarrySky,您还可以检查数组的长度,如果它是一个短数组,则使用线性搜索(做一些测试会让您知道截止点在哪里)。
  • 我对数组进行了排序,但是当您的代码运行时它会抛出错误。在它进入另一个圆圈后抛出。为什么它不起作用?你能帮忙吗:c
  • 谢谢你!我搜索了线性和二进制搜索并找到了解决方案。可能会与你同在:)
猜你喜欢
  • 2013-01-20
  • 2013-01-06
  • 2011-03-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多