【优化】数组去重

本文通过实验对比了使用Hash和数组两种方法去除数组中重复元素的效率。实验结果显示,在处理1000个节点的数据时,使用Hash的方法明显优于传统数组筛选方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用hash代替数组.下面代码可直接拷贝测试:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 数组去重复 </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
#contentHS, #contentAR { width: 1000px; height: 180px; }
div { width:100px; height: 25px; background-color: #009900; font-size:12px; line-height: 25px; text-align: center; }
#resultHS,#resultAR {  width: 1000px; height: 40px; }
#contentHS, #resultHS { border: 1px solid #FFCC66; background-color: #FFFFCC;}
#contentAR, #resultAR { border: 1px solid #00CC00; background-color: #CEFFCE;}
</style>
</head>
<body>
<div onclick="uniStart();">测试开始</div><br/>
<textarea id="contentHS"></textarea><br/><br/>
<textarea id="resultHS"></textarea><br/><br/>
<textarea id="contentAR"></textarea><br/><br/>
<textarea id="resultAR"></textarea>
<script type="text/javascript">
function uniStart() {
	/* 生成1000个英文字符 */
	var array1 = new  Array();   
	var array2 = new Array();
	for(var i = 0; i < 1000; i++)   {   
	   array1[array1.length] = String.fromCharCode(Math.floor(Math.random()*26)+97);   
	   array2[array2.length] = String.fromCharCode(Math.floor(Math.random()*26)+97);  
	}   
	document.getElementById('contentHS').value = '测试1000字符数组: ' + array1;
	document.getElementById('contentAR').value = '测试1000字符数组: ' + array2;

	/* 方法一 Hash */
	function hash_unique(array) {
		var o = {};
		for(var i = 0, j = 0; i < array.length; i++) {
			if(typeof o[array[i]] == 'undefined') {
				o[array[i]] = j++;
			}
		}
		array.length = 0;
		for(var k in o) {
			array[o[k]] = k;
		}
		return array;
	}

	/* 方法二 数组 */
	function array_unique(array) {
			if (array.length < 2) return [array[0]] || [];
			var arr = [];
			for (var i = 0; i < array.length; i++) {
				arr.push(array.splice(i--, 1));
				for (var j = 0; j < array.length; j++) {
					if (array[j] == arr[arr.length - 1]) {
						array.splice(j--, 1);
					}
				}
			}
			return arr;
	}
	var HS = document.getElementById('resultHS'),
		AR = document.getElementById('resultAR');
	// 方法一测试开始 
	var d = new Date().getTime();
	HS.value = 'HASH去重结果: ' + hash_unique(array1);
	d = new Date().getTime() - d;
	HS.value += '\r1000节点耗时: ' + d + '毫秒!';
	// 方法二测试开始
	var d2 = new Date().getTime();
	AR.value = 'Array去重结果: ' + array_unique(array2);
	d2 = new Date().getTime() - d2;
	AR.value += '\r1000节点耗时: ' + d2 + '毫秒!';
}
</script>
</body>
</html>

可见用hash比用array筛选快的不是一个数量级

转载于:https://www.cnblogs.com/bluedream2009/archive/2010/03/12/1684798.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值