我正在寻找最有效的算法来检查数组中是否有唯一的元素。结果不一定是唯一元素,因此只是真或假。我知道我可以使用哈希表或某些东西达到O(n)效率,但我仍然在寻找一种在空间方面更有效的结果。
e-数组未排序,包含整数。
答案 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。