以下算法的复杂性来生成TaxiCab数字?

时间:2014-11-11 02:04:45

标签: algorithm computer-science time-complexity

以下是使用优先级队列(pq)生成出租车编号的算法。 Vector是一种任意数据类型,允许存储两个数字及其立方数。对于那些不知道的人(虽然你真的不需要知道),出租车编号是一个整数,可以用两种不同的方式表示为两个整数立方体的总和:a^3+b^3 = c^3+d^3。一个例子是1729 = 12^3 + 1^3 = 10^3 + 9^3

for i = 1..n
 pq.insert( Vector(i^3+i^3,i,i) )

prev = Vector(0, 0, 0)

while not pq.empty()
 curr = pq.deleteMin()
 if prev[0] == curr[0]
      print curr[0] is a Taxicab number that can be expressed as
      prev[1]^3 + prev[2]^3 and curr[1]^3 + curr[2]^3
 prev = curr
 if curr[2] < N
     j = curr[2] + 1
     pq.insert( Vector(curr[1]^3 + j^3, curr[1], j) )

我知道在优先级队列中插入一个项目是O(log n),但我不确定这与空间和时间复杂性有何关系。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这绝对不比O(N^2 log N)差,尽管可能会给它更严格的界限。

这段代码:

if curr[2] < N
    j = curr[2] + 1
    pq.insert( Vector(curr[1]^3 + j^3, curr[1], j) )

使代码大致相同,但效率更高:

possibles = empty list
for i = 1..n
   for j in i+1..n
       possibles.append( Vector(i^3 + j^3, i, j) )
sort(possible_numbers)

for i = 1..n
    prev = possibles[i]
    curr = possibles[i + 1]
    if prev[0] == curr[0]
        print curr[0] is a Taxicab number that can be expressed as
        prev[1]^3 + prev[2]^3 and curr[1]^3 + curr[2]^3

可能列表O(N^2)的大小,对其进行排序O(N^2 log(N))。第二个循环是O(N),它生成代码O(N^2 log N)