Được gửi bởi
vothiensau
Mình đang nghiên cứu về phần thuật toán và có 1 số thắc mắc mọi người giải đáp dùm nha.
1/Xem xét bài toán xác định xem 1 dãy số tùy ý n con số <x1, x2, ..., xn> có chứa các lần xuất hiện lặp lại của 1 con số nào đó hay không. Dẫn chứng rằng điều này có thể thực hiện theo thời gian theta(nlgn).
2/Làm sao để sửa đổi hầu hết mọi thuật toán để có 1 thời gian thực hiện tốt trong trường hợp tốt nhất?
Ý tưởng của mình cho câu 1.
Dãy A = {X1,X2,... , Xn} là dãy cần kiểm tra
B = {}
Code:
WHILE ( A != {} )
X = pop(A); // neu cai dat chi can tang chi so mang len 1
if ( Add ( X, B ) == 0)
return [có phần tử trùng trong A]
return [các phần tử trong A đôi một khác nhau]
// B là dãy có thư tự
// Hàm X vô B cài đặt theo tư tưởng.
// X add vô không tạo thành nghịch thế
// X add vô không được trùng
// việc thêm 1 phần tử X vào B có chi phí không đáng kể ngoài trừ chi // phí tìm kiếm.
// Từ tiêu chí trên => B được cài đặt là cây nhị phân tìm kiếm
Về hàm add X vô B theo phân tích trên là việc thêm X vào một cây nhị phân tìm kiếm. Cái này không khó, thuật toán chắc mọi người biết rồi.
Chi phí như sau :
FOR i = 0 -> M
ChiPhi += log2(i);
Trường hợp xấu nhất phải duyệt đến cuối mới biết. => M = n
Trường hợp tốt nhất M = 1 Chi phi = 1.
trung bình M = N/2.
Nói chung chi phí này là 1 + log2(1) + log2(2) + ... + log2(n - 1) (n lần tính cả số 1)
và sẽ nhỏ hơn chi phí nlog2(n) = log2(n) + log2(n) + .... + log2(n) (n lần)
Bookmarks