Cấu trúc dữ liệu có thể truy vấn hiệu quả để thể hiện một màn hình có các cửa sổ trên đó


7

(điều này có liên quan đến câu hỏi khác của tôi, xem tại đây )

Hãy tưởng tượng một màn hình, với 3 cửa sổ trên đó:

nhập mô tả hình ảnh ở đây

Tôi muốn tìm một cấu trúc dữ liệu hiệu quả để thể hiện điều này, đồng thời hỗ trợ các hành động này:

  • trả về một danh sách các tọa độ trong đó một cửa sổ đã cho có thể được định vị mà không bị chồng chéo với các cửa sổ khác
    • ví dụ trên, nếu chúng ta muốn chèn một cửa sổ có kích thước 2x2, các vị trí có thể sẽ là (8, 6), (8, 7), ..
  • Thay đổi kích thước cửa sổ trên màn hình mà không chồng lấp các cửa sổ khác trong khi duy trì tỷ lệ khung hình
  • chèn cửa sổ ở vị trí x, y (giả sử nó không trùng nhau)

Ngay bây giờ cách tiếp cận ngây thơ của tôi là giữ một loạt các cửa sổ và đi qua tất cả các điểm trên màn hình, kiểm tra từng cái nếu nó nằm trong bất kỳ cửa sổ nào. Đây là trong đó là chiều rộng, chiều cao của màn hình và là số lượng cửa sổ trong đó. Lưu ý rằng nói chung sẽ nhỏ (giả sử <10) trong đó mỗi cửa sổ chiếm nhiều không gian.O(nmw)n,mww


Vì tò mò, tại sao bạn cần tập hợp các điểm? Nếu đó là để giải quyết một số vấn đề khác, có thể có một cách tiếp cận tốt hơn về cơ bản. Nếu không có cửa sổ, nó sẽ vẫn là để xây dựng giải pháp, nghĩa là tất cả các điểm trong hình chữ nhật màu đỏ? Làm thế nào để bạn muốn đại diện cho tập hợp các điểm? O(nm)
Patrick87

@ Patrick87: Bạn đã đúng và có lẽ tôi đang tiếp cận điều này sai hướng. Tôi sẽ chỉnh sửa câu hỏi.
daniel.jackson

Câu trả lời:


3

Một tối ưu hóa dễ dàng cho thuật toán ngây thơ là bỏ qua một số điểm khi bạn kiểm tra một điểm được bao phủ bởi một cửa sổ. Giả sử bạn quét từ trái sang phải, từ trên xuống dưới. Nếu bạn gặp một trong cửa sổ , bạn có thể nhảy từ sang và tiếp tục. Nếu các cửa sổ lớn và không chồng chéo lên nhau, tôi sẽ phỏng đoán một cách điên cuồng sẽ cung cấp cho bạn thuật toán , trong đó là số điểm trong tập hợp bạn trả về.(x,y)w=(l,r,w,h)xl+w+1O(p)p

Trong thực tế, nó có thể có ích để xem liệu các cửa sổ thường rộng hơn hoặc cao hơn. Đối với các cửa sổ cao, tốt hơn là quét từ trên xuống dưới, từ trái sang phải; Đối với các cửa sổ rộng, phương pháp được thảo luận ở trên sẽ thắng. Bạn có thể có thể lấy ý tưởng và thực hiện quét / bỏ qua đường chéo để có được hiệu suất cân bằng trên bảng.

Trong thực tế, quét từ trái sang phải, từ trên xuống dưới, bạn có thể nhớ các hàng tiếp theo (giá trị của ) mà bạn sẽ cần bỏ qua ở cùng giá trị với cùng giá trị , nếu bạn đạt đến (bạn có thể không nếu có một cửa sổ khác trùng nhau). Điều này sẽ làm cho việc quét từ trên xuống dưới, từ trái sang phải và đường chéo không cần thiết để có được hiệu suất tốt tương đương.hyxl+w+1x

Tổng quát hơn, giờ đây bạn có hai cấu trúc dữ liệu: một với tiền xử lý / tổng phí xây dựng và tra cứu và một với (có thể, bạn có thể làm tốt hơn hoặc có thể tối ưu hóa của tôi không thực sự đạt được điều này) tiền xử lý / xây dựng và có thể (bảng băm / tra cứu) hoặc (BST). Vì vậy, đã có hai lựa chọn thay thế, cả hai đều khá tốt, thực sự ...O(1)O(w)O(p)O(1)O(logp)


Làm thế nào bạn sẽ đạt được những gì bạn mô tả trong đoạn thứ ba? Ngay bây giờ tôi đã thực hiện đề xuất đầu tiên của bạn bằng cách đi qua tất cả các cửa sổ và nếu có sự trùng lặp, tôi sẽ bỏ qua. Điều này chạy trong một vòng lặp cho đến khi tọa độ (x, y) của cửa sổ hiện tại tôi đang cố gắng điều chỉnh không thay đổi trong một lần lặp duy nhất.
daniel.jackson

Có thể duy trì một bảng băm gồm ba lần (y-counter, trái, phải) với phần tử ở giữa xác định hàm băm; thêm một và khởi tạo thành (y + h, x - 1, l + w + 1) khi bạn nhấn một hình chữ nhật; kiểm tra bảng trước khi quét qua các hình chữ nhật; nếu y> y_max, bỏ qua và xóa; một cái gì đó như thế, có thể.
Patrick87
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.