Tengo un conjunto de rangos como {(2-8), (13-22), (380-7931), (40032-63278)}. En aras de la simplicidad, podemos suponer que no se superponen (los rangos de solapamiento ya se han fusionado).Algoritmo para cubrir rangos de memoria?
Mi objetivo es "cubrir" estos rangos utilizando combinaciones de un conjunto dado de "longitudes" como {4, 64, 1024, 16384}. Estoy obligado a usar como máximo N longitudes, como N = 32. No me importa cuántas "longitudes" utilizo siempre que esté por debajo de mi máximo, pero quiero minimizar el área total "extra": números "cubiertos" por longitudes que no están en el conjunto inicial de rangos.
El ejemplo {(2-8)} cubierto por (2-66) (se utiliza una longitud de 64) tiene 58 números "adicionales". {(2-8)} cubierto por {(2-6), (6-10)} (dos longitudes de 4) tiene solo 2 números "adicionales" y es preferible.
Mi aplicación en el mundo real implica la preprogramación de un MMU TLB fijo para garantizar que solo ciertos rangos de direcciones de memoria sean accesibles (por lo tanto TLB no representa un acceso prohibido &). Me gustaría cubrir los rangos lo más estrictamente posible para detectar las violaciones más temprano que tarde, pero solo tengo 32 ranuras para trabajar y 4 tamaños de página fijos. Puedo sintonizar mi código a mano con un nivel de rendimiento adecuado, pero tengo curiosidad por saber si hay una solución más elegante/de propósito general para el problema. Parece estar relacionado con el problema de la mochila, pero lo suficientemente diferente que ha sido difícil de buscar.