我尝试了一个codility示例问题,在python中回答。我没有得到100分,因为它未能及时完成大数据集。
以下是问题:
给出了由N个整数组成的非空零索引数组A. 阵列A的第一个覆盖前缀是这样的最小整数P. 0≤P<0 N和类似A中出现的每个值也是如此 发生在序列A [0],A [1],...,A [P]。
中
例如,以下5元素数组A的第一个覆盖前缀:
A[0] = 2 A[1] = 2 A[2] = 1
A[3] = 0 A[4] = 1
为3,因为序列[ A[0], A[1], A[2], A[3] ]
等于[2, 2, 1, 0]
,包含阵列A中出现的所有值。
我的回答是:
def ps ( A ):
N = len(A);
if N == 0: return -1
bit = {}
for i in range(N):
if not A[i] in bit.keys():
bit[A[i]] = 1
P = i
return P
结果:
它没有给我这个问题100,因为它认为我的算法是O(N ** 3),并且测试用例失败
random_n_log_100000
random test 100 000 elements and n/log_2 n values. 10.025 s. TIMEOUT ERROR
running time: >10.02 sec., time limit: 9.82 sec.
random_n_10000
random test 10 000 elements and values. 1.744 s. TIMEOUT ERROR
running time: >1.74 sec., time limit: 1.10 sec.
random_n_100000
random test 100 000 elements and values. 10.025 s. TIMEOUT ERROR
running time: >10.02 sec., time limit: 9.94 sec.
分析:
起初我认为我的代码是O(N),因为我假设代码的关键部分,bit.keys()中的A [i]具有恒定的运行时,即O(1)。但也许在大数据集上,哈希函数会产生很多冲突,因此运行时不再是O(1)?
O(N ** 3)是否意味着O(N ^ 3)?我有这个问题,因为我已经看到其他帖子,其中codility报告N平方算法为O(N ^ 2)。所以我想他们的报告会一致吗?
如果他们真的认为我的答案是O(N ^ 3),那么它是否合理,因为我的代码只超过了他们的时间限制不到1秒?在这里,我假设他们的时间限制是O(N)算法,因为这是他们在问题中要求的。如果是这种情况,我就不明白为什么O(N ^ 3)算法只是> 1秒慢?
答案 0 :(得分:9)
bit.keys()
是一个列表。测试元素是否在列表中是O(n)。
另一方面,测试元素是否在dict中是O(1)。
所以改变
if not A[i] in bit.keys():
到
if not A[i] in bit:
通过此更改,我相信您的算法是O(n)。
(如果没有更改,我相信你的算法是O(n ^ 2),不 O(n ^ 3)。)
答案 1 :(得分:0)
Tried C# code. dont know if it will work for higher values
class Program
{
static void Main(string[] args)
{
int[] A = {2,1,1,0,3};
int i ,n=A.Length;
for (i= 0; i<n;i++)
{
if (A.Contains(i))
{
//
}
else
{
int p = i;
}
}
Console.WriteLine("p not found");
}
}