簡體   English   中英

使用優先級隊列的出租車算法

[英]Taxicab algorithm using 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循環的每次迭代中,優先級隊列中唯一(最高即最小)的元素被刪除,並且prev = [1729, 12, 1]current = [1729, 10, 9] prev = [1729, 12, 1] ,怎么可能? prev等於之前迭代的數字,因此對於此示例,該數字為[1512, 10, 8] (因為while循環僅修改了第一個和第三個元素)。

答案是,當您將一個元素插入優先級隊列時,它自然會降至其第一個元素所指定的級別。 因此,您可以按照想到的順序插入元素,然后按總和將它們拉出。 只要您隨后插入的內容之和大於您拉出的內容,即使您沒有從其中開始的一切開始,也可以按正確的順序獲取所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM