我正在寻找最高效的算法来检查数组中是否有唯一元素。结果不必是唯一元素,只需相应地返回 true 或 false。我知道可以使用哈希表或类似方法达到 O(n) 的效率,但我仍在寻找更加高效的空间利用率的结果。
例如- 数组无序,并且包含整数。
我正在寻找最高效的算法来检查数组中是否有唯一元素。结果不必是唯一元素,只需相应地返回 true 或 false。我知道可以使用哈希表或类似方法达到 O(n) 的效率,但我仍在寻找更加高效的空间利用率的结果。
例如- 数组无序,并且包含整数。
如果可能的值的数量很小并且事先已知,你可以使用位数组(时间复杂度为O(n),空间复杂度为O(n),比哈希表所需的空间更少)。
如果可能的值的数量很大,并且您需要这个过程是确定性的,那么您可以使用哈希表(如果您有一个良好的哈希函数并且不需要扩展哈希表,则时间复杂度为O(n)),或者就地排序列表(排序的时间复杂度为O(n * lg(n)),加上搜索第一个唯一元素的O(n))
如果可能的值的数量很大,您不需要这个过程是确定性的,并且如果要查看特定元素是否在集合中,您也可以使用Bloom Filter。 Bloom Filter比哈希映射更节省空间,但存在误判的概率(数据结构认为元素在集合中,但实际上不在)
我不确定O(n),但使用O(n^2)可以取一个元素并将其与其他元素异或。
在 PHP 中有一个名为 array_keys() 的函数。
array array_keys ( array $input [, mixed $search_value [, bool $strict = false ]] )
有三种不同的方法,具有不同的空间和时间复杂度:
1)两个循环:时间O(n^2),空间O(1)。
2a)排序然后线性检查:一般情况下时间复杂度为O(nlogn),空间复杂度为O(1)。 2b)非比较排序(基数、计数等)然后检查:时间O(n),空间O(n)
3)哈希表或数组存储成员资格:时间O(n),空间O(n)。
因此,基本上你应该选择2a(空间限制)或3。