Giả sử chúng ta có hai mảng; chúng ta phải tìm dãy bitonic dài nhất có thể để phần tăng dần phải từ mảng đầu tiên và phải là dãy con của mảng đầu tiên. tương tự giảm một phần của phải từ mảng thứ hai và một dãy con của mảng thứ hai.
Vì vậy, nếu đầu vào là A =[2, 6, 3, 5, 4, 6], B =[9, 7, 5, 8, 4, 3], thì đầu ra sẽ là [2, 3, 4 , 6, 9, 7, 5, 4, 3]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Định nghĩa một hàm index_ceiling (). Thao tác này sẽ sử dụng phím arr, T, left, right, key
-
trong khi phải - trái> 1, thực hiện
-
giữa:=left + (right - left) / 2;
-
if arr [T [mid]]> =key, then
-
right:=mid
-
-
nếu không,
-
left:=mid
-
-
-
trở lại bên phải
-
Định nghĩa một hàm long_inc_seq (). Điều này sẽ mất A
-
n:=kích thước của A
-
tails_idx:=một mảng có kích thước n, điền bằng 0
-
pres_idx:=một mảng có kích thước n, điền bằng -1
-
chiều dài:=1
-
đối với tôi trong phạm vi từ 1 đến n, hãy thực hiện
-
nếu A [i]
-
tails_idx [0]:=i
-
-
ngược lại khi A [i]> A [tails_idx [length - 1]] thì
-
pres_idx [i]:=tails_idx [length - 1]
-
tails_idx [length]:=i
-
length:=length + 1
-
-
nếu không,
-
pos:=index_ceiling (A, tails_idx, -1, length - 1, A [i])
-
pres_idx [i]:=tails_idx [pos - 1]
-
tails_idx [pos]:=i
-
-
-
i:=tails_idx [length - 1]
-
while i> =0, do
-
chèn A [i] vào cuối câu trả lời
-
i:=pres_idx [i]
-
-
Từ phương thức chính, thực hiện như sau -
-
n1:=kích thước của A, n2:=kích thước của B
-
long_inc_seq (A)
-
answer:=câu trả lời ngược
-
B:=đảo ngược B
-
long_inc_seq (B)
-
trả lại câu trả lời
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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)
Đầu vào
[2, 6, 3, 5, 4, 6], [9, 7, 5, 8, 4, 3]
Đầu ra
[2, 3, 4, 6, 9, 7, 5, 4, 3]