espressività di Haskell ci permette di definire piuttosto facilmente una funzione Powerset:Generando direttamente sottoinsiemi specifici di un powerset?
import Control.Monad (filterM)
powerset :: [a] -> [[a]]
powerset = filterM (const [True, False])
Per essere in grado di svolgere il mio compito è fondamentale per detto Powerset per essere ordinato per una specifica funzione, quindi la mia implementazione sorta di simile a questo :
import Data.List (sortBy)
import Data.Ord (comparing)
powersetBy :: Ord b => ([a] -> b) -> [a] -> [[a]]
powersetBy f = sortBy (comparing f) . powerset
Ora la mia domanda è se c'è un modo per generare solo un sottoinsieme della Powerset dato un preciso start
e end
punto, dove f(start) < f(end)
e |start| < |end|
. Ad esempio, il mio parametro è un elenco di numeri interi ([1,2,3,4,5]
) e sono ordinati in base alla loro somma. Ora voglio estrarre solo i sottoinsiemi in un determinato intervallo, diciamo 3
a 7
. Un modo per raggiungere questo obiettivo sarebbe quello di filter
il Powerset per includere solo la mia fascia ma questo sembra (ed è) inefficace quando si tratta di sottoinsiemi più grandi:
badFunction :: Ord b => b -> b -> ([a] -> b) -> [a] -> [[a]]
badFunction start end f = filter (\x -> f x >= start && f x <= end) . powersetBy f
badFunction 3 7 sum [1,2,3,4,5]
produce [[1,2],[3],[1,3],[4],[1,4],[2,3],[5],[1,2,3],[1,5],[2,4],[1,2,4],[2,5],[3,4]]
.
Ora la mia domanda è se esiste un modo per generare direttamente questo elenco, senza dover generare tutti i sottoinsiemi 2^n
, poiché migliorerà drasticamente le prestazioni non dovendo controllare tutti gli elementi ma piuttosto generarli "al volo" .
Per una funzione di ordinamento arbitrario non si può davvero fare meglio. Cerca la struttura nella tua funzione di ordinamento che puoi sfruttare. – luqui
Che cos'è la funzione di ordinamento o quali sono le sue proprietà? Senza una certa conoscenza della funzione, non si può fare di meglio - si consideri ad esempio la funzione di essere un [funzione hash crittografica] (http://en.wikipedia.org/wiki/Cryptographic_hash_function). –