洗牌算法、随机打乱数组 、数组去重

1,389 阅读1分钟

如何验证一个数组真的被打乱了?

方法一:先列出该数组的全排列。将该数组打乱 100 万次,记录每次打乱后出现的结果频次(哈希)。如果是完全乱序的话,各个结果出现的频次应该是差不多大的。

方法二:取一个数组,里面只有一个元素是 1,其他元素值都为 0。将该数组打乱 100 万次,1 出现在每个位置上的次数应该是差不多大的。

//时间复杂度为o(n^2)
function randomSortArray(arr){
	let backArr = []
	while(arr.length){
		let index = parseInt(Math.random() * arr.length)
		backArr.push(arr[index])
		arr.splice(index,1)
	}
	return backArr
}
//时间复杂度为o(n)
function randomSortArray2(arr){
	for(let i = 0; i < arr.length; i++){
		let index = parseInt(Math.random() * (arr.length - i));
		[arr[index],arr[arr.length - 1 - i]] = [arr[arr.length - 1 - i],arr[index]]
	}
	return arr
}
arr.sort(() => Math.random() - 0.5)

数组去重

function arrayUnique(arr){
	let res = []
	for(let i = 0; i < arr.length; i++){
		let item = arr[i]
		(res.indexOf(item) === -1) && res.push(item)
	}
	return res
}

//hashmap
function arrayUnique2(arr){
	let map = new Map()
	for(let i = 0; i < arr.length; i++){
		map.set(arr[i],(map.get(arr[i]) || 0) + 1)
	}
	console.log(map)
	let res = []
	for(let [k,v] of map){
		res.push(k)
	}
	return res
}