有一个包含1000个元素的数组,所有元素通常分布在1 - 10000000范围内。如何比O(n^2)
更快地检查重复项?
答案 0 :(得分:0)
您可以在{
"name": "bableandtypescript",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "webpack-dev-server --content-base src --inline --hot --watch --history-api-fallback"
},
"author": "",
"license": "ISC",
"dependencies": {
"babel-core": "^6.17.0",
"babel-loader": "^6.2.5",
"babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-react-html-attrs": "^2.0.0",
"babel-plugin-transform-class-properties": "^6.16.0",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-preset-es2015": "^6.16.0",
"babel-preset-react": "^6.16.0",
"babel-preset-stage-0": "^6.16.0",
"debug": "^2.3.2",
"es6-promise": "^4.0.5",
"flux": "^3.0.0",
"history": "^4.3.0",
"json-loader": "^0.5.4",
"mysql": "^2.12.0",
"net": "^1.0.2",
"radium": "^0.18.1",
"react": "^15.3.2",
"react-dom": "^15.3.2",
"react-router": "^2.8.1",
"undebug": "^1.0.0",
"webpack": "^1.13.2",
"webpack-dev-server": "^1.16.2",
"websocket": "^1.0.23"
}
}
时间复杂度和O(max_num + n)
空间复杂度中执行此操作,其中O(max_num)
是您在阵列中可以使用其他数组的最大数量。
您分配大小为10000001的新数组max_num
,并将其所有元素初始化为countsArr
。然后迭代主数组,并在每次迭代中,将0
添加到当前正在处理的数字索引的新数组元素中。例如,主数组的第一个位置是数字1
,因此您将15
添加到1
等等。完成迭代后,您只需迭代{{1如果你找到一个元素,哪个值大于arr[15]
,那么你的数组中就会有重复数据,否则就没有。
编辑:对于大n来说,这通常比countsArr
解决方案更快,但由于您有{1000}个元素,1
,O(n^2)
实际上比1,000^2 = 1,000,000
更快我提出的解决方案。
EDIT2:正如Eugene Sh。指出,实际上没有必要迭代aditional数组,因为你可以立即说,当你增加一个已经存在1的索引时,数组有重复数。当你这样做时,你可以说至少存在一个背叛和终止。这种改进使得算法在最坏的情况下具有O(n^2)
时间复杂度(没有重复)。
答案 1 :(得分:0)
如果您不关心空间,请使用hashmap来执行此操作。时间复杂度为O(n)。 n是列表的大小