计算不同的数组条目[没有添加内存也没有数组更改]

时间:2014-05-17 15:20:51

标签: arrays algorithm

任务是计算给定数组的唯一编号。我在SO上看到了许多类似的问题,但在这里我们有其他要求,但在其他问题中没有说明:

  • 允许的额外内存量为O(1)
  • 对数组的更改是 禁止

我能够编写二次算法,这与给定的约束一致。但我一直在想,可能在这样的问题上可以做得更好吗?谢谢你的时间。
使用O(n ^ 2)

的算法
def count(a):
    unique = len(a)
    ind = 0
    while ind < len(a):
        x = a[ind]
        i = ind+1
        while i < len(a):
            if a[i] == x:
                unique -= 1
                break
            i += 1
        ind += 1

    print("Total uniques: ", unique)

2 个答案:

答案 0 :(得分:3)

这与破解编码面试的第1章(数组和字符串)中的后续问题非常相似:

  

实施算法以确定字符串是否具有唯一性   字符。如果您不能使用其他数据结构怎么办?

答案(对于后续问题)是,如果你不能假设关于阵列的任何事情(即,它没有排序,你不知道它的大小等),那么没有比你展示的算法更好的算法。

话虽这么说,你可以考虑稍微放松约束,使其更有趣。例如,如果数组大小有上限,则可以使用位向量来跟踪在遍历数组之前读过的值,尽管这不是严格意义上的O(1)解决方案当涉及内存使用时(有人可能会争辩说,通过了解最大数组大小,内存使用量是恒定的,因此O(1),但这有点作弊)。类似地,如果对数组进行了排序,您也可以在O(n)中通过一次遍历每个元素来解决它,并检查它的邻居是否是不同的数字。

答案 1 :(得分:0)

因为给定(排序等)数组中没有底层结构,所以你不得不强制数组中的每个值......

我相信有一种更复杂的方法可行。它需要保持您的唯一数字数组排序。这意味着插入数组需要更多时间,但可以更快地查找值。您应该能够通过直接在数组中间查看值并检查它是大于还是更小来在logn时间插入数组。然后,您将阵列的一半消除为有效的插入位置并重复。您将使用类似的方法来查找数组中的值。唯一的问题是它需要的内存空间比我相信你分配的多(1)。

话虽如此,我认为鉴于任务的限制将算法限制为O(n ^ 2)。