在 Python 中查詢最長雙調序列,其中遞增和遞減部分來自兩個不同的陣列


假設我們有兩個陣列;我們必須找到最長的可能的雙調序列,以便遞增部分應該來自第一個陣列並且應該是第一個陣列的子序列。類似地,遞減部分必須來自第二個陣列並且是第二個陣列的子序列。

因此,如果輸入類似於 A = [2, 6, 3, 5, 4, 6],B = [9, 7, 5, 8, 4, 3],則輸出將為 [2, 3, 4, 6, 9, 7, 5, 4, 3]

為了解決這個問題,我們將遵循以下步驟 -

  • 定義一個函式 index_ceiling()。這將接收 arr、T、left、right、key

  • 當 right - left > 1 時,執行

    • mid := left +(right - left) / 2;

    • 如果 arr[T[mid]] >= key,則

      • right := mid

    • 否則,

      • left := mid

  • 返回 right

  • 定義一個函式 long_inc_seq()。這將接收 A

  • n := A 的大小

  • tails_idx := 一個大小為 n 的陣列,填充為 0

  • prev_idx := 一個大小為 n 的陣列,填充為 -1

  • length := 1

  • 對於 i 的範圍從 1 到 n,執行

    • 如果 A[i] < A[tails_idx[0]],則

      • tails_idx[0] := i

    • 否則當 A[i] > A[tails_idx[length - 1]] 時,則

      • prev_idx[i] := tails_idx[length - 1]

      • tails_idx[length] := i

      • length := length + 1

    • 否則,

      • pos := index_ceiling(A, tails_idx, -1, length - 1, A[i])

      • prev_idx[i] := tails_idx[pos - 1]

      • tails_idx[pos] := i

  • i := tails_idx[length - 1]

  • 當 i >= 0 時,執行

    • 將 A[i] 插入到答案的末尾

    • i := prev_idx[i]

  • 從主方法中,執行以下操作 -

  • n1 := A 的大小,n2 := B 的大小

  • long_inc_seq(A)

  • answer := 反轉答案

  • B := 反轉 B

  • long_inc_seq(B)

  • 返回 answer

示例

讓我們看看以下實現以獲得更好的理解 -

answer = []
def index_ceiling(arr,T, left,right, key):
   while (right - left > 1):
      mid = left + (right - left) // 2;
      if (arr[T[mid]] >= key):
         right = mid
      else:
         left = mid
   return right
def long_inc_seq(A):
   n = len(A)
   tails_idx = [0]*(n)
   prev_idx = [-1]*(n)
   length = 1
   for i in range(1, n):
      if (A[i] < A[tails_idx[0]]):
         tails_idx[0] = i
      elif (A[i] > A[tails_idx[length - 1]]):
         prev_idx[i] = tails_idx[length - 1]
         tails_idx[length] = i
         length += 1
      else:
         pos = index_ceiling(A, tails_idx, -1, length - 1, A[i])
         prev_idx[i] = tails_idx[pos - 1]
         tails_idx[pos] = i
   i = tails_idx[length - 1]
   while(i >= 0):
      answer.append(A[i])
      i = prev_idx[i]
def long_bitonic(A,B):
   n1 = len(A)
   n2 = len(B)
   global answer
   long_inc_seq(A)
   answer = answer[::-1]
   B = B[::-1]
   long_inc_seq(B)
A = [2, 6, 3, 5, 4, 6]
B = [9, 7, 5, 8, 4, 3]
long_bitonic(A,B)
print(answer)

輸入

[2, 6, 3, 5, 4, 6], [9, 7, 5, 8, 4, 3]

輸出

[2, 3, 4, 6, 9, 7, 5, 4, 3]

更新於: 2020-08-25

91 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.