A legjobb, amit elér az, hogy egy mátrix összegek az egyes párok, majd egyesíteni a sorok együtt, a-la merge sort. Úgy érzem, hogy hiányzik néhány egyszerű betekintést, mely felfedi egy sokkal hatékonyabb megoldás.
Saját algoritmus, Haskell:
matrixOfSums list = [[a+b | b <- list, b >= a] | a <- list]
sortedSums = foldl merge [] matrixOfSums
--A normal merge, save that we remove duplicates
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = case compare x y of
LT -> x:(merge xs (y:ys))
EQ -> x:(merge xs (dropWhile (==x) ys))
GT -> y:(merge (x:xs) ys)
Találtam egy kisebb javulás, az egyik, hogy sokkal alkalmasabb arra lusta stream-alapú kódolás. Ahelyett, hogy egyesíti a oszlopokban páronként, összeolvad mindet egyszerre. Az előnye az, hogy elkezd szerzés lista elemei azonnal.
-- wide-merge does a standard merge (ala merge-sort) across an arbitrary number of lists
-- wideNubMerge does this while eliminating duplicates
wideNubMerge :: Ord a => `a` -> [a]
wideNubMerge ls = wideNubMerge1 $ filter (/= []) ls
wideNubMerge1 [] = []
wideNubMerge1 ls = mini:(wideNubMerge rest)
where mini = minimum $ map head ls
rest = map (dropWhile (== mini)) ls
betterSortedSums = wideNubMerge matrixOfSums
Azonban, ha tudod, hogy fogsz használni az összes összegek, és nincs előnye, hogy néhány közülük korábban megy „ foldl merge []
”, mivel ez gyorsabb.