Indexování objektů vs. kolekce Array

Nastavení a cíl

Řekněme, že máme jeden velký textový dokument a máme spoustu klíčových slov, na která chceme dokument analyzovat. Nezajímá nás, kolikrát se klíčové slovo objeví – zajímá nás pouze to, aby bylo použito. Když najdeme klíčové slovo, musíme ho zaznamenat, abychom ho mohli později zkontrolovat.

Neefektivní metoda: Shromažďování a vyhledávání polí

První metodou, jak zaznamenat, že bylo klíčové slovo nalezeno, je vložení klíčového slova do jednoho pole:

//Assume an array called "foundKeywords" was defined above
if(shouldSave(keyword)) {
	foundKeywords.push(keyword);
}

Na konci hledání dokumentu bychom skončili s polem jako:

//the foundKeywords array looks like:
//['keyword1','keyword2','keyword2',...]

Pokud jde o kontrolu tohoto pole na existenci daného klíčového slova, tato metoda se ukáže jako neefektivní. Proč? Protože bychom museli procházet polem a hledat, dokud nenajdeme dané klíčové slovo (pokud vůbec). To je spousta „promarněných“ nebo neplodných cyklů, i když při nalezení klíčového slova přerušíme smyčku. Neefektivní je jediné slovo, které tento proces popisuje.

Efektivní metoda: Objekt s indexem

Nejrychlejší metodou kontroly uložených klíčových slov pro pozdější použití je objekt (v JavaScriptu) nebo asociativní pole (v PHP). Místo přidávání klíčového slova do pole přidáme klíčové slovo jako index k hlavnímu objektu, přičemž hodnotu uvedeme jako 1:

//Assume an object {} called "foundKeywords" was defined above
if(shouldSave(keyword)) {
	foundKeywords[keyword] = 1;
}

Proč je to rychlejší? Žádné promarněné cykly slepě prohlížející pole. Kontrola je rychlá a jednoduchá:

if(foundKeywords[keyword]) { //FOUND!
	//do something
}

Buď je to index, nebo není! V PHP bychom klíčové slovo uložili do asociativního pole:

//Assume an array called "$found_keywords" was defined above
if(shouldSave($keyword)) {
	$found_keywords[$keyword] = 1;
}

//Later: checking if the keyword was there...
if($found_keywords[$keyword]) { //or array_key_exists($keyword,$found_keywords)
	//FOUND!
}

Jedním slovem...úžasné. Nejen rychlé, ale také jednoduché!

Nemohu poskytnout benchmark, protože rychlost provádění závisí na tom, jak velké je pole klíčových slov. V zájmu jednoduchosti a rychlosti stačí říci, že použití objektu s indexem klíčových slov je rozhodně správnou cestou!