Dans le HaskellWiki https://wiki.haskell.org/Performance/Laziness ils introduisent la fonction de fusion de tri comme non paresseuxHaskell: tête. mergeSort (pour l'élément min) en temps linéaire?
merge_sort [] = []
merge_sort [x] = [x]
merge_sort lst = let (e,o) = cleave lst
in merge (merge_sort e) (merge_sort o) where
merge :: (Ord a) => [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge [email protected](x:t) [email protected](y:u)
| x <= y = x : merge t ys
| otherwise = y : merge xs u
depuis que vous avez à cliver récursive la liste
cleave = cleave' ([],[]) where
cleave' (eacc,oacc) [] = (eacc,oacc)
cleave' (eacc,oacc) [x] = (x:eacc,oacc)
cleave' (eacc,oacc) (x:x':xs) = cleave' (x:eacc,x':oacc) xs
puis, en remontant les couches de réduction, fusion celles-ci. Un fusion-tri s'exécute donc en n (log n) temps. Mais la composition
min xs = head . merge_sort $ xs
fonctionne supposément en temps linéaire. Je ne vois pas pourquoi, car vous devez encore cliver chaque sous-liste jusqu'à ce que vous arriviez à la liste singleton/vide, puis fusionnez-les pour garantir que le premier élément de la liste retournée est le plus petit de tous. Qu'est-ce que je rate?