2010-11-27 17 views

cevap

19

Sanırım haklısınız. Listenin omurgaları paylaşılamaz, çünkü tüm kuyruklar farklıdır. Bu nedenle, tam olarak değerlendirildiyse, öneklerin listesi, oluşturmak için Ω (n) alması gereken tam Θ (n) boşluğunu alacaktır.

Yazdığınız işlevin (lazier sürümü) Data.Listinits olarak bulunduğunu unutmayın.

Yapabildiğiniz temiz bir optimizasyon var. Bu denklem tutan: doğrusal zamanda

map (foldl f z) . inits = scanl f z 

Ve scanl çalışır. Böylece, her bir önek için yapmak istediğiniz şeyi sol kat olarak ifade ederseniz, öneklerin listesini oluşturmanın karesel karmaşıklığından kaçınabilirsiniz.

+2

+1 scanl ile güzel bir fikir –

3

Bu temsile bağlı değil mi? Listeleri bitişik depolama alanı artı başlatma ve bitiş dizini olarak gösterirseniz (bytestrings öğesine benzer), depolamayı paylaşabilir ve yalnızca indeks listesini oluşturmak için bir kez geçiş yapmanız gerekir. Algoritma sadece temsil değil, değişmeyecekti. Bu özel kullanım durumu için, snoc listelerini (ikili listeler, ancak listenin başlangıcı değil, sondan yuvalanmış) kullanarak, alt listelerin paylaşılmasına da izin verilir, değil mi?

+0

Sanırım göreceli olarak açık, bu soruyu sıradan bir haskell listesi olan [] 'hedefliyor. -1 – fuz

+2

Örneğin sözdizimine veya belirtildiği gibi soruya bakıp bakmadığınıza bağlıdır. Kabul edilen cevap verildiğinde, ikili listelere sınırlama getirilmiş olabilir. Ancak bu, sadece bu belirli liste gösteriminin sadece Haskell'deki algoritmaların bile, tamamen işlevsel algoritmaların bir özelliği değildir. – claus

+0

Evet, ikili listelere sınırlama amaçlandı. Bunu daha net yapabilirdim. –

İlgili konular