Tải bản đầy đủ (.docx) (14 trang)

BÀI TẬP LỚN PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN Thuật toán sắp xếp Bucket Sort

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (464.74 KB, 14 trang )

I.
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
  
BÀI TẬP LỚN
PHÂN TÍCH VÀ THIẾT KẾ THUẬT TOÁN
Giáo viên hướng dẫn: TS. Nguyễn Khanh Văn
Học viên thực hiện : Trương Thảo Nguyên CB120098
Vũ Đình Phú CB120104
Nguyễn Thị Thúy Liên CB120046
Lớp: Công nghệ thông tin 2 (KT)
Chuyên ngành: Công nghệ thông tin (KT)
Đề bài: Đề số 01
HÀ NỘI 11 – 2012
Mục lục
1. Bài 1: Sách MIT, Problem 5.2 Câu a,b,c,d
1.1. Phát biểu bài toán
Cho một mảng A chưa sắp xếp gồm n phần tử, tìm phần tử có giá trị x trong mảng A.
Cân nhắc chiến lược sử dụng ngẫu nhiên sau: lấy một số ngẫu nhiên i trong tập chỉ số của
A (1 ≤ i ≤ length of A). Nếu A[i] = x thì tìm được x trong mảng A. Nếu không, lặp lại
bước trên cho đến khi tìm được một chỉ số j của mảng A thỏa mãn A[j] = x hoặc đã duyệt
qua mọi phần tử của A.
a. Viết giả code cho thủ tục RANDOM-SEARCH để cài đặt chiến lược trên
b. Giả sử rằng, có đúng một chỉ số i thỏa mãn A[i] = x. Tính kì vọng số lần thử trước
khi tìm được x và thuật toán RANDOM-SEARCH dừng lại
c. Tổng quá hóa lời giải ở câu b, giả sửa rằng có k ≥ 1 chỉ số i mà A[i] = x. Tính kì
vọng số lần thử trước khi tìm được x và thuật toán RANDOM-SEARCH dừng lại.
d. Giả sửa rằng không có chỉ số nào để A[i] = x. Tính kì vọng số lần thử để kiểm tra
qua mọi phần tử của A và thuật toán RANDOM-SEARCH dừng lại.
1.2. Lời giải
a. Giả code của thuật toán RANDOM-SEARCH


RANDOM-SEARCH(A,n)
while IS-CHECK-ALL(A)
i ← RANDOM(1,n)
if A[i] = x
return i
CHECK(A,i)
return notfound
Trong đó, CHECK(A,i) là thủ tục đánh dấu đã kiểm tra phần tử thứ i của mảng A. IS-
CHECK-ALL(A) là thủ tục kiểm tra xem đã duyệt qua hết tất cả các phần tử của A hay
chưa
b. Tính kì vọng của số lần thử nếu như tồn tại đúng một chỉ số i mà A[i] = x
Gọi là n kích thước của mảng A. Vì tồn tại đúng một số x trong mảng A nên tại một lần
thử:
- Xác suất để chọn đúng chỉ số i mà A[i] = x là Pr(A[i] = x) = 1/n
- Xác suất để chọn chỉ số i mà A[i] ≠ x là Pr(A[i] ≠ x) = 1- 1/n
Gọi E
j
là sự kiện thử j lần thì tìm được số x trong mảng A. Vậy ta có E
j
chính là sự kiện
tại j-1 lần thử đầu tiên không thành công lấy được chỉ số i thỏa mãn A[i] = x và thành
công tại lần thứ j
P(E
j
) = (trong đó j ≥ 1)
Hay P(E
j
) = (1-p)
j-1
* p (với p = 1/n)

Vậy kì vọng của số lần thử để tìm được x hoặc thuật toán kết thúc là
E = p)
j-1
* p
Mà p = 1/n Vậy E = n
c. Tính kì vọng của số lần thử nếu như tồn tại k ≥ 1 chỉ số i mà A[i] = x
Từ chứng minh câu b ta vẫn có kết quả ta vẫn có Trong đó p là xác suất để chọn đúng
chỉ số i mà A[i] = x là Pr(A[i] = x).Vậy bài toán quy về việc tính p.
Vì tồn tại k ≥ 1 chỉ số i để A[i] = x nên xác suất để chọn đúng chỉ số i mà A[i] = x là
Pr(A[i] = x) = k/n
Vậy E = 1/(k/n) = n/k
d. Tính kì vọng của số lần thử nếu như không tồn tại chỉ số i mà A[i] = x
Vì trong mảng A không tồn tại phần tử nào có giá trị là x cho nên số lần thử (số vòng lặp)
để thuật toán dừng chính là số lần thử để kiểm tra hết tất cả n phần tử trong mảng A có
chỉ số lần lượt từ 1 đến n. Bài toán này giống với bài toán “thu thập coupon”
Gọi X là số lần thử cho đến khi kiểm tra hết cả n phần tử của mảng A
Gọi X
i
là số lần thử mà khi đó đã kiểm tra được i-1 phần tử của mảng A (cho đến khi
kiểm tra được phân từ thứ i).
Vậy X =
Xác suất để tại một lần thử, kiểm tra phần tử cũ (phần tử đã so sánh giá trị với x trước đó)
khi đã mà đã có i-1 phần tử được kiểm tra là q
i
= (i-1)/n
Xác suất để tại một lần thử, kiểm tra được phần tử mới (phần tử chưa so sánh giá trị với x
trước đó) khi mà đã có i-1 phần tử được kiểm tra là p
i
= 1- q
i

= 1 – (i-1)/n = (n-i+1)/n
Từ đó suy ra E[X
i
] = 1/p
i
= n/(n-i+1)
Lại có E[X] =
(do n-1+1 = n, n-2+1 = n-1, , n-n+1 =1)
+ O(1))
2. Bài 2: Sách MIT, Problem 15-1
2.1. Phát biểu bài toán
Bài toán Bitonic euclidean traveling-salesman problem là bài toán tìm đường đi ngắn
nhất đi qua n điểm, tạo thành vòng khép kín trên mặt phẳng, đi từ điểm xuất phát ban
đầu, di qua n-1 điểm còn lại rồi quay về. Ví dụ, hình vẽ bên dưới chỉ ra 2 cách đi tương
ứng với bài toán 7 điểm. Thông thường với bài toán này thì thuộc dạng NP-complete, và
bình thường lời giải thường có thời gian tính toán lớn hơn dạng đa thức.
Hình 1: Hình vẽ mô phỏng với 7 điểm ở trên: quảng đường ngắn nhất để đi qua n điểm và quay về
điểm xuất phát: a, nếu không dùng Bitonic shortest, thì mất khoảng 24,89. b, nếu dùng thuật toán
shorstest Bitonic thì mất khoảng 25,58.
J. L. Bentley đã gợi ý sữ dụng thuật toán Bitonic. Lúc đó, người du lịch có thể đi bắt đầu
từ bên trái nhất, tuân thủ theo từ trái sang phải tới điểm phải nhất trong thuật toán
Bitonic, sau đó đi ngược lại từ điểm phải nhất quay về vị trí ban đầu. Nếu khi sử dụng
thuật toán Bitonic, thì thời gian tính toán lúc đó sẽ là đa thức, và đánh giá bằng O(n
2
), giả
sử không có điểm nào nằm cùng tọa độ x với nhau.
2.2. Lời giải
a. Thuật toán Bitonic
- Sắp xếp tất cả các thành phố mất O(nlogn) từ thành phố có tọa độ x nhỏ nhất đến cao
nhất.

- Giả sử thành phố V
n
là kề cận với V
i
. Vì chúng ta cần quảng đường ngắn nhất từ V
i

tới V
1
và tới V
n
, sau đó quay lại tới V
i
mà đi qua tất cả các thành phố.
- Định nghĩa t(i,j) , i<j là quảng đường ngắn nhất từ V
i
, đi qua V
1
, và quay lại V
j
. Khi
đó t(i, j) được tính toán như sau:
o t(i, j) = t(i, j-1) + d(v
j
-1, v
j
) if j > i + 2
o t(i, j) = min{ t(k, i) + d(v
k
, v

j
) | if j = i+1 for 1 < k < i – 1
o Trong đó (với d(a,b) là khoảng cách giữa hai thành phố a và b. )
b. Bài toán đơn giản với 7 điểm
Giả sử có 7 điểm như hình vẽ:
Bài toán shortest Bitonic quay về giải quyết tương tự bài toán tìm đường đi ngắn nhất
giữa 2 điểm a, b L(a,b) với a, b là adjection, trong tập {1,2,3…a,b, n}.Khi a=n,b=n, bài
toán trở thành tìm đường đi ngắn nhất đi qua tất cã các điểm từ điểm trái nhất, duyệt qua
tất cã các điểm rồi trở về điểm trái nhất.
Đầu tiên: chúng ta sắp xếp theo thứ tự tăng dần theo tọa độ x của tất cã các điểm trên mặt
phẳng.
Trường hợp 1: Khi a=0, khi đó bitonic tour L(a,b) chính là đường đơn đi từ bên trái nhất
sang đến điểm b. Ví dụ L(0,4) ta có hình:
Chúng ta có duy nhất đường này dựa vào L(0,b) =edge(b-1,b)+L(0,b-1).
Trương hợp 2: a<b-1. Khi đó L(a,b)=L(a,b-1)+edge(b-1,b). Vì vậy chúng ta chỉ cần tính
toán dần đệ quy. Hình vẽ dưới đây minh họa L(1,5)=L(1,4)+L(4,5).
Trường hợp 3: a=b-1. Giả sử xét a=4,b=5, thì L(4,5)=minnimum của các trường hợp:
- L(0,4)+egde(0,5)
- L(1,4)+egde(1,5):
- L(2,4)+egde(2,5):
- L(3,4)+egde(3,5)
Như trường hợp này cho ta min băng L(3,4)+egde(3,5). Tiếp tục giải bài toán trên ta quy
về đi tìm shortest của L(3,4). Vậy bài toán này đưa về tinh toán quy hoạch động theo
bảng sau:
L(0,1)
L(0,2) L(1,2)
L(0,3) L(1,3) L(2,3)
L(0,4) L(1,4) L(2,4) L(3,4)
L(0,5) L(1,5) L(2,5) L(3,5) L(4,5)


L(0,n-1) L(1,n-1) L(2,n-1) L(3,n-1) L(4,n-1) … L(n-2,n-1)
L(0,n) L(1,n) L(2,n) L(3,n) L(4,n) … L(n-2,n) L(n-1,n)
c. Đánh giá thuật toán
Nhận thấy, có thể tính toán số phép toán dựa trên bảng sau
1
1 1
1 1 2
1 1 1 3
1 1 1 1 4

1 1 1 1 1 n-2
1 1 1 1 1 1 n-1
Vậy ta có tổng số phép toán phải xữ lý trong bài toán shorstest bitonic là:
1 + 2+4 +6 +8 + … +2(n-1) =
3. Bài 3: Câu a&d
3.1. Phát biểu bài toán
Tại một siêu thị điện máy người ta cho mỗi khách hàng (KH) khi mua với trị giá hơn 1
triệu sẽ được bắt thăm để lĩnh thưởng (mỗi tháng một lần). Các hồ sơ gồm tên KH, CMT
và số thăm bắt được sẽ được lưu trữ theo nguyên tắc dùng bảng băm tại đó mỗi ô (slot)
có thể sẽ trỏ đến một danh sách móc nối bản ghi trong đó các số thăm đều có cùng một
giá trị băm. Giả sử trong tháng hai vừa qua số lượng KH đã được bắt thăm là 20000.
Trong câu a-b-c-d, giả thiết siêu thị dùng bảng băm kích thước 20000.
a) Kỳ vọng số lượng ô còn trống là bao nhiêu?
b) Kỳ vọng số lượng ô có đúng 2 lá thăm rơi vào là bao nhiêu?
c) Kỳ vọng số lượng ô có nhiều hơn 2 lá thăm rơi vào là bao nhiêu?
d) Giả sử số lượng KH VIP, tức là KH mua với trị giá hơn 20 triệu, trong tháng hai
không nhiều hơn 100. Tính xác suất để sự kiện tồn tại một ô có chứa ít nhất 2 lá
thăm của khách hàng VIP.
e) Siêu thị không muốn lãng phí số lượng ô trống; Vậy kích thước bảng băm phù hợp
phải là bao nhiêu để số lượng ô trống là ít hơn hơn 10%

f) Nếu siêu thị dùng bảng băm kích thước 2000 thì khả năng có ô trống hay không
còn ô trống là cao hơn?
Gợi ý: Có thể áp dụng phần đã học về mô hình Bins-and-balls. Một vài câu có thể áp
dụng nghịch lý Birthday hoặc bài toán người sưu tập Coupon
3.2. Lời giải
a. Kì vọng số lượng ô còn trống là bao nhiêu
Gọi n là số ô trong bảng băm. n= 20000. Gọi m là số khách hàng được bắt thăm (số thăm)
m = 20000.
Áp dụng mô hình bài toán Bín-and-balls với một ô trong bảng băm tương ứng bới một
bin và lá thăm hay khách hàng tương ứng với ball, ta có xác suất để một ô là trống là
Pr[một ô là trống] = (1-1/n)
m
e
-m/n
Gọi X
j
là biến ngẫu nhiên chỉ báo cho sự kiện một ô j trong bảng băm là trống
+ X
j
=1 nếu ô thứ j trong bảng băm là trông
+ X
j
= 0 nếu ngược lại
Gọi X là số lượng ô trống trong bảng băm
Vậy X =
= n * (1-1/n)
m
n*e
-m/n
Với m=n=20000  E[X] = 20000 * e

-1
7357
d. Xác suất để tồn tại một ô có chứa ít nhất 2 lá thăm của khách hàng VIP
Với n là số khách hàng VIP (n ≤ 100) và m là số ô trong bảng băm (m=20000)
Xác suất để một lá thăm xác định rơi vào một ô trong bẳng băm là (1/m)
Xác suất để ô thứ k bất kì chứa ít nhất M=2 lá thăm của khách hàng VIP:
Pr[ô k chứa ≥ M thăm] ≤
Nhận thấy xác suất để tồn tại một ô có chứa ít nhất M lắ thăm của khách hàng VIP cũng
chính là xác suất để một ô chứa nhiều hơn hoặc bằng M lá thăm:
Pr [tồn tại ô chứa ≥ M thăm] ≤
Vậy Pr ≤

0,0012375
4. Bài 4: Thuật toán sắp xếp Bucket Sort
4.1. Phát biểu bài toán
Trình bày đầy đủ thuật toán sắp xếp Bucket Sort. Hãy cho biết trong điều kiện như thế
nào thì Bucket Sort có thể đạt được thời gian thực hiện O(n). Hãy lập luận và có chứng
minh cở sở toán học (xác suất) chặt chẽ.
4.2. Lời giải
a. Thuật toán sắp xếp Bucket Sort
Bài toán: Một tập gồm n ≤ 2
m
số nguyên được chọn ngẫu nhiên từ [0,2
k
) k ≥ m có thể
được sắp xếp với thời gian kì vọng là O(n). Để đơn giản bài toán có thể quy về một tập
gồm các số được chọn ngẫu nhiên từ [0,1) có thể được sắp xếp với thời gian kì vọng là
O(n) (chia tất cả các phần tử của dãy ban đầu cho 2
k
)

Ý tưởng của thuật toán:
- Chia đoan [0,1) ra làm n phần con có kích thước bằng nhau gọi là buckets
- Phân bố n phần tử của mảng đầu vào (mảng cần sắp xếp) vào các buckets tương ứng
- Sắp xếp trong các buckets bằng giải thuật sắp xếp hiệu quả
- Cuối cùng, kết hợp output bằng cách duyệt qua các buckets theo thứ tự, liệt kê các
phần tử nằm trong mỗi buckets theo thứ tự
Giả code
- Đầu vảo: Một mảng A[1 n] thỏa mãn 0 với mọi i
- Gọi B[0…n-1] là một mảng phụ chứa các danh sách móc nối
BUCKET-SORT(A, n)
for i ← 1 to n
do insert A[i] into list B[ROUND(n * A[i])]
for i ← 0 to n − 1
do sort list B[i] with insertion sort
concatenate lists B[0], B[1], . . . , B[n − 1] together in order
return the concatenated lists
Trong đó thủ tục ROUND(n*A[i]) trả ra cận dưới của giá trị n*A[i]
Độ chính xác
Xét A[i] và A[j]. Không làm mất tính tổng quát, giả sử rằng A[i] ≤ A[j]. Suy ra
ROUND(n*A[i]) ≤ ROUND(n*A[j]). Do đó A[i] được phân vào cùng một bucket hoặc
vào bucket có chỉ số thấp hơn so với A[j]. Vậy dãy sau khi được kết hợp trở lại từ những
bucket đã được sắp xếp chính là dãy sắp xếp chuẩn xác
b. Điều kiện để Bucket Sort đạt thời gian thực hiện là O(n)
Thuật toán Bucket Sort đạt thời gian thực hiện là O(n) với điều kiện dãy số đầu vào là
ngẫu nhiên (được sinh ra từ phân bố xác suất đều – uniform distribution).
Thật vậy, xét một cách ước lượng, khi mảng các số A đầu vào là ngẫu nhiên thì việc phân
bố các phần tử của A vào các bucket rất đồng đều. Do đó, số lượng các phần tử trong
từng bucket là đồng đều và là nhỏ. Chi phí cho thao tác để sắp xếp trong từng bucket này
có thể coi là O(1). Vậy cần O(n) để sắp xếp trên tất cả buckets.
Ta cũng có thể chứng minh bằng xác suất như sau:

Gọi n
i
là số lượng phần tử được phân bố vào bucket B[i] Trong trường hợp tổng quát,
insertion sort chạy với chi phí là hàm bậc 2 của số phần tử nên ta có tổng thời gian để
thực hiện bucket sort là:
Thời gian tính toán trung bình (kì vọng):


) (1)
Vậy ta phải tìm .
Gọi X
ij
là biến ngẫu nhiên chỉ báo (indicator random variables) của sự kiện phần tử A[j]
được phân bố vào bucket i. Xác suất để phần tử A[j] được phân bổ vào bucket I là:
Pr(A[j] rơi vào bucket i) = 1/n.
(do có n bucket và các phần tử A[j] sinh ra từ phân bố xác suất đều).Vậy :
Do đó:
Suy ra
E[(X
ij
)
2
] = 0
2
* Pr(A[j] khổng rơi vào bucket i ) + 1
2
* Pr(A[j] rơi vào bucket i)

E[(X
ij

)
2
] = 0 **1-1/n) + 1* 1/n = 1/n
Với j ≠ k và X
ij
và X
ik
là những biến ngẫu nhiên độc lập nên
E[X
ij
X
ik
] = E[X
ij
]E[X
ik
] = 1/n * 1/n = 1/n
2
Từ đó có thể suy ra được

= n * 1/n + 2* * 1/n
2
= 1 + 2* n(n-1)/2 * 1/n
2
= 1 + (n-1)/n
= 2 -1/n (2)
Từ (1) và (2) to có
E[T(n)] )
=
= (điều phải chứng minh)

×