CHUYÊN đề cấu TRÚC dữ LIệU TREAP ti24

27 98 0
CHUYÊN đề cấu TRÚC dữ LIệU TREAP ti24

Đ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

CHUYÊN ĐỀ: CẤU TRÚC DỮ LIỆU TREAP GIỚI THIỆU Trong khoa học máy tính, TREAP tìm kiếm nhị phân ngẫu nhiên hóa hai dạng cấu trúc liệu tìm kiếm nhị phân liên quan chặt chẽ đến Chúng lưu trữ tập hợp khóa cho phép chèn, xóa, tìm kiếm khóa Sau dãy thao tác chèn xóa nào, hình dạng biến ngẫu nhiên có phân phối với hình dạng nhị phân ngẫu nhiên Đặc biệt, với xác suất cao, chiều cao lơgarit số khóa, nên thao tác tìm kiếm, chèn, xóa tốn thời gian lôgarit TREAP phát minh Cecilia R Aragon Raimund Seidel năm 1989 Tên từ kết hợp tree (cây) heap (đống) Nó Descartes khóa gắn độ ưu tiên ngẫu nhiên Như với nhị phân khác, thứ tự duyệt trung thứ tự nút thứ tự tăng dần khóa Cấu trúc định tính chất đống max: độ ưu tiên nút khác lớn độ ưu tiên nút Do đó, với Descartes nói chung, nút gốc nút có độ ưu tiên lớn Một cách thức mơ tả tương đương TREAP tạo cách chèn nút theo thứ tự độ ưu tiên giảm dần mà khơng thực phép cân Do đó, độ ưu tiên ngẫu nhiên (từ phân phối tập hợp đủ lớn cho khả hai nút có độ ưu tiên thấp) hình dạng TREAP có phân phối với hình dạng tìm kiếm nhị phân ngẫu nhiên (cây tìm kiếm nhị phân tạo việc chèn nút theo thứ tự ngẫu nhiên mà khơng thực phép cân nào) Do tìm kiếm nhị phân ngẫu nhiên có chiều cao lơgarit với xác suất cao, điều cho TREAP Cụ thể, TREAP cho phép thực thao tác sau: + Tìm kiếm khóa cho trước cách sử dụng thuật tốn thơng thường cho nhị phân bỏ qua độ ưu tiên + Chèn khóa x vào TREAP cách sinh trọng số ngẫu nhiên y cho x Tìm kiếm x chèn nút chứa x vào vị trí trống tìm Sau thực phép quay để phục hồi tính chất đống: chừng x chưa nút gốc có độ ưu tiên lớn nút cha z, thực phép quay cạnh nối x z + Xóa khóa x TREAP sau: x nút lá, xóa Nếu x có nút z, xóa x đặt z vào làm nút nút cha x (hoặc đặt z làm gốc x gốc cũ) Cuối cùng, x có hai nút con, đổi chỗ x nút nhỏ phải x z, thực hai trường hợp cho x vị trí Trong trường hợp cuối, z vi phạm tính chất đống nên cần thực phép quay để phục hồi tính chất đống + Chia TREAP thành hai TREAP, chứa khóa nhỏ x, chứa khóa lớn x cách chèn x với độ ưu tiên cao tất khóa vào TREAP Sau chèn xong, x trở thành nút gốc, khóa nhỏ x nằm TREAP bên trái khóa lớn x nằm TREAP bên phải Chi phí thao tác lần chèn + Hợp hai TREAP lại làm (giả sử khóa TREAP thứ nhỏ khóa TREAP thứ hai) sau Chèn x cho x lớn khóa TREAP thứ nhất, nhỏ khóa TREAP thứ hai với độ ưu tiên x nhỏ độ ưu tiên khóa Sau chèn xong, x nút nên xóa dễ dàng Kết thu TREAP hai TREAP cũ hợp lại Aragon Seidel khuyên nên gán cho nút hay truy cập trọng số lớn Thay đổi làm khơng ngẫu nhiên mà khiến cho nút hay truy cập dễ nằm gần gốc hơn, khiến cho việc tìm chúng nhanh Blelloch Reid-Miller mô tả ứng dụng TREAP để lưu trữ tập hợp đối tượng hỗ trợ thao tác hợp tập hợp, giao tập hợp, phần bù tương đối cách dùng TREAP để biểu diễn tập hợp Naor Nissim mô tả ứng dụng khác để lưu trữ chứng nhận khóa cơng khai mật mã khóa cơng khai CẤU TRÚC DỮ LIỆU TREAP Cấu trúc liệu TREAP 1.1- Khái niệm: TREAP cấu trúc liệu kết hợp tìm kiếm nhị phân với vun đống nhị phân, tên gọi kết hợp tên hai cấu trúc (TREAP = Tree + Heap) Cấu trúc liệu lưu trữ cặp (x, y) dạng tạo thành tìm kiếm nhị phân theo x vun đống nhị phân theo y Giả thiết tất x tất y khác Khi cấu trúc có nút lưu trữ cặp (x0, y0) nút trái nút có x nhỏ x 0, nút phải nút có x lớn x 0, ra, phải lẫn trái giá trị y nút nhỏ y TREAP Siedel Argon đề xuất năm 1996 Trong phần lớn ứng dụng TREAP, x khóa (key), đồng thời giá trị lưu trữ cấu trúc, y độ ưu tiên (priority) Nếu khơng có độ ưu tiên y, với liệu x cho trước ta có tập tìm kiếm nhị phân, số số suy biến thành nhánh làm chậm cách đáng kết trình tìm kiếm Việc đưa mức độ ưu tiên vào cho phép xác định cách đơn trị, không phụ thuộc vào trình tự bổ sung nút Ta xây dựng nhị phân không suy biến, đảm bảo thời gian tìm kiếm trung bình O(logn), bổ sung nút với độ ưu tiên ngẫu nhiên xác xuất nhận có độ cao lớn ⌈4log2n⌉ vô bé Cặp giá trị (x, y) xét tọa độ điểm mặt phẳng Khi TREAP đồ thị phẳng (các cạnh không giao nhau) nối điểm mặt phẳng Vì TREAP gọi Cây Đề (Carsian Tree) Ví dụ: Một số cấu trúc TREAP: 1.2- Các phép xử lý với TREAP TREAP cho phép tổ chức xử lý với tìm kiếm nhị phân bình thường, phần lớn trường hợp thời gian thực phép xử lý O(logn):  void insert(T1 key, T2 value) – bổ sung cặp giá trị (key, value) vào TREAP,  void remove(T1 key) – xóa nút có khóa key khỏi TREAP,  T2 find(T1 key) – tìm giá trị xác định khóa key Cấu trúc TREAP cho phép dễ dàng thực phép chọn cập nhật theo nhóm:  T2 query(T1 key1, T1 key2) – xác định giá trị hàm (tổng, tích, max, )với phần tử khoảng [key1, key2],  voi modify(T1 key1, T1 key2) – cập nhật giá trị (tăng thêm lượng, nhân với số, xác lập thuộc tính, ) với tất phần tử khoảng [key1, key2] Tồn nhiều phép xử lý phức tạp hợp TREAP, phân chia TREAP thành vài TREAPs riêng biệt, thực dựa phép xử lý sở xét chi tiết đây: 1.2.1 Các phép xử lý sở Khai báo cấu trúc phần tử TREAP: Merge (Hợp TREAPs) Xét TREAP A có gốc a TREAP B có gốc b Giả thiết khóa A nhỏ khóa B (hoặc khơng lớn tổ chức TREAP với phần tử có khóa giống nhau) Cần tạo TREAP T từ phần tử A B, trả trỏ tới gốc T: Giả thiết khóa phần tử khác Khi gốc T phần tử A B có độ ưu tiên lớn Dễ dàng thấy phần tử a b Nếu a->p > b->p a gốc hợp Các phần tử B có khóa lớn a->k chúng gắn vào a->r Như toán ban đầu dẫn toán hợp a->r với B Khơng khó để nhận thấy quy trình xử lý thể sơ đồ đệ quy Đệ quy kết thúc rỗng Trường hợp gốc b xử lý tương tự split (Tách cây) Cho số k T với gốc t Yêu cầu tạo cây: A gồm phần tử T có khóa nhỏ k B – chứa phần tử lại T Hàm trả giá trị trỏ tới gốc Nếu t->k < k t thuộc A, trường hợp ngược lại – t thuộc B Giả thiết t thuộc A, t gốc A Khi phần tử t->l phần A có khóa nhỏ t->k – nhỏ k Với t>r tình hình phức tạp hơn: chứa phần tử có khóa nhỏ k lẫn phần tử có khóa khơng nhỏ k Ta xử lý theo sơ đồ đệ quy: tách t->r theo k, nhận A’ B’ TREAP A’ đặt chổ cho t->r, T chứa phần tử có khóa nhỏ k B’ chứa phần tử có khóa khơng nhỏ k Như kết tách T B’ Trường hợp t thuộc B – xử lý tương tự Đệ quy kết thúc T trở thành rỗng Tìm kiếm TREAP Việc tìm kiếm TREAP thực theo sơ đồ tìm kiếm nhị phân Dễ dàng thấy độ phức tạp q trình tìm kiếm khơng vượt O(logn) Như TREAP coi tìm kiếm nhị phân cân (tuy thân TREAP có cấu trúc phức tạp hơn) Ln ln giả thiết trỏ TREAPNode *t tới gốc TREAP Bổ sung phần tử Xét việc bổ sung phần tử với khóa key giá trị value vào T Phần tử xem TREAP Tn hoàn chỉnh bao gồm nút Như tiến hành hợp hai Tuy vậy, phải xử lý sơ bộ, chia T thành phần: T1 chứa phần tử có khóa nhỏ key T2 – chứa phần tử lại, sau thực hai phép hợp hoàn thành việc bổ sung phần tử vào Xóa phần tử Giả thiết phải loại bỏ khỏi T tất phần tử có khóa key Tách T thành T1 T2 theo khóa key, T1 chứa phần tử có khóa nhỏ key, T2 chứa phần tử lại Tách T2 theo khóa key+1, nhánh phải (T3) nhận chứa phần tử có khóa lớn key, T2 có phần tử có khóa key Hợp T1 T3 ta có kết cần tìm Nếu cần giải phóng nhớ phần tử bị xóa ta cần gọi hàm dispose: Tìm phần tử Việc tìm kiếm phần tử với khóa cho trước TREAP thực theo sơ đồ tìm kiếm nhị phân bình thường Mặt khác sử dụng cơng cụ merge() split() xây dựng để tìm kiếm Phần chứa phần tử cần tìm với khóa cho trước xác định hai lát cắt Sau trích xử lý kết cần khôi phục lại (bằng hai phép ghép) Cách xử lý đặc biệt có hiệu với truy vấn xử lý nhóm phần tử Nếu phần tử cần tìm khơng tồn kết Truy vấn phần tử theo nhóm Các truy vấn đòi hỏi phải làm việc với nhiều phần tử tính tổng tích, đếm số lượng, tìm giá trị max min, dễ dàng thực TREAP Xử lý truy vấn tồn Giả thiết cần tính tổng phần tử, đồng thời xác định số lượng phần tử Trong cấu trúc phần tử cần thay đổi: bổ sung thêm trường cnt sum để lưu số lượng tổng phần tử thuộc có gốc nút xét Trong khai báo cấu trúc trường cần khởi tạo giá trị phần tử Ngồi ra, cần có thêm hàm get(), sum() update() phục vụ cập nhật trường trình xây dựng Các phép merge() split() cần thay đổi thích hợp để phục vụ cho trường đưa vào Với nhánh nhận cần gọi hàm update() để chỉnh lý giá trị trường cnt sum Nếu cần tìm số lượng hay tổng phần tử cần truy nhập tới trường tương ứng phần tử gốc Xử lý truy vấn đoạn Giả thiết cần đếm số phần tử tổng phần tử có khóa nằm đoạn [k1, k2] Bằng hai lát cắt (tương tự tìm xóa phần tử) ta xác định nhánh chứa phần tử cần tìm Việc xác định giá trị quan tâm thực nêu mục Cập nhật theo nhóm phần tử Các phép cập nhật theo nhóm phần tử thay giá trị cũ giá trị mới, nhân số với giá trị nút, bổ sung thêm thuộc tính đó, Dưới ta xét việc cộng thêm số vào giá trị nút toàn đoạn Các loại cập nhật khác thực theo kiểu tương tự Cập nhật toàn Xét việc cộng thêm số vào giá trị tất nút Cần bổ sung vào cấu trúc TREAPNode trường add lưu giá trị cần tăng Trong khai báo cần gán giá trị đầu cho trường 10 Cấu trúc TREAP tương đối dễ lập trình, cơng cụ hữu hiệu giải nhiều loại tốn đòi hỏi xử lý truy vấn dạng: Các tốn đòi hỏi tổ chức đủ cân để tìm kiếm cập nhật (ví dụ, tổ chức tập hợp, tổ chức từ điển) Các loại toán xử lý truy vấn phạm vi đó, tốn cập nhật đoạn Khác với quản lý đoạn, TREAP cho phép xử lý truy vấn tập thay đổi, Tính toán số liệu thống kê với độ phức tạp O(logn), Phục vụ xây dựng cấu trúc liệu mạnh – TREAP với khóa ẩn 1.4-Hạn chế Tốn nhớ: nút phải lưu trữ nhiều trường liệu trung gian cho loại truy vấn khác nhau, Việc thay đổi cấu trúc nút kéo theo thay đổi phép xử lý bản,điều nà làm tăng độ phức tạp lập trình 1.5-TREAP với khóa ẩn Cấu trúc liệu vector C/C++ cho phép tổ chức mảng động với khả bổ sung phần tử vào cuối mảng xóa phần tử cuối danh sách Cấu trúc cho phép xác định cập nhật giá trị phần tử theo vị trí Giả thiết ta cần cấu trúc liệu với khả để bổ sung phần tử vào vị trí xóa phần tử với việc đánh số tự động lại phần tử mảng Cấu trúc liệu với tính chất nêu xây dựng dựa cấu trúc TREAP gọi TREAP với khóa ẩn (TREAP with implicit key) Như nói trên, TREAP cấu trúc liệu kết hợp nhị phân vun đống nhị phân Trong TREAP khóa x phục vụ tổ chức nhị phân lưu trữ tường minh Nhưng người ta vòng tránh việc lưu trữ khóa tường minh cách lấy số lượng phần tử nhánh trái phần 13 tử xét làm khóa tổ chức nhị phân Như vậy, phần tử lưu trữ tường minh độ ưu tiên y, khóa số thứ tự phần tử trừ Vấn đề phải giải bổ sung hay loại bỏ phần tử, số thứ tự phần tử bị thay đổi Nếu khơng có cách tiếp cận hợp lý, độ phức tạp phép bổ sung, loại bỏ có độ phức tạp O(n) làm ưu việt tìm kiếm nhị phân Lối khỏi tình rắc rối đơn giản Thay lưu trữ tường minh x người ta lưu trữ c – số lượng nút có gốc phần tử xét (bao gồm nút gốc) Đây đại lượng có miền xác định đủ nhỏ dễ dàng dẫn xuất cần thiết Lưu ý phép xử lý TREAP thực theo chiều từ xuống Nếu trình duyệt, từ gốc tới đỉnh ta cộng số lượng nút tăng thêm nhánh trái bị bỏ qua tới nút cần xét có tay khóa phần tử Các phép xử lý cấu trúc Hai phép xử lý cấu trúc cây: merge() – hợp cây, khóa x có giá trị nhỏ giá trị khóa kia, split() – tách thành cây, khóa x có giá trị nhỏ giá trị khóa Trong TREAP với khóa ẩn tham số cho hàm merge gốc cần hợp nhất: merge(root1,root) Lời gọi hàm split split(root,t) xác định việc tách thực cho nhánh trái có t nút 14 Xuất phát từ nút gốc, xét yêu cầu cắt k nút Giả thiết nhánh trái có l nút nhánh phải – r nút Có trường hợp xẩy ra: ♣ l ≥ k: cần gọi đệ quy split từ nút trái gốc với tham số k¸ đồng thời biến phần phải kết thành trái gốc, gốc xử lý phần phải kết quả, ♣ l < k: xử lý tương tự đổi vai trò trái phải, split gọi đệ quy từ nút phải với tham số k-l-1, phần trái kết nút trái phải, gốc – thuộc phần trái kết Để dễ hiểu tư tưởng thuật toán, bước xử lý trình bày đoạn mã giả sau (giải thuật xử lý xác C++ với đầy đủ hàm xét phần cuối) Trong trình hợp khơng có sử dụng giá trị khóa x hàm merge đượ xử lý TREAP bình thường Sau thao tác xử lý đỉnh cần ghi vào trường lưu trữ c tổng giá trị tương ứng nút cộng thêm Ứng dụng Bổ sung phần tử vào vị trí xét đồng thời trì tính chất ban đầu, 15 Di chuyển đoạn phần tử mảng sang nơi bất kỳ, Thực phép xử lý nhóm phần tử, kích thước nhóm thay đổi xác định lần xử lý, điều mà cấu trúc quản lý đoạn khơng đáp ứng được, Có thể thực việc đổi chổ phần tử vị trí chẵn sang vị trí lẻ ngược lại, Thực phép xử lý nêu cách hiệu xâu (cấu trúc Rope) 1.6-Bài tập áp dụng Bài 1: Hai đồ: Vệt đứt gãy lớn vỏ trái đất Banda Detachment nằm phía tây Thái bình dương, độ sâu đáy biển đạt tới km Nhiều ảnh địa hình chụp Để khảo sát vệt đứt gãy lớn người ta dùng máy thăm dò tự động Một số khe nứt tạo thành đường thẳng vùng thuộc kế hoạch thăm dò Theo dự kiến máy thăm dò tiến hành đo đạc khảo cứu đoạn có độ dài s Bộ nhớ thiết bị thăm dò chứa đồ cho tổng độ dài s Nếu phần có đồ tính Bộ phận chuẩn bị có thao tác bản: Thao tác A có dạng l r – xin cung cấp đồ khe nứt đoạn từ điểm l đến điểm r, l < r, Thao tác B có dạng k – trả đồ xin thao tác thứ k Đảm bảo thao tác thứ k thuộc loại A khơng có việc đồ bị trả lần Các thao tác đánh số từ 1, tồn nhiều đồ chụp đoạn (có l r giống nhau) Có n thao tác thực Sau thao tác xác định số cách khác chọn đồ khác cho tổng độ dài s Hai cách chọn gọi khác đồ (xác định theo trình tự xin cung cấp) có cách chọn thứ khơng có cách chọn thứ Ban đầu phận chuẩn bị chưa có đồ tay Dữ liệu: Vào từ file văn TWOMAPS.INP: Dòng chứa số nguyên s n (1 ≤ s ≤ 109, ≤ n ≤ 105), Mỗi dòng n dòng tiếp 16 theo chứa số nguyên xác định thao tác dạng A B, l, r có giá trị tuyệt đối khơng vượt 5×108 Kết quả: Đưa file văn TWOMAPS.OUT số cách chọn tính sau thao tác, kết đưa dạng số nguyên, số dòng Ví dụ: Giải thuật: Phương án A: Không sử dụng cấu trúc liệu TREAP Xét việc bổ sung đồ [l, r], Đặt s1=s-(r-l), có trường hợp xẩy ra: s1 < : thêm lựa chọn mới, s1 = : Số lựa chọn bổ sung số đoạn nằm gọn [l, r], s1 > : Số lựa chọn bổ sung tổng số đoạn có độ dài s1 nằm ngồi đoạn [l, r], cộng với số lượng đoạn có giao khác rỗng với [l, r] tổng độ dài phần chung s1 Để quản lý đoạn phục vị tìm kiếm cần lưu trữ: Điểm đầu đoạn số lượng điểm đầu trùng với theo khóa điểm cuối, Điểm cuối đoạn số lượng điểm cuối trùng với theo khóa điểm đầu, Điểm đầu đoạn số lượng điểm đầu trùng với theo khóa độ dài đoạn Khi r-l s thông tin lưu trữ nêu cho phép thống kê đoạn cần tìm có điểm đầu điểm cuối trùng với đoạn xét 17 Cần lưu trữ tổng tiền tố số lượng điểm đầu đoạn có độ dài khơng vượt q s-2, tức đoạn nằm gọn đoạn độ dài s khơng có chung điểm đầu điểm cuối với đoạn độ dài s Tổ chức liệu: Để thuận tiện lập trình dễ hiểu chuyển sang phương án dùng TREAP ta khai báo cấu trúc liệu hướng đối tượng (OOP), gắn phép xử lý với liệu Điều cho phép dù liệu lồng vào cấu trúc lưu trữ chuẩn nào, dạng lời gọi tới phép xử lý giữ nguyên Khai báo liệu 18 Xử lý: Thêm đồ [li,ri]: Cập nhật kết quả: ans+=cnt(l[i],r[i]); Cập nhật mảng ghi nhận liệu: Việc loại bỏ đồ: thực tương tự, cập nhật thơng tin trước, sau tính lại kết Độ phức tạp giải thuật: O(n2) 19 Phương án B: Sử dụng cấu trúc liệu TREAP Nhận xét: Độ phức tạp phương án A cao chèn liệu vào chổ cần thiết vectors để đảm bảo liệu ln xếp, từ áp dụng phương pháp tìm kiếm nhanh, Giải pháp: Tổ chức TREAP với trường sum phục vụ tính tổng tiền tố Gắn phép xử lý TREAP với cấu trúc Cấu trúc TREAP phép xử lý: theo sơ đồ lý thuyết nêu Lớp liệu Mset xác định sau: Khai báo liệu chương trình sơ đồ xử lý: giữ nguyên phương án A Độ phức tạp giải thuật: O(nlnn) Các tập áp dụng kỹ thuật Bài 2: C11 SEQ – Nguồn spoj.com 20 Cho N (N

Ngày đăng: 11/03/2020, 03:46

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan