Để đáp ứng được yêu cầu của công tác giảng dạy đội tuyển Tin học. Bản thân mỗi giáo viên chúng ta luôn phải tìm tòi, nghiên cứu, trao đổi kiến thức và kinh nghiệm giảng dạy với các đồng nghiệp. Bên cạnh đó, nguồn tài liệu trên mạng cũng là một nguồn quý giá đối với giáo viên chúng ta. Tuy nhiên, việc tổng hợp, biên tập thành tài liệu có nội dung phù hợp cho đối tượng học sinh của mình lại là một vấn đề quan trọng hơn nữa. Vì vậy, với chuyên đề này tôi xin được đề cập đến một tài liệu được sưu tầm mà tôi thường dùng để giảng dạy cho học sinh trong đội tuyển, những bài toán mà bản thân tôi thấy tâm đắc. Trong tài liệu này đề cập đến cấu trúc dữ liệu: • Heap • DisjointSet
CẤU TRÚC DỮ LIỆU ĐẶC BIỆT Để đáp ứng yêu cầu công tác giảng dạy đội tuyển Tin học Bản thân giáo viên phải tìm tòi, nghiên cứu, trao đổi kiến thức kinh nghiệm giảng dạy với đồng nghiệp Bên cạnh đó, nguồn tài liệu mạng nguồn quý giá giáo viên Tuy nhiên, việc tổng hợp, biên tập thành tài liệu có nội dung phù hợp cho đối tượng học sinh lại vấn đề quan trọng Vì vậy, với chuyên đề xin đề cập đến tài liệu sưu tầm mà thường dùng để giảng dạy cho học sinh đội tuyển, toán mà thân thấy tâm đắc Trong tài liệu đề cập đến cấu trúc liệu: • Heap • Disjoint-Set HEAP Như bạn biết, Heap cấu trúc hữu dụng vào bậc giải toán Heap dạng hàng đợi có độ ưutiên, có ứng dụng to lớn nhiều dạng toán khác Heap thực chất cân thoả mãn điều kiện sau: • nút có không nút • Nút cha nút lớn nhất, nút có giá trị nhỏ nút cha Trong đó, điều kiện quan hệ nhỏ nút so với nút cha quy định trướctuỳ theo toán, không thiết phải nhỏ theo nghĩa toán học Ví dụ: Mặc dù mô tả Heap lại lưu trữ mảng, nút gốc nút 1, nút nút i nút 2*I 2*I+1 Đặc điểm Heap: • Nút gốc nút lớn [theo định nghĩa cótrước] • Độ cao nút nhỏ O(logN) vìcây Heap cân * Ứng dụng Heap: Tìm min, max tập hợp động, nghĩa tậpcó thể thay đổi, thêm, bớt phần tử * Các thao tác thường dùng xử lý HEAP: • Up_heap: Nếu nút lớn cha di chuyển lên • Down_heap: Nếu phần tử nhỏ di chuyển xuống • Push: Đưa phần tử vào HEAP cách thêm nút vào up_heap nút • Pop: Loại phần tử khỏi HEAP cách chuyển xuống cuối heap loại bỏ, sauđó chỉnh sửa lại heap cho thoả mãn điều kiện HEAP Ví dụ: Biến top số phần tử heap, A mảng chứa heap,doicho(i,j) thủ tục đổi chỗ phần tử i j heap Procedure Up_heap(i: longint ); Begin If (i = 1) or (a[i] > a[i div 2]) then exit; // i div nút cha i doicho(i, i div 2); up_heap(i div 2); end; Procedure Down_heap(i: longint ); Begin j := i*2; if j > top then exit; if (j < top) and (a[j] > a[j -1]) then j := j+1; //chọn nút lớn nút doicho(i,j); down_heap(j); End; Procedure Push(giatri :longint ); Begin inc(top); a[top]:=giatri; //mở rộng thêm phần tử vào tập up_heap(top); //chỉnh lại heap cho thoả mãn điều kiện End; Procedure Pop(vitri: longint ); Begin a[vitri]:=a[top]; dec(top); //loại phần tử khỏi heap //chỉnh lại heap, phần tử bị loại đầu heap bỏ up_heap up_heap(vitri); down_heap(vitri); End; Trong trình đưa phần tử khỏi heap vị trí bất kìphải thực trình up_heap down_heap để đảm bảo Heap thoảmãn điều kiện cho Qua đoạn chương trình ta thấy điều kiện HEAP bảo tồnsau tập bị thay đổi Heap sử dụng thuật toán Dijkstra, Kruskal, Heap Sort nhằm giảm độphức tạp thuật toán Heap sử dụng toán dãy số, quy hoạch động, đồthị Với ví dụ sau ta thấy phần đa dạng linh hoạt sử dụngHeap Để thuận tiện ta gọi Heap-max heap mà giá trị nút cha lớn giá trị nútcon (phần tử đạt max gốc Heap) Heap-min heap mà giá trị nút cha nhỏhơn giá trị nút (phần tử đạt gốc heap) Bài toán 1: MEDIAN Phần tử trung vị tập N phần tử phần tử có giá trị đứng thứ N div 2+1 với N lẻ N div N div 2+1 với N chẵn Cho tập hợp ban đầu rỗng Trong file Input c ó M ≤ 10000 thao tác thuộc loại: • PUSH gtr đưa phần tử giá trị gtr vào HEAP (gtr ≤ 109) • MEDIAN trả giá trị phần tử trung vị tập hợp (nếu N chẵn trả cả2 giá trị) Yêu cầu: Viết chương trình đưa file OUTPUT tương ứng Input: Dòng ghi số M, M dòng ghi thao tác theo địnhdạng Output: Tương ứng với thao tác MEDIAN trả (hoặc 2) giá trị tương ứng Thuật giải: Dùng heap, heap (HA) lưu phần tử từ thứ tới N div heap lại (HB) lưu phần tử từ N div +1 tới N sau sort lại tập thành tăngdần HA Heap-max HB Heap-min Như phần tử trung vị gốc HB(N lẻ) gốc HA HB (n chẵn) Thao tác MEDIAN có độ phứctạp O(1) Còn thao tác PUSH làm O(logN) sau: • Nếu gtr đưa vào nhỏ HA[1] đưa vào HA ngược lại đưa vào HB Sốphần tử N tập tăng lên • Nếu HA có lớn (hoặc nhỏ N) div phần tử POP phần tử từ HA (hoặc HB) đưavào heap lại Sau trình HA HB đảm bảo theo định nghĩa ban đầu Bàitoán giải với độ phức tạp O(MlogM) Bài toán 2: Có N công việc buộc phải hoàn thành trước thời gian D[i] (thời gianhiện 0) N công việc giao cho programmer lười biếng Xét côngviệc i, bình thường programmer làm xong B[i] thời gian đượctrả thêm c($) làm xong B[i]-c*A[i] (nếu c=B[i]/A[i] làmxong tức khắc, t=0) Tất nhiên c ≤ B[i]/A[i] Tiền trả thêm với côngviệc độc lập với Yêu cầu: Với mảng D[], B[] A[] cho trước, tìm số tiền phải trả thêm choprogrammer để công việc hoàn thành hạn Input: • Dòng ghi số N • Dòng thứ I N dòng dòng ghi sốlần lượt A[i], B[i] D[i] Output: Tổng số tiền nhỏ phải trả thêm (chính xác tới chữ số thập phân) Giới hạn: N ≤ 105, ≤ A [i],B[i] ≤ 104, ≤ D[i] ≤ 109 Thuật giải: Nhận thấy xét tới thời điểm T công việc có D[i]T: C[j]=C[j]-T/A[j]; tien= tien + T/A [j];kết thúc xử lý công việc I • C[j]*A[j]=T: loại bỏ j khỏi heap; tien=tien + C[j];kết thúc;//thời gian làm j = • C[j]*A[j]4 kếtquả = -1 Thuật giải:Ta tính trước maxk=100 đường ngắn từ a tới b Với đỉnh dùng thuật toán DIJKSTRA để tính maxkđường ngắn tới tất đỉnh lại Giả sử xét tới đỉnh U, C[u,v,k] làđường ngắn thứ k từ u tới v Với V U tính C[u,v,k] với k từ tớimaxk (tính xong giá trị cũ tính tới giá trị mới), k0[v] giá trị k đượctính v (khởi tạo k0[v]=1) Sau bước thuật toán: CONNECTION(U) Với v=1 N, vu: Tìm v: C[u,v,k0[v]] đạt GTNN, min=C [u,v,k0[v]] Xác nhận C[u,v,k0[v]] đường cần tìm, K0[v]= K0[v]+1 Với v’ mà có đường từ v tới v’ (dài L) tạo thêm đường từ u tới v’ độ dàiL’=min+L, cập nhật đường từ U tới V End; Các bước thuật toán Dijkstra thông thường Vì giá trị đượcxét lần nên với đường từ U tới V’ ta phải lưu trữ lại, nhưng, chỉcần tìm maxk đường ngắn nên ta cần lưu trữ lại maxk-k0[v’] đường Bước viết rõ ràng sau: 3.Update(v’,L’) 3.1 Tìm đường dài đường lưu 3.2 Nếu đường ngắn L’ kết thúc 3.3 Loại bỏ đường 3.4 Lưu trữ đường dài L’ Tập đường lưu trữ với đỉnh V tập động, ta dùng heap-max để lưu trữtập đường Lúc bước C[u,v,k0[v]] phải chọn tậptrên Có thể kết hợp heap-min để tìm nhanh C [u,v,k0[v]] Cách cài đặt phứctạp đòi hỏi phải hiểu rõ heap Một cách khác đơn giản cập nhậtC[u,v,k0[v]] bước tìm đường mới: 3.Update(v’,L’) 1.2.3.4 {các bước cũ} Nếu (L’ C[u,v,k0[v]]=L’ Nhưng bước thuật toán ban đầu cần bổ sung sau: 2.a/ Xác nhận, K0[v]:= K0[v]+1 b/Nếu K0[v]0 i:= P[i]; FindSet:=i; End; Procedure Union(i,j: longint ); Var u,v:longint ; Begin U:=FindSet(i);V:=FindSet(j); P[v]:=u; End; Trong trường hợp suy biến, hàm FindSet phải thực O(N) Vìvậy có số heuristic để hỗ trợ cho disjoint-set Union_by_rank vàPath_compression - Union_by_rank thực chất xét ưu tiên Set Union không Union 1cách Một cách ưu tiên nối tập có số phần tử vào tập có sốphần tử nhiều hơn, hàm FindSet thực nhanh độ cao củacác nút giảm Giá trị P[] gốc lưu số lượng nút câynhưng mang giá trị âm Hàm Union viết lại sau: Procedure Union(i,j: longint ); Var u,v:longint ; Begin U:=findSet(i);v:=findset(j); If P[u] if (thu[i]=0) thu[i]=j otherwise Union(findset(i),findset(thu[j])) Tương tự với J Độ phức tạp thuật toán O(M*alpha(N)) Bài tập làm thêm: Parity: Cho dãy nhị phân có n phần tử (n ≤ 10 9) m câu phát biểu(m ≤ 5000) Mỗi câu phát biểu có dạng a b c Có ý nghĩa đoạn từ a đến b có tổng số lẻnếu c=1 chẳn c=0.Hãy xác định xem phát biểu đến câu số (tức tồn 1dãy nhị phân n phần tử thoả mãn tất điều kiện tới câu đó) Input: Dòng đầu ghi số N, dòng ghi số M Trong M dòng ghi sốa b c mô tả phát biểu Output: Duy số số lớn mà tới câu phát biểu phát biểu từ đótrở lên BT.INP 10 BT.OUT BẮC CẦU Chính phủ quốc đảo Oceani định xây dựng m cầu nối n đảo mình, tạo mạng lưới giao thông đường cho phép từ dảo tới đảo khác đường (trực tiếp qua số đảo trung gian) Mỗi cầu nối đảo khác cho phép lại hai chiều Các đảo đánh số từ đến n-1 Bị hạn chế kinh phí nguồn nhân lực, người ta định xây dựng cầu lên kế hoạch xác định cầu trình tự xây Mỗi cầu xác định cặp đảo u, v mà nối Trong trình thực kế hoạch đến lúc từ đảo đến đảo khác đường Ví dụ, Oceani có đảo người ta định xây dựng cầu theo trình tự – 1, – 2, – 2, – 3, – Tuy vậy, không cần chờ đợi đến hoàn thành kế hoạch xây cầu, sau cầu thứ xây xong tất đảo nối liền đường Yêu cầu: Cho n, m cầu dự kiến xây Thông tin cầu đưa theo trình tự xây dựng Hãy xác định số cầu tối thiểu cần xây theo kế hoạch để từ đảo đến đảo khác đường Dữ liệu: Vào từ file văn BRIDGES.INP: • Dòng chứa số nguyên n m (1 ≤ n ≤ 106, ≤ m ≤ 5×106), • Dòng thứ i m dòng chứa số nguyên u v xác định cầu thứ i cần xây Kết quả: Đưa file văn BRIDGES.OUT kết tìm dạng số nguyên Ví dụ: BRIDGES.INP 45 01 BRIDGES.OUT 4 NÚT CHA CHUNG GẦN NHẤT Cây cấu trúc liệu quen thuộc tin học Ví dụ ta có với 16 nút hình bên dưới.Các nút đánh số từ đến 16 Nút gốc Nút x gọi nút cha y, tồn đường dẫn từ gốc tới y qua x Ví dụ, nút nút cha nút 16, nút 10 nút cha 16 Một nút đồng thời nút cha Như vậy, nút 8, 4, 10 16 nút cha 16 Nút x gọi nút cha chung hai nút khác y z, vừa nút cha y, vừa nút cha z Ví dụ, nút nút cha chung nút 16 Nút x gọi nút cha chung gần y z, nút cha chung hai nút đường dẫn từ x tới y không nút cha chung khác y z Ở xét, nút cha chung gần 16 Hãy lập trình tìm nút cha chung gần hai nút khác có N nút, nút đánh số từ tới N Dữ liệu: Vào từ file văn ANCES.INP: • Dòng chứa số nguyên N K- N - số nút cây, ≤ N ≤ 10 000, K – nút gốc, • N-1 dòng lại: dòng chứa số nguyên - nút liên tiếp cây, • Dòng cuối chứa số nguyên khác – nút cần tìm nút cha chung gần Kết quả: Đưa file văn ANCES.OUT số nguyên – nút cha chung gần ANCES.INP 16 14 85 10 16 59 46 84 10 13 15 10 11 67 10 16 81 16 12 16 ANCES.OUT Cấu trúc liệu lập trình nói chung, cấu trúc Heap Disjoint-set nói riêng nội dung quan trọng việc bồi dưỡng học sinh giỏi Nắm nội dung này, giáo viên học sinh giải toán với độ phức tạp tốt Thông qua tài liệu sưu tầm được, người giáo viên cần tổng hợp, chọn lọc biên tập lại để có tài liệu phù hợp với đối tượng học sinh Với cá nhân tôi, giao tài liệu cho học sinh, yêu cầu học sinh nghiên cứu, sau thầy trò tháo gỡ khó khăn mà học sinh gặp phải Qua hệ thống tập bên tập www.vn.spoj.comđã giúp cho học sinh rèn luyện kĩ cài đặt thuật toán tốt Tôi hi vọng với chuyên đề nhỏ giúp cho học sinh đội tuyển có thêm nguồn tài liệu bổ ích mong đóng góp ý kiến, đóng góp tập chủ đề thầy cô để chuyên đề đầy đủ Tôi xin trân trọng cảm ơn [...]... 16 12 16 7 ANCES.OUT 4 Cấu trúc dữ liệu trong lập trình nói chung, cấu trúc Heap và Disjoint-set nói riêng là nội dung quan trọng trong việc bồi dưỡng học sinh giỏi Nắm được những nội dung này, giáo viên và học sinh có thể giải quyết bài toán với độ phức tạp tốt nhất Thông qua những tài liệu sưu tầm được, người giáo viên cần tổng hợp, chọn lọc và biên tập lại để có được tài liệu phù hợp với đối tượng... bằng đường bộ Dữ liệu: Vào từ file văn bản BRIDGES.INP: • Dòng đầu tiên chứa 2 số nguyên n và m (1 ≤ n ≤ 106, 1 ≤ m ≤ 5×106), • Dòng thứ i trong m dòng tiếp theo chứa 2 số nguyên u và v xác định cây cầu thứ i cần xây Kết quả: Đưa ra file văn bản BRIDGES.OUT kết quả tìm được dưới dạng một số nguyên Ví dụ: BRIDGES.INP 45 01 BRIDGES.OUT 4 4 NÚT CHA CHUNG GẦN NHẤT Cây là một cấu trúc dữ liệu quen thuộc... chung nào khác của y và z Ở cây đang xét, 4 là nút cha chung gần nhất của 7 và 16 Hãy lập trình tìm nút cha chung gần nhất của hai nút khác nhau của một cây có N nút, các nút được đánh số từ 1 tới N Dữ liệu: Vào từ file văn bản ANCES.INP: • Dòng đầu tiên chứa số 2 nguyên N K- trong đó N - số nút của cây, 2 ≤ N ≤ 10 000, K – nút gốc, • N-1 dòng còn lại: mỗi dòng chứa 2 số nguyên - 2 nút liên tiếp của... Với cá nhân tôi, khi giao tài liệu này cho học sinh, yêu cầu học sinh nghiên cứu, sau đó thầy trò cùng tháo gỡ những khó khăn mà học sinh gặp phải Qua hệ thống bài tập bên trên và những bài tập trên www.vn.spoj.comđã giúp cho học sinh rèn luyện kĩ năng cài đặt thuật toán tốt hơn Tôi hi vọng với chuyên đề nhỏ này có thể giúp cho học sinh của các đội tuyển có thêm nguồn tài liệu bổ ích và cũng mong được