1. Trang chủ
  2. » Công Nghệ Thông Tin

CS112 SJ11HW04 c GIẢI CHI TIẾT CÁC BÀI TOÁN CHIA ĐỂ TRỊ có kèm theo code c++

19 494 6

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 627,03 KB
File đính kèm code demo.rar (1 MB)

Nội dung

1.Ví dụ 4: bài toán tìm hạng trong không gian 2D1.1 Phát biểu bài toán:Cho danh sách tọa độ các đỉnh (x,y), hạng của một điểm là số toạ độ (a,b) trong tập hợp đã cho thõa mãn (x>a) và (y>b).Input: các tọa độ , mỗi x và y khác nhau đôi một.Output: danh sách các điểm sau khi sắp xếp và một dãy số từ 1 đến n là hạng của từng phần tử theo thứ tự.Ý tưởng: sắp xếp các tọa độ theo x. Nếu left>=right: thoát, ngược lại chia đoạn thành 2 đoạn bằng nhau bên trái và bên phải, vì dãy đã sắp xếp theo x nên bên phải sẽ có x lớn hơn bên trái, việc còn là i là với mỗi điểm bên phải xét xem nó lớn hơn bao nhiêu điểm bên trái, điều này cũng dễ dàng thực hiện bằng phương pháp duyệt.1.2 Cấu trúc dữ liệu:Dùng mảng n phần tử kiểu cấu trúc struct {x,y} để lưu các toạ độ, mảng 1 chiều số nguyên để lưu hạng.int h10000={}; mảng lưu hạng

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN - Khoa: Khoa học máy tính Mơn: Phân tích thiết kế thuật toán Lớp: CS112.J11 BÀI TẬP SỐ 04.c THIẾT KÊ GIẢI THUẬT – PHƯƠNG PHÁP CHIA ĐỂ TRỊ GV: Huỳnh Thị Thanh Thương Thành viên nhóm: Lê Thanh Tiềm – 16521214 Nguyễn Đăng Thịnh – 16521177 Nguyễn Dỗn Đơng – 16520221 Ví dụ 4: tốn tìm hạng khơng gian 2D 1.1 Phát biểu tốn: Cho danh sách tọa độ đỉnh (x,y), hạng điểm số toạ độ (a,b) tập hợp cho thõa mãn (x>a) (y>b) Input: tọa độ , x y khác đôi Output: danh sách điểm sau xếp dãy số từ đến n hạng phần tử theo thứ tự Ý tưởng: xếp tọa độ theo x Nếu left>=right: thoát, ngược lại chia đoạn thành đoạn bên trái bên phải, dãy xếp theo x nên bên phải có x lớn bên trái, việc cịn i với điểm bên phải xét xem lớn điểm bên trái, điều dễ dàng thực phương pháp duyệt 1.2 Cấu trúc liệu: Dùng mảng n phần tử kiểu cấu trúc struct {x,y} để lưu toạ độ, mảng chiều số nguyên để lưu hạng int h[10000]={}; // mảng lưu hạng 1.3 Thuật giải void hang(int l, int r) { if (l>=r) return; // left>right int m = (l+r)/2; // lấy phần tử tiến hành tăng hạng cho nửa bên phải cách so sánh với nửa bên trái for (int i=1;i=r)return; // left>=right int m=(l+r)/2; // chia đôi thước length[m]=h; // gán //Thực tương tự cho đoạn get(l,m,h-1); get(m+1,r,h-1); } 2.4: độ phức tạp 𝑛 𝑇(𝑛) = 2𝑇 ( ) = 𝑂(𝑛 log 𝑛) 2.5: Ví dụ minh họa: 3.Ví dụ 6: Nhân số nguyên lớn 3.1 Phát biểu toán: Cho hai số ngun có nhiều chữ số, tính tích hai số Input: số lớn Output: tích số Ý tưởng: để tính a nhân b, ta tách số b làm theo độ dài, tiến hành nhân a cho nửa bên phải, sau nhân a cho nửa bên trái cộng vào a số lượng số với độ dài nửa bên phải, cuối dùng cộng số lớn để cộng a b, b có chữ số dùng nhân số nguyên cho số lớn return kết 3.2 Cấu trúc liệu: Dùng char[] kiểu string để lưu số lớn 3.3 Thuật giải: void autho(char* x, char* y, char* res) { if (leng(y)==1) tiến hành nhân đơn giản int m = leng(y)/2 // chia chuỗi y thành char t1[] = y[0 m-1] // gán nửa bên trái y cho t1 char t2[] = y[m leng(y)] //gán nửa bên phải y cho t2 autho(x,t1,t1) //gán kết phép nhân vào t1 autho(x,t2,t2) //gán kết phép nhân vào t2 t1 = t1+ “0000…00000” (số lượng số leng(t2)) res = cong(t1,t2) // dùng phép cộng số lớn để gán giá trị cuối cho res } 3.4 Độ phức tạp 𝑇(𝑛) = 𝑂(𝑛2 ) 3.5: Ví dụ minh họa: Vd1: 23513 22141 Kq: 520601333 Vd2: 12354621 2315467 kq:28606717223007 4.Ví dụ 7: Số phương 4.1 Phát biểu toán: Cho dãy số, xuất tất số phương Input: số lượng phần tử, sau dãy số Output: số phương dãy Ý tưởng: viết hàm để in tất số phương đoạn left right, đoạn có phần tử xét có phải số phương khơng in ra, ngược lại chia đoạn làm phần gọi đệ quy để tim tất số phương hai hàm 4.2 Cấu trúc liệu: Dùng mảng để lưu dãy số int n, a[1000] 4.3 Thuật giải: // hàm dùng để kiểm tra số có phải số phương hay khơng int check(double a) { int x=int(sqrt(a)); return x*x==int(a); //nếu bình phương bậc hai //thì số phương } void findall(int l, int r) { if(l==r) // đoạn có phần tử tiến hành xét dừng { if(check(a[l])) cout n – m: Hốn đổi n – m phần tử với n – m phần tử phần sau Sau mảng a[n – m+1 đến n] ta hoán đổi n – m phần tử cuối mảng với phần tử phần đầu Như vậy, áp dụng phương pháp chia để trị ta chia toán thành hai toán con: > Bài thứ nhất: Hoán đổi hai mảng có độ dài nhau, cụ thể hốn đổi nửa phần tử đầu nửa phần tử cuối mảng cho cách đổi chỗ cặp phần tử tương ứng >Bài thứ hai dạng với tốn cho kích thước nhỏ Ta gọi lại đệ quy, trình dừng đạt tới hốn đổi có độ dài => Có thể thấy mấu chốt tốn thực thao tác hốn đổi hai nhóm phần tử, lặp lại thao tác số lượng phần tử hai nhóm khác Vì ta thay thuật tốn đệ quy sang thuật toán lặp 6.2 Cấu trúc liệu: Dùng mảng để lưu dãy 6.3 Thuật giải: Transpose( a , n , m ) { i = m; j = n-m; m = m+1; while( i != j) { if(i>j) { Exchange(a, m-i, m, j); i = i – j; } Else{ j = j - i; Exchange(a, m – i, m+j, i); } } Exchange(a,m-i,m,i); } Exchange(a, i, j, m) { For( k = 0; k< m-1; k++) Swap( a[i+k], a[j+k] ); } 6.4 Độ phức tạp Ký hiệu: T(i,j) số phần tử cần để hoán đổi dãy i phần tử dãy j phần tử Ta có cơng thức truy hồi sau: 𝑖 𝑛ế𝑢 𝑖 = 𝑗 𝑇(𝑖, 𝑗) = {𝑗 + 𝑇(𝑖 − 𝑗, 𝑗) 𝑛ế𝑢 𝑖 > 𝑗 𝑖 + 𝑇(𝑖, 𝑗 − 𝑖) 𝑛ế𝑢 𝑖 < 𝑗 => T(i,j) = i+j – UCLN(i,j) Với UCLN(i,j) ước chung lớn i,j 6.5 Ví dụ minh họa Dãy a[8] = {1, 10, 3, 2, 5, 6, 9, 8} Với m = 2: Dãy a[8] = {2, 1, 9, 10} 7.Ví dụ 10: Cặp điểm gần 7.1 Phát biểu toán: Cho N điểm mặt phẳng tọa độ, cần tìm điểm cho khoảng cách chúng nhỏ Khoảng cách điểm tính cơng thức: d( pi , pj )= √(𝑥𝑖 − 𝑥𝑗)2 + (𝑦𝑖 − 𝑦𝑗)2 Ý tưởng: Áp dụng tư tưởng thuật giải chia để trị: + Chia tập điểm thành hai tập đường thẳng đứng (theo ox) + Gọi đệ quy tìm cặp điểm gần cho tập bên trái tập bên phải + Tìm khoảng cách ngắn điểm thuộc tập bên trái điểm thuộc tập bên phải Để thực bước nhanh, ta cần xếp điểm theo trục ox CỊn buowcj ta cần xếp theo oy 7.2 Thuật giải: struct Point { int x, y; }; closesUtil(point P[], int n) { if(n

Ngày đăng: 26/02/2019, 19:57

TỪ KHÓA LIÊN QUAN

w