开放的编程资料库

当前位置:我爱分享网 > PHP教程 > 正文

对象索引与数组集合

设置和目标

假设我们有一个大型文本文档,并且有一堆要解析文档的关键字。我们不关心关键字出现了多少次——我们只关心它是否被使用过。当我们找到一个关键字时,我们需要记录下找到的那个关键字,以便我们稍后检查。

低效的方法:数组收集和搜索

记录已找到关键字的第一种方法是将关键字压入一个数组:

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

在文档搜索结束时,我们将得到如下数组:

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

在检查此数组是否存在给定关键字时,此方法效率低下。为什么?因为我们需要遍历数组并进行搜索,直到找到给定的关键字(如果有的话)。那些是很多“浪费”或无结果的循环,即使我们在找到关键字时打破循环也是如此。低效是描述这个过程的唯一词。

高效方法:带索引的对象

检查存储关键字供以后参考的最快方法是通过对象(在 JavaScript 中)或关联数组(在 PHP 中)。我们没有将关键字添加到数组中,而是将关键字作为索引添加到主对象中,并将值设为 1:

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

为什么这样更快?没有浪费的周期盲目地查看数组。检查快速简单:

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

它要么是索引,要么不是!在 PHP 中,我们会将关键字保存到关联数组中:

//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!
}

一句话……太棒了。不仅快速而且简单!

我无法提供基准,因为执行速度取决于关键字数组的大小。可以说,为了简单和速度,使用带有关键字索引的对象绝对是可行的方法!

未经允许不得转载:我爱分享网 » 对象索引与数组集合

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏