我有一个单词列表(整个英语词典)。
在一个单词匹配游戏中,当玩家移动棋子时,我需要检查整个词典,以查看玩家所构成的单词是否存在于词典中。我需要尽快完成这个任务。简单地遍历整个词典太慢了。
在AS3中,最快的算法是什么,可以用什么数据类型进行搜索?(例如数组、对象、字典等)
我有一个单词列表(整个英语词典)。
在一个单词匹配游戏中,当玩家移动棋子时,我需要检查整个词典,以查看玩家所构成的单词是否存在于词典中。我需要尽快完成这个任务。简单地遍历整个词典太慢了。
在AS3中,最快的算法是什么,可以用什么数据类型进行搜索?(例如数组、对象、字典等)
var dict:Object = {};
for(var i:int = 0; i < 10000000; i++) {
dict[i] = true;
}
var btn:Sprite = new Sprite();
btn.graphics.beginFill(0xff0000);
btn.graphics.drawRect(0,0,50,50);
btn.graphics.endFill();
addChild(btn);
btn.addEventListener(MouseEvent.CLICK,checkWord);
var findIt:Boolean = true;
function checkWord(e:MouseEvent):void {
var word:String;
if(findIt) {
word = "3752132";
} else {
word = "9123012456";
}
if(dict[word]) {
trace(word + " found");
} else {
trace(word + " not found");
}
findIt = !findIt;
}
var word:String = "hello";
var dictKey:String = word.charAt(0);
// actual check
if(dict[dictKey][word]) {
trace("found");
} else {
trace("not found");
}
dict['a']
指向另一组由前两个字符索引的字典。所以,你将有dict['a']['b'][wordToSearch]
。这个想法有很多可能的变化(例如,你还必须想出一些应对两个字母单词的策略,比如“be”)。http://sibirjak.com/blog/index.php/collections/as3commons-collections/
但是,正如我之前所说的那样,我会首先尝试最简单和简单的解决方案,并检查它是否适用于真实数据集。
添加
处理用于对象内置属性的关键字的简单方法:
var dict:Object = {};
var keywordsInDict:Array = [];
function buildDictionary():void {
// let's assume this is your original list, retrieved
// from XML or other external means
// it contains "constructor", which should be dealt with
// separately, as it's a built-in prop of Object
var sourceList:Array = ["hello","world","foo","bar","constructor"];
var len:int = sourceList.length;
var word:String;
// just a dummy vanilla object, to test if a word in the list
// is already in use internally by Object
var dummy:Object = {};
for(var i:int = 0; i < len; i++) {
// also, lower-casing is a good idea
// do that when you check words as well
word = sourceList[i].toLowerCase();
if(!dummy[word]) {
dict[i] = true;
} else {
// it's a keyword, so store it separately
keywordsInDict.push(word);
}
}
}
function checkWord(e:MouseEvent):void {
var word:String;
if(findIt) {
word = "Constructor";
} else {
word = "asdfds";
}
word = word.toLowerCase();
var dummy:Object = {};
// check first if the word is a built-in prop
if(dummy[word]) {
// if it is, check if that word was in the original list
// if it was present, we've stored it in keywordsInDict
if(keywordsInDict.indexOf(word) != -1) {
trace(word + " found");
} else {
trace(word + " not found");
}
// not a built-in prop, so just check if it's present in dict
} else {
if(dict[word]) {
trace(word + " found");
} else {
trace(word + " not found");
}
}
findIt = !findIt;
}