近期在面试时候遇到这么一道题目:比较两个存在大量元素的数组,抽离出他们的相同项。
当时我脑中想到的办法是把一个数组中的元素逐个地去另一个数组中查找,但是此办法效率不高,下面给出测试代码,arry1和arry2各有一万个元素:
private function loopCompare():void { var startTime:int = getTimer(); var commonValue:Array = []; var currentValue:int; var index:int; for(var i:int=0; i<elementCount; i++) { currentValue = arry1[i]; index = arry2.indexOf(currentValue); if( index != -1 ) { commonValue.push(currentValue); } } trace("common count:" + commonValue.length.toString()); trace("time cost:" + (getTimer() - startTime).toString() + "ms"); }
之后,通过Google之后我发现了另一种办法:字典查找法,给予了我满意的效率,下面给出测试代码:
private function ObjectCompare():void { var startTime:int = getTimer(); var commonValue:Array = []; var obj:Object = {}; for each(var elem:int in arry1) { obj[elem] = true; } for each(elem in arry2) { if( obj[elem] ) { commonValue.push(elem); delete obj[elem]; } } trace("common count:" + commonValue.length.toString()); trace("time cost:" + (getTimer() - startTime).toString() + "ms"); }
这个故事告诉我们,在比较数据方面,关联数组的效率要远大于一般数组。经测试,比较一万个元素,使用一般数组需要耗时677ms,而关联数组仅耗时10ms