查找数组中所有元素是否不同的最快方法?

时间:2013-11-24 20:57:34

标签: arrays algorithm

我正在寻找一种更快的方法来查找元素数组是否仅包含不同的元素。最糟糕的事情是采用每个元素并将其与数组中的每个其他元素进行比较。接下来最好的方法是对列表进行排序,然后进行比较,但仍然没有提高这一点。还有其他办法吗?

4 个答案:

答案 0 :(得分:23)

<强>蛮力:

暴力(用每个其他元素检查每个元素)需要O(n2)

<强>分拣:

排序需要O(n log n),这通常被认为是相当不错的运行时间。

排序具有高于以下(哈希表)方法的优势,因为它可以就地完成(O(1)额外空间),其中 - 如下所示需要O(n)额外空间。

哈希表:

另一种方法是使用hash table

对于每个项目:

  • 检查哈希表中是否存在该项目(如果存在,所有项目都不相同)和
  • 将该项插入哈希表

由于插入和包含查询在哈希表上的预期O(1)中运行,因此预计总运行时间为O(n),并且如上所述,O(n)额外空间。

位数组:

另一种选择,如果元素在某个给定范围内都是整数,那么bit array的大小应等于整数范围。

与哈希表方法的操作类似,对于每个元素,您将检查是否设置了适用位,然后进行设置。

这需要O(m + n)时间和O(m)额外空间,其中m是整数范围,n是数组的大小(除非您考虑将数组分配给是免费的,在这种情况下它只需要O(n)时间。

答案 1 :(得分:1)

创建一个红色和黑色树,其中元素作为键和出现次数是值。然后,您可以导航树。时间和空间复杂度为O(n),其中n是元素的数量。使用红色和黑色树的主要好处包括一致的性能和简单的内存管理 - 分布式环境的最佳选择。观点欢迎。

答案 2 :(得分:0)

替代解决方案(仅从理论角度来看有趣):

我认为您可以调整Quickselect算法。简而言之,该算法以与快速排序相同的方式运行,但它只根据一些选定的枢轴(分别少于和多于枢轴)将数组分成两组,因此省略排序。它的平均案例表现为O(n)。

我的想法是在每一步中寻找与所选枢轴相等的元素。这样,只要有两个以上的元素,我们就会比较每个元素的数据。如果我们找到了重复,我们就有了答案。否则我们将问题分成两个相似的问题,但是尺寸较小并在其上运行算法。

免责声明:Quickselect的最差情况是O(n ^ 2)。因此,使用哈希表更有效 time

然而,由于Quickselect是in-place algorithm,它只需要恒定的内存开销,而不是哈希表的线性附加内存(现在并不重要)。

答案 3 :(得分:0)

这是O(1)空间复杂度方法。我们的想法是,我们将在数组的开头保留唯一元素的数组。 由于要避免占用空间,因此时间复杂度为O(n * log(n)),因此我们可以使用python的就地排序方法进行列表。 感觉像C,但对我有用

    a.sort()
    i = 0
    k = 0
    while i < len(a) - 1:
        if a[i] == a[i+1]:
            j = i
            while j < len(a) - 1 and a[j] == a[j+1]:
                j += 1
            if j < len(a) - 1:
                a[k+1] = a[j+1]
                i = j + 1
                k += 1
            else:
                pass
        else:
            i += 1
            k += 1
    a = a[:k+1]