【问题标题】:Complexity of the following algorithm to generate TaxiCab numbers?以下算法生成出租车号码的复杂性?
【发布时间】:2014-11-11 02:04:45
【问题描述】:

以下是使用优先队列生成出租车号码的算法 (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),但我不确定这与空间和时间复杂度有何关系。有人可以帮忙吗?

【问题讨论】:

    标签: algorithm computer-science time-complexity


    【解决方案1】:

    它绝对不会比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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多