数组是否具有唯一元素?

时间:2011-02-20 16:58:30

标签: arrays algorithm performance

我正在寻找最有效的算法来检查数组中是否有唯一的元素。结果不一定是唯一元素,因此只是真或假。我知道我可以使用哈希表或某些东西达到O(n)效率,但我仍然在寻找一种在空间方面更有效的结果。

e-数组未排序,包含整数。

4 个答案:

答案 0 :(得分:1)

如果可能值的数量很小并且事先已知,则可以使用位数组(在时间上为O(n),在空间中为O(n),并且比哈希表需要更少的空间)

如果可能值的数量很大,并且您需要这是确定性的,那么您可以使用哈希表(如果您具有良好的哈希函数,则为O(n),如果您不需要增加哈希表)或对列表进行排序(即O(n * lg(n)进行排序,加上O(n)以搜索第一个唯一元素)

如果可能值的数量很大,则不需要确定性,如果要查看集合中是否有特定元素,也可以使用Bloom Filter。布隆过滤器比哈希映射更节省空间,但存在误报的可能性(数据结构认为元素在集合中不存在时)

答案 1 :(得分:0)

我不确定O(n)但是用O(n ^ 2)你可以拿一个元素并保持与其他元素xor'ing

答案 2 :(得分:0)

php中有函数array_keys()

array array_keys ( array $input [, mixed $search_value [, bool $strict = false ]] )

如果设置了可选参数$ search_value,则该函数将仅返回找到的值的键。如果只返回数组键,那么该值必须是唯一的。

我想我的答案有点针对(语言),我不知道这个函数的大O.你必须自己测试一下。 :)

[更新]:我发现this article描述了array_keys()是O(n)。

答案 3 :(得分:0)

有三种不同的方法,具有不同的空间和时间复杂性:

1)两个循环:时间O(n ^ 2),空间O(1)。

2a)排序然后线性检查:一般情况下的时间O(nlogn),空格:O(1)。 2b)非比较排序(基数,计数,......)然后检查:时间O(n),空间O(n)

3)用于存储成员资格的哈希表或数组:时间O(n),空格O(n)。

所以基本上,你应该选择2a(空间限制)或3。