2012-03-25 19 views
6

Niedawno zauważyłem, że było to bardzo wyraźny realizacja Sortowanie przez wstawianie tutaj:Sporządzenie listy „unlazy” w Clojure

Insertion sort in clojure throws StackOverFlow error

  • który cierpi z powodu przepełnienia pamięci, ze względu na fakt, że concat leniwie łączy listy. Zastanawiam się:

Jakie strategie możemy zastosować do "odroczenia" listy, gdy chcemy poprawić wydajność w dużych kolekcjach?

+0

Hmm ... Po przejściu kilku kolejnych badań, jasne jest, że prostą odpowiedzią na to pytanie jest użycie funkcji "doall" do owinięcia kolekcji. Zakładam jednak, że mogą tu pojawić się pouczenia, o których warto wiedzieć. – jayunit100

Odpowiedz

5

doall jest z pewnością w porządku do wymuszania leniwej oceny.

Inną użyteczną rzeczą do zapamiętania jest to, że reduce nie jest leniwy. Może to być bardzo przydatne w dużych obliczeniach, aby zapewnić, że wyniki pośrednie zostaną ocenione i zredukowane do pojedynczej wartości wyjściowej przed rozpoczęciem obliczeń.

+0

Nie do końca rozumiem. 'doall' wykona zadanie, a" zmniejszanie "gromadzenia w wektorze zapewnia również rozwiązanie, którego nie powinno się natychmiast odrzucać. Wynik ma szybki losowy dostęp, który może być interesujący dla niektórych aplikacji. (Powiedziałoby to, że 'vec' wokół wynikowej sekwencji dałoby ten sam rezultat.) – kotarak

+0

Zgadzam się, że wszystko by działało ... Faktycznie to działało Próbowałem tego po tym, jak opublikowałem to pytanie, odnośnie do drugiego odnośnika . Proszę skomentuj. – jayunit100