有效地检查阵列是否有重复

时间:2016-11-21 19:23:23

标签: c algorithm

有一个包含1000个元素的数组,所有元素通常分布在1 - 10000000范围内。如何比O(n^2)更快地检查重复项?

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}个元素,1O(n^2)实际上比1,000^2 = 1,000,000更快我提出的解决方案。

EDIT2:正如Eugene Sh。指出,实际上没有必要迭代aditional数组,因为你可以立即说,当你增加一个已经存在1的索引时,数组有重复数。当你这样做时,你可以说至少存在一个背叛和终止。这种改进使得算法在最坏的情况下具有O(n^2)时间复杂度(没有重复)。

答案 1 :(得分:0)

如果您不关心空间,请使用hashmap来执行此操作。时间复杂度为O(n)。 n是列表的大小