Nếu tôi có một phạm vi lớn các phạm vi liên tục (ví dụ: [0..5], [10..20], [7..13], [- 1. .37]) và có thể sắp xếp các bộ đó thành bất kỳ cấu trúc dữ liệu nào tôi thích, cách hiệu quả nhất để kiểm tra là gì đặt một số thử nghiệm cụ thể thuộc về?thuật toán hiệu quả để kiểm tra _which_ đặt một số cụ thể thuộc về
Tôi đã nghĩ về việc lưu trữ các bộ trong cây nhị phân cân bằng dựa trên số lượng thấp của một tập hợp (và mỗi nút sẽ có tất cả các tập có cùng số lượng thấp nhất của tập hợp của chúng). Điều này sẽ cho phép bạn prune hiệu quả số lượng các bộ dựa trên việc test_number bạn đang thử nghiệm với các bộ là ít hơn số thấp nhất của một tập hợp, và sau đó cắt tỉa nút đó và tất cả các nút ở bên phải của nút đó (mà có số thấp trong phạm vi của chúng lớn hơn số test_number). Tôi nghĩ rằng sẽ cắt giảm khoảng 25% của các bộ trung bình, nhưng sau đó tôi sẽ cần phải tuyến tính nhìn vào tất cả các phần còn lại của các nút trong cây nhị phân để xác định xem test_number thuộc về những bộ. (Tôi có thể tối ưu hóa thêm bằng cách sắp xếp danh sách các bộ tại bất kỳ nút nào bằng số cao nhất trong tập hợp, cho phép tôi thực hiện tìm kiếm nhị phân trong một danh sách cụ thể để xác định tập hợp nào, nếu có, chứa số test_number. Tôi nghĩ rằng vấn đề này đã được giải quyết trong xử lý đồ họa vì họ đã tìm ra các cách để kiểm tra hiệu quả các đa giác nào trong toàn bộ mô hình của chúng sẽ đóng góp. với một pixel cụ thể, nhưng tôi không biết thuật ngữ của loại thuật toán đó.
Cây phân khúc không phải là phương pháp nhanh nhất để chỉ đếm số lượng bộ. Vì nó sẽ yêu cầu O (m. (Log (n) + k)) trong đó m là số kiểm tra, và k là số tập hợp nó rơi vào, n là tổng số bộ. Thuật toán của tôi là O (m.log (n)) –
Mehrdad, ý tưởng của bạn là cạnh tranh nhất cho các tập dữ liệu thích hợp. Nhưng cây phân khúc linh hoạt hơn nhiều. Nó có thể xử lý gấp đôi trong khi của bạn được giới hạn trong số nguyên. Và nó sẽ dễ dàng xử lý các phạm vi rộng lớn (nói [0..2000000000] sẽ làm cho bạn trở thành một con heo khổng lồ về không gian và thời gian – Sol
Nếu bạn chỉ muốn đếm, bạn chỉ cần lưu trữ số lượng bộ trong cây phân đoạn và sau đó chi phí để lấy số trở thành O (n log n) –