wyrazistość Haskell'a pozwala nam dość łatwo zdefiniować funkcję PowerSet:Bezpośrednie generowanie określonych podzbiorów zestawu?
import Control.Monad (filterM)
powerset :: [a] -> [[a]]
powerset = filterM (const [True, False])
aby móc wykonać swoje zadanie to ma zasadnicze znaczenie dla wspomnianej PowerSet być klasyfikowane według określonej funkcji, więc moja realizacja rodzaj wygląda następująco :
import Data.List (sortBy)
import Data.Ord (comparing)
powersetBy :: Ord b => ([a] -> b) -> [a] -> [[a]]
powersetBy f = sortBy (comparing f) . powerset
teraz moje pytanie brzmi, czy istnieje sposób, aby wygenerować tylko podzbiór z PowerSet danego konkretnego start
i end
punkt, gdzie f(start) < f(end)
i |start| < |end|
. Na przykład, moim parametrem jest lista liczb całkowitych ([1,2,3,4,5]
) i są one sortowane według ich sum. Teraz chcę wyodrębnić tylko podzbiory w danym zakresie, powiedzmy 3
do 7
. Jednym ze sposobów osiągnięcia tego celu byłoby filter
PowerSet tylko to moim przedziale, ale to wydaje się (i jest) nieskuteczny gdy ma do czynienia z większymi podzbiory:
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]
produkuje [[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]]
.
Teraz moje pytanie brzmi: czy istnieje sposób na bezpośrednie wygenerowanie tej listy, bez konieczności generowania wszystkich podzbiorów 2^n
w pierwszej kolejności, ponieważ poprawi ona wydajność drastycznie, bez konieczności sprawdzania wszystkich elementów, ale raczej generowania ich "w locie" .
Dla funkcji zamawiania dowolnych rzeczy nie można zrobić nic lepszego. Poszukaj struktury w swojej funkcji porządkowania, którą możesz wykorzystać. – luqui
Co to jest funkcja zamawiania lub jakie są jej właściwości? Bez pewnej wiedzy na temat tej funkcji nie można zrobić nic lepiej - rozważmy na przykład funkcję będącą [kryptograficzną funkcją mieszającą] (http://en.wikipedia.org/wiki/Cryptographic_hash_function). –