2012-09-24 36 views
6

Tôi có một tập hợp các phạm vi như {(2-8), (13-22), (380-7931), (40032-63278)}. Để đơn giản, chúng tôi có thể giả định rằng chúng không trùng lặp (các phạm vi chồng chéo đã được hợp nhất).Thuật toán để bao gồm phạm vi bộ nhớ?

Mục tiêu của tôi là "che" các dải ô này bằng cách sử dụng các kết hợp của một tập hợp "độ dài" nhất định chẳng hạn như {4, 64, 1024, 16384}. Tôi bị hạn chế sử dụng tối đa N độ dài, chẳng hạn như N = 32. Tôi không quan tâm bao nhiêu "độ dài" tôi sử dụng miễn là tôi dưới mức tối đa của tôi, nhưng tôi muốn giảm thiểu tổng số "thêm" khu vực - số "được bảo hiểm" theo độ dài không nằm trong tập hợp dải ô ban đầu.

Ví dụ {(2-8)} được bao phủ bởi (2-66) (một chiều dài 64 được sử dụng) có 58 số "phụ". {(2-8)} được bao phủ bởi {(2-6), (6-10)} (hai độ dài 4) chỉ có 2 số "phụ" và thích hợp hơn. Ứng dụng thế giới thực của tôi liên quan đến việc lập trình trước một TLB MMU cố định để đảm bảo rằng chỉ có một số địa chỉ bộ nhớ nhất định có thể truy cập được (TLB bị thiếu do đó đại diện cho quyền truy cập bị cấm & có thể được xử lý theo đó). Tôi muốn bao gồm các phạm vi càng chặt càng tốt để các vi phạm được phát hiện sớm hơn là sau này, nhưng tôi chỉ có 32 vị trí để làm việc với 4 kích thước trang cố định. Tôi có thể điều chỉnh mã của mình bằng tay đến một mức hiệu suất đầy đủ, nhưng tôi tò mò nếu có một giải pháp mục đích trang nhã/tổng quát hơn cho vấn đề này. Nó có vẻ liên quan đến vấn đề chiếc ba lô nhưng đủ khác nhau, rất khó để tìm kiếm.

Trả lời

1

Điều này có thể được xây dựng dưới dạng biến thể của Shortest path problem.

Chúng tôi cần phải bao gồm một tập hợp các dãy tổng chiều dài M với ít nhất Ntrang. Trang có thể có L độ dài khác nhau, chúng không được căn chỉnh (có thể được đặt ở bất kỳ địa chỉ nào).Sự khác biệt giữa tổng diện tích "phụ" và tổng chiều dài trang bằng hằng số M, cho phép giảm tổng chiều dài trang.

Hãy xây dựng biểu đồ, liên quan đến vấn đề này. Mỗi địa chỉ bộ nhớ trong bất kỳ phạm vi đều có đỉnh tương ứng trong biểu đồ. Mỗi đỉnh có L cạnh đi, tương ứng với Ltrang, bắt đầu từ địa chỉ đã cho. Độ dài của mỗi cạnh bằng trang chiều dài. Mỗi cạnh nói đến một số đỉnh trong đồ thị dưới, tùy thuộc vào nơi tương ứng trang đầu:

  1. Trang kết thúc ở một số vị trí trống. Cạnh đến đỉnh, tương ứng với địa chỉ bắt đầu của dải đầu tiên sau vị trí này.
  2. Trang kết thúc bên trong một số phạm vi . Cạnh đến đỉnh, tương ứng với địa chỉ cuối của trang.
  3. Trang kết thúc ở vị trí trống, có địa chỉ, lớn hơn địa chỉ của bất kỳ phạm vi nào. Cạnh đến đích đến đỉnh. (Địa chỉ bắt đầu của dãy đầu tiên là tương ứng với nguồn đỉnh và chúng ta nên tìm đường đi ngắn nhất giữa hai đỉnh này).

Do biểu đồ kết quả là DAG, đường ngắn nhất có thể được tìm thấy theo thời gian tuyến tính.

Đối với mỗi đỉnh giữ một mảng là N cặp {chiều dài đường dẫn, con trỏ ngược}. Trong khi thuật toán đường đi ngắn nhất truy cập bất kỳ đỉnh nào, hãy lập chỉ mục mảng này với số bước nhảy trong đường dẫn và nếu đường dẫn ngắn hơn chiều dài đường dẫn được lưu trữ, hãy thay {path-length, back-pointer}. Khi mỗi đỉnh được xử lý, tìm đường đi ngắn nhất trong mảng các cặp, thuộc về đích đỉnh, sau đó tạo lại đường dẫn bằng cách sử dụng con trỏ ngược. Đường dẫn này mô tả bìa tối ưu.

Độ phức tạp của trường hợp xấu nhất O (L * M * N) được xác định bởi số cạnh tối đa (L * M) và số phần tử trong mảng, thuộc mỗi đỉnh (N). Nếu phạm vi là thưa thớt, hầu hết các cạnh đến địa chỉ bắt đầu của một số phạm vi, hầu hết các đỉnh, tương ứng với địa chỉ nội bộ đều không được sử dụng và độ phức tạp thời gian ít hơn nhiều.

Thuật toán này yêu cầu không gian O (M * N), nhưng cho thưa thớt phạm vi điều này có thể giảm đáng kể nếu chúng ta đặt tất cả các đỉnh đồ thị (hoặc có thể tất cả các cặp chiều dài/con trỏ) vào bản đồ băm.

0

Hãy xem xét phạm vi bạn muốn bao gồm khoảng thời gian rất thấp (cho phép gọi chúng là "phạm vi") và khoảng trống (gọi chúng là "extras") là khoảng thời gian rất tốn kém. Bây giờ chúng tôi muốn giảm thiểu tổng chi phí với tối đa N khoảng thời gian (gọi "bao gồm") bao gồm tất cả các "phạm vi" và có thể chứa một số "extras". Thuật toán dưới đây là tham lam trong tự nhiên.

Đầu tiên lấy tất cả các khoảng thời gian mà bạn muốn bao gồm ("dải ô") và cũng là "phần bổ sung" ở giữa chúng.

1) Che chúng với một khoảng thời gian lớn từ nhỏ đến tối đa "dải ô".

2) Lặp lại và loại bỏ "chi phí bổ sung" tốn kém nhất (tức là khoảng cách lớn nhất) ở giữa và cũng tính số nguyên đó là tạo thêm "bìa", cho đến khi số lượng bìa trở thành N hoặc bạn hết tốn kém "extras".

0

dưới lên phương pháp tham lam mà hoạt động khi mỗi chiều dài là bội số của người cuối cùng:

Bắt đầu với một tập hợp các khoảng thời gian tối thiểu dài trong đó bao gồm tất cả các dãy tối thiểu. Hợp nhất các lần chạy dài nhất lặp đi lặp lại cho đến khi bạn đi dưới phạm vi số tối đa.

Trong trường hợp của bạn, trên TLB, bạn có thể có các ràng buộc liên kết sẽ làm cho vấn đề trở nên phức tạp hơn một chút.

Các vấn đề liên quan