Ich habe eine Reihe von Bereichen wie {(2-8), (13-22), (380-7931), (40032-63278)}. Der Einfachheit halber können wir annehmen, dass sie sich nicht überschneiden (überlappende Bereiche wurden bereits zusammengeführt).Algorithmus zur Abdeckung von Speicherbereichen?
Mein Ziel ist es, diese Bereiche mit Kombinationen aus einer gegebenen Menge von "Längen" wie {4, 64, 1024, 16384} zu "bedecken". Ich bin gezwungen, höchstens N Längen zu verwenden, wie N = 32. Es ist mir egal, wie viele "Längen" ich verwende, solange ich unter meinem Maximum liege, aber ich möchte den gesamten "zusätzlichen" Bereich minimieren - Zahlen, die von Längen "bedeckt" sind, die nicht in der anfänglichen Reihe von Bereichen sind.
Beispiel {(2-8)} von (2-66) abgedeckt (eine Länge von 64 verwendet) hat 58 "Extra" -Zahlen. {(2-8)}, die von {(2-6), (6-10)} (zwei Längen von 4) bedeckt sind, hat nur 2 "extra" -Zahlen und ist vorzuziehen.
Meine reale Anwendung beinhaltet die Vorprogrammierung eines festen MMU-TLB, um sicherzustellen, dass nur bestimmte Bereiche von Speicheradressen zugänglich sind (TLB-Misses stellen somit einen verbotenen Zugriff dar) & kann entsprechend behandelt werden). Ich möchte die Bereiche so eng wie möglich abdecken, damit Verletzungen eher früher als später aufgedeckt werden, aber ich habe nur 32 Steckplätze und 4 feste Seitengrößen. Ich kann meinen Code von Hand auf ein angemessenes Leistungsniveau einstellen, aber ich bin neugierig, ob es eine elegantere/allgemeinere Lösung für das Problem gibt. Es scheint mit dem Rucksackproblem verwandt zu sein, aber es ist schwierig genug zu suchen.