这个过程有不同的算法,我的空间复杂度是多少

时间:2017-01-17 21:28:40

标签: arrays algorithm

我有一个方法接受一个未排列的int数组并返回一个布尔值。 我的目标是找出是否存在唯一的数字(意味着它不会在整个数组中重复它) 例如 {1,6,2,3,3,2,1} 该方法将返回true。(因为6是唯一的)

我解决这个问题的方法是创建两个额外的数组,其大小与数组的最大值和最小值之间的差值有关。 然后,遍历数组,对于每个数字,我们将增加相应的数组位置,如果它的正数将转到第一个数组,负数到第二个。

我声称我的解决方案的空间复杂性是O(1)我是对的吗? (我只讲最坏的情况)

另外你能告诉我一个不同的方法来解决这个问题吗? 我不允许使用地图,哈希,列表或基本上不是数组的任何其他数据结构。

2 个答案:

答案 0 :(得分:4)

您的算法使用无界空间。 (对于包含至少两个元素的任何输入数组,辅助数组可以任意大。)

我的建议是对数组进行排序,找到排序数组中与前一个和下一个元素不同的第一个元素。 (可以在O(n)空间和O(n * log(n))时间内完成排序。)

答案 1 :(得分:0)

您现在正在做的是数组a[n]的直方图(带有排序),它与值m = max(a[i])-min(a[i])的动态范围有关。如果你不知道它,你需要计算它需要O(n)时间(找到min,max)。直方图本身为O(n)时间和O(m)空间用于存储桶排序(不确定为什么需要2个辅助数组)。还有其他选择:

  1. O(1)O(n)空格O(n.log(n))时间

    您可以对数组进行排序,然后找到 AlexP 建议的非重复值。如果您可以更改阵列,则可以就地排序,否则您需要额外的阵列。

  2. O(1)空格O(n^2)时间

    测试数组中的每个数字与其他所有数字,如果找不到匹配项......

  3. 我们通常选择当时需要的东西,有时我们需要更低的空间,其他时间复杂度。

    对于聪明的方法,您需要利用类似数据集的预定属性。除了它有整数值(例如它是否具有高斯分布)之外,你对它有一些了解吗?

    另一个例子是,如果数据具有少量不同的值(相对于m,因此您获得了许多重复值),那么动态值列表优于桶排序。这是O(n.log(n))时间,但m空间复杂度中的O(m)会低得多,因为它代表不同的值而不是动态范围。