使用优先级队列的出租车算法

时间:2015-03-26 00:37:34

标签: algorithm priority-queue

出租车编号是一个数字,可以表示为两个立方体的总和,以两种不同的方式表示,其中整数a, b, c, d不相等。以下代码使用优先级队列来生成此类数字。

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) )

其中一个数字是:1729 = 12^3 + 1^3 = 10^3 + 9^3。 如果在while循环的每次迭代中,优先级队列中唯一的(顶部即.min)元素被删除,并且prev等于迭代次数,那么如何使prev = [1729, 12, 1]current = [1729, 10, 9]成为可能?之前,所以对于这个例子,它将是[1512, 10, 8](因为while循环只修改第1和第3个元素)。

1 个答案:

答案 0 :(得分:1)

答案是,当您将元素插入优先级队列时,它自然会降低到第一个元素指定的级别。因此,您可以按照您认为的顺序插入元素,然后按总和将它们拉出来。只要你插入的东西的总和大于你拔出的东西的总和,你就会以正确的顺序得到所有东西,即使你没有开始它的所有内容。