/ / AS3 - Rýchle vyhľadávanie v poli s reťazcami - polia, výkon, ActionScript-3, vyhľadávanie

AS3 - Rýchle vyhľadávanie cez pole s reťazcami - pole, výkon, actioncript-3, vyhľadávanie

Potrebujem pomoc.Vyrábam niečo ako slovník (ale sám si ho vypĺňate). Potrebujem v nej rýchlo hľadať slová. Musím použiť Object alebo Array (pretože JSON nepodporuje slovník. Existuje možnosť uložiť súbor). Mám tento kód, ale obávam sa, že nie je tak optimalizovaný na rýchle vyhľadávanie, keď bude v poli veľa slov. Prosím pomôžte.

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
}

A príklad, ako by to malo fungovať: (SearchTxt - textové pole, používateľ by sem mal napísať slovo, ktoré musí nájsť; WB - trieda slovníkov; WB.NewWords & WB.NewWordsT - polia v tejto triede)

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!"}));
}

odpovede:

0 pre odpoveď č. 1

Podľa prípadov použitia existujú dve riešenia.

Riešenie 1: Nechaj to tak!

Ak je najväčší slovník, ktorý vytvoríte, iba asi sto slov, bude výkon s lineárnym vyhľadávaním v poriadku.

Riešenie 2: Implementujte binárny vyhľadávací algoritmus

Ak potrebujete zvládnuť veľké slovníky s tisíckami slov, vylepšený výkon ponúkne binárny vyhľadávací algoritmus. Za týmto účelom budete musieť zaručiť, že vaše vyhľadávacie pole je zoradené.

Niečo podobné by malo urobiť trik:

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