Katlama bazen katlamadan bazen daha yavaş mıdır? Ben Düzgün çalışır (zaman karmaşıklığı (n) O) "a" (++) ile birlikte katlama, katlamadan çok daha yavaştır
a = [[1],[2],[3]]
gibi listelerin bir liste var ve
foldr (++) [] a
kat kullanarak bir listeye değiştirmek istiyorum. Fakat bunun yerine katlanırsam, çok yavaştır (zaman karmaşıklığı O (n^2)).
foldl (++) [] a
foldl sadece sol taraftan giriş listesini katlama ise,
(([] ++ [1]) ++ [2]) ++ [3]
ve foldr sağ taraftan ise,
[1] ++ ([2] ++ ([3] ++ []))
hesaplamaların sayısı (++) her iki durumda da aynı olması gerekiyordu. Foldr neden bu kadar yavaş? Zaman karmaşıklığına göre, katlama giriş listesini iki kez katr olarak tarar gibi görünüyor. Ben Çünkü nasıl ++
eser bulunuyor süre
length $ fold (++) [] $ map (:[]) [1..N] (fold is either foldl or foldr)
Her iki durumda da '(++)' ın * sonuç * aynı olması beklenir. Bu, hesaplamaların sayısının aynı olduğu anlamına gelmez. –
(büyük liste) ++ (küçük liste) daha küçüktür (küçük liste) ++ (büyük liste) – immibis
Uzun zamandır burada olduğunuzu gördüm ve birini kabul etmeden çok soru sordum. Bir cevap size yardımcı olursa [kabul etmeyi] düşünün (https: // stackoverflow.com/help/kabul-cevap). Ayrıca bu sitenin nasıl çalıştığını anlamak için bir [tur] (https://stackoverflow.com/tour) yaparak 2 dakika harcayalım. –