【发布时间】:2016-01-11 22:43:08
【问题描述】:
我自己编了一个面试式的问题,并对我的解决方案的大 O 提出了一个问题。我将在下面说明问题和我的解决方案,但首先让我说明显的解决方案涉及嵌套循环并且是 O(n2)。我相信我找到了一个 O(n) 解决方案,但后来我意识到它不仅取决于输入的大小,还取决于输入的最大值。看来我的 O(n) 运行时间只是技术性的,它可以轻松运行在 O(n2) 时间或者在现实生活中更糟。
问题是: 对于给定正整数数组中的每一项,打印数组中所有其他项的倍数。
示例输入:
[2 9 6 8 3]
示例输出:
2: 6 8
9:
6:
8:
3: 9 6
我的解决方案(在 C# 中):
private static void PrintAllDivisibleBy(int[] arr)
{
Dictionary<int, bool> dic = new Dictionary<int, bool>();
if (arr == null || arr.Length < 2)
return;
int max = arr[0];
for(int i=0; i<arr.Length; i++)
{
if (arr[i] > max)
max = arr[i];
dic[arr[i]] = true;
}
for(int i=0; i<arr.Length; i++)
{
Console.Write("{0}: ", arr[i]);
int multiplier = 2;
while(true)
{
int product = multiplier * arr[i];
if (dic.ContainsKey(product))
Console.Write("{0} ", product);
if (product >= max)
break;
multiplier++;
}
Console.WriteLine();
}
}
因此,如果数组项中有 2 个是 1 和 n,其中 n 是数组长度,则内部 while 循环将运行 n 次,这相当于O(n2)。但是,由于性能取决于输入值的大小,而不是列表的长度,所以它是 O(n),对吧?
您认为这是一个真正的 O(n) 解决方案吗?由于技术原因,它只是 O(n),但在现实生活中速度较慢吗?
【问题讨论】:
-
我看不出有任何击败
O(n^2)的方法,而且排序似乎也没有帮助。