Một trong những cách thực hiện việc tìm kiếm này là xây dựng một cây nhị phân tìm kiếm với n từ tiếng Anh như là các khóa và n từ tiếng Việt tương ứng là dữ liệu... Có rất nhiều cách
Trang 1MỘT SỐ BÀI
TOÁN QUY HOẠCH
Trang 2I BÀI TOÁN “CÂY TÌM
KiẾM NHỊ PHÂN TỐI ƯU”
1. Đặt vấn đề:
Giả sử cần phải dịch một đoạn văn bản gồm n từ
từ tiếng Anh sang tiếng Việt Với mỗi từ tiếng Anh trong văn bản, ta cần tìm một từ tiếng Việt tương ứng
Một trong những cách thực hiện việc tìm kiếm
này là xây dựng một cây nhị phân tìm kiếm với n từ tiếng Anh như là các khóa và n từ tiếng Việt tương ứng là dữ liệu.
Trang 3 Có rất nhiều cách sắp xếp các khóa trên cây để tạo nên một cấu trúc cây và với mỗi cây sẽ cần một chi phí khác nhau khi tìm kiếm các khóa trên cây.
Chi phí tìm kiếm càng cao khi nút cần tìm càng nằm
xa gốc (cây càng nhiều nút, độ sâu nút cần tìm càng lớn) Đặc biệt, khi từ khóa cần tìm không có trong cây, chi phí tìm kiếm sẽ rất lớn
? Bằng cách nào để có thể tổ chức một cây tìm kiếm nhị phân mà chi phí tìm kiếm trên cây là thấp nhất
Trang 4Ví dụ: Xét hai cây nhị phân
Trang 52 Phát biểu bài toán:
Cho một tập K = {k1, k2, …, kn} là n khóa khác nhau đã được sắp, trong đó k1<k2<…<kn, và ta cần xây dựng một cây nhị phân tìm kiếm từ các khóa này sao cho chi phí tìm kiếm là thấp nhất
Trang 6Các thuật ngữ, từ khóa, khái niệm sử dụng trong
giải thuật.
Mỗi khóa k i có xác suất tìm kiếm là p i
Có những trường hợp từ một khóa ki nào đó không có trong cây, ta sử dụng các khóa giả d i để đón nhận các giá trị này, với cây có n khóa k 1 , k 2 , …, k n thì sẽ có n+1 khóa giả d 0 , d 1 , …, d n Trong đó:
d 0 tương ứng cho tất cả các giá trị nhỏ hơn k 1 ,
d n tương ứng cho tất cả các giá trị lớn hơn k n ,
và với i = 1, …, n-1 thì khóa giả d i tương ứng cho giá trị nằm giữa k i và k i+1
Với mỗi khóa giả d i , chúng ta có một xác suất tìm kiếm
n i
Trang 7 Công thức tính chi phí cho một cây tìm kiếm nhị
phân như sau:
n i
i i
T i
i
T k p depth d q depth
seach
E
) 1 ) ( (
).
1 ) ( (
T]
in cost [
n i
i i T i
( 1
Trang 8Trong ví dụ đã cho ở cây (a), chúng ta có thể tính chi phí tìm kiếm tất cả các nút như sau:
Node depth probability contribution
Trang 9 Với ví dụ đã cho, ta tính được cây (a) có chi phí tìm kiếm là 2.80, cây (b) có chi phí tìm
kiếm là 2.75.
Ta sẽ xây dựng một giải thuật để xây dựng
một cây nhị phân tìm kiếm tối ưu với chi phí tìm kiếm là thấp nhất từ một tập n khóa cho trước, bằng cách xây dựng dần các cây con từ khóa ki đến khóa kj Sử dụng phương pháp
Quy hoạch động để giải quyết bài toán.
Trang 104 Các bước giải bài toán:
Bước 1: Mô tả cấu trúc cây nhị phân tìm kiếm với các khóa ki, …, kj
Chọn một trong các khóa này là kr (i ≤ r ≤ j), sẽ là gốc
của cây con tối ưu chứa các khóa đã cho Các cây con bên trái của gốc kr sẽ chứa các khóa ki, …, kr-1 (và các khóa giả di-1, …, dr-1), và cây con bên phải chứa các
khóa kr+1, …, kj (và các khóa giả dr, …, dj) Cũng như vậy ta kiểm tra tất cả các gốc kr, (i ≤ r ≤ j)
Nếu khóa ki có cây con trái rỗng thì cây con trái sẽ bao
gồm một nút lá là di-1, nếu khóa kj có cây con phải rỗng thì cây con phải sẽ bao gồm một nút lá là khóa giả dj.
Trang 11 Các trường hợp xảy ra:
Khi j = i – 1 Khi đó ta có khóa giả di-1
- Chi phí tìm kiếm là e[i,i-1] = qi-1;
- Tổng xác suất: w(i,i-1) = qi-1 với 1 ≤ i ≤ n+1
Trang 12 Khi j ≥ i, chúng ta cần chọn một gốc k r từ các khóa k i , …,
các khóa k i , …, k r-1 là cây con trái của k r và cây nhị phân tìm kiếm tối ưu với các khóa k r+1 , …, k j là cây con phải của k r Khi đó ta có:
=> w[i,j] = w[i,j-1] + p j + q j
Và:
e[i,j] = p r + (e[i,r-1] + w(i,r-1)) + (e[r+1,j] + w(r+1,j))
=> e[i,j] = e[i,r-1] + e[r+1,j] + w(i,j)
i l
p j
i
w
1
) , (
Trang 13 Từ đó, ta có công thức đệ qui như sau:
, 1 [
] 1 ,
[ { min ]
, [i j e i r q e r1 j w i j
e
j r i
i Nếu j = i –
1, Nếu i ≤ j
i
q p
j i w
q j
i
w
) 1 ,
(
) , ( 1 Nếu j = i – 1,
Nếu i ≤ j
Trang 14Bước 3: Tính toán chi phí tìm kiếm của cây tìm kiếm
nhị phân tối ưu:
(Lập bảng)
Ở bước này, ta sử dụng thêm bảng:
Root[i,j]: để lưu giữ các chỉ số r của khóa kr được chọn làm gốc của các cây con chứa các khóa ki, …,
kj
Trang 16Ví dụ: Xét hai cây nhị phân
tìm kiếm
xác suất tìm kiếm các khóa và khóa giả là:
Trang 17 Bảng e thể hiện chi phí của các cây con.
Từ bảng root, ta vẽ được cây tìm kiếm nhị phân tối ưu
Trang 18 Để vẽ cây tìm kiếm nhị phân tối ưu chứa các khóa từ ki đến kj, dựa vào bảng root ta tìm
được gốc của cây, theo luật của cây nhị phân tìm kiếm ta hoàn toàn vẽ được cây.
Cây thu được từ bảng root, với chi phí tìm
Trang 19Bài toán xâu trong chung
cực đại
K/n Xâu trong: S là xâu trong của T nếu S nhận được
bằng cách xoá đi một số ký tự nào đó Ví dụ:
‘ABC’ là xâu trong của ‘GAHEBOOC’
Bài toán: Cho 2 xâu T1, T2 Tìm một xâu S là xâu
trong chung của T1 và T2 có độ dài cực đại (gọi là
Xâu con chung dài nhất).
Ví dụ: T1=‘ABCDAE’ và T2=‘XYACADK’ có xâu
‘ACD’ là xâu trong chung với độ dài cực đại.(độ
dài 3).
Trang 20 Tư tưởng chung của thuật toán là:
Để tìm ra một xâu con chung dài nhất (LCS) của
X=x1x2…xm và Y = y1y2…yn Ta xét:
- Nếu xm=yn, chúng ta phải tìm ra một xâu con chung dài nhất của Xm-1 và Yn-1 Thêm xm=yn vào LCS trên ta sẽ thu được LCS của X và Y
- Nếu xm ≠ yn thì chúng ta phải giải quyết hai vấn đề:
n-1
Trang 21 Dựa trên thuật toán đó, ta gọi c[i,j] là độ dài xâu con chung dài nhất của X và Y tính từ 1 đến x[i] và 1 đến y[j].
Tính c[i,j]:
Nếu x[i] = y[j] thì c[i,j] = c[i-1,j-1] + 1
Ngược lại: c[i,j] = max{c[i-1,j], c[i,j-1]}
Trang 22 Phân tích bài toán: Xây dựng hàm:
Function LCS_Length(x,y:string):word;
Giải pháp đệ quy:
Lập bảng:
Sử dụng mảng 2 chiều c (array[1 max,1 max] of word) để tính: c [i,j] =
Cụ thể:
For i =1 to m do
For j =1 to n do
If x[i] = y[j] then c[i,j] = c[i-1,j-1] + 1
Else if c[i-1,j]>=c[i,j-1] then c[i,j] = c[i-1,j]
Else c[i,j] = c[i,j-1];
Phương pháp Quy hoạch động
Trang 23Tổng hợp kết quả
Max:=c[length(x),lenghth(y)];
S:=‘ ’;
While (max>0) and (i>0) and (j>0) do
Else if max=c[i,j-1] then j:=j-1
Else Begin
S:=S+x[i];
i:=i-1; j:=j-1;
End;
Trang 24Bài toán in đoạn văn bản
Cho 1 đoạn văn bản gồm n từ có độ dài lần lược là L1, L2, , Ln
được đo lường bởi các kí tự Chúng ta muốn in đoạn văn bản này trên 1 số dòng với độ dài lớn nhất của mỗi dòng là
M=max(L i ) i=1 n Nếu trên 1 dòng chứa các từ từ i đến j
(i<j) thì chúng ta đặt chính xác 1 khoảng trống giữa các từ
và khoảng trống hao phí cuối dòng là M-j+i-T(T=tong
Trang 25 Ci-1 + M-L i nếu in từ i trên 1 dòng mới
C k-1 + M – i+k – Tong (L i k ) Nếu in các từ từ k đến ichan trên cùng 1 dòng
Chọn Min từ 2 trường hợp trên
Trang 26 while (min-l[k]-1>=0) and (k>0) do
Trang 27Tổng hợp kết quả