2012-10-02 23 views
12

Bu yayın yalnızca scala.collection.mutable.LinkedList öğelerini açıklar. Diğer uygulamalar bu iş parçacığının konusu değildir.LinkedList için durum kullan

Sorum şu: Bu sınıfın kullanım durumu nedir? Ben hiçbirinin yararı sağlamazken hem değişebilir hem de değişmez yapıların problemlerine sahip olduğunu düşünüyorum. Çünkü söylemek: bir değişmez API (filter, map, drop, take vb tüm yerinde değişiklikler yeni LinkedList dönmek yerine yapıyor)

  • sanki

    • API bana bakıyor bütün değişmez bağlantılı listenin faydaları o var elem ve var next yoluyla (hala değişken olduğundan en azından ben, yani yapılar arasındaki maksimum paylaşımı, mevcut olmadığı tahmin vardır.

    yani temelde biz doğrusal bir erişim zaman var, doğrusal ap pend zamanı, doğrusal boşluk vb. ve uzay karmaşıklığı veya kod hakkında akıl yürütme yeteneği için gösterilecek hiçbir şey (belki de O (1) eklemeye devam etse de yine de değişmez listelerin olduğu durum).

    Bu tür bir yapının önemli bir faydasını göremiyorum? Bu sınıfa uygulanabilen nesnel önlemler ve/veya kullanım vakaları arıyorum.

  • +1

    Değişmez sınıfın etrafına ince bir sarıcı gibi görünüyor. Faydası: Kim yazdıysa hatalar hakkında endişelenmeden, çok çabuk yapabildi mi? – bdares

    +4

    @bdares bunu ne düşündürüyor? Kaynağa hızlıca baktım ve böyle bir şey olmadığı anlaşılıyor. –

    +0

    hmmm ... herhangi bir değiştirilebilen tipte olduğu gibi, birkaç işaretçiden referans alınabilir ve düzenlendikten sonra değişiklikler tüm işaretçilerden görülecektir. Bunun zaman-karmaşıklığı ile ilgisi yok. – Oren

    cevap

    4

    Bunun nedeni karmaşıklık olduğunu söyleyebilirim - bağlantılı liste sınıfı listenin ortasındaki bir düğüme başvuruda bulunmanıza izin verir ve o düğümün başına geçmek yerine, o düğümde insert veya update kullanın. liste. Bazı dizide bir değişiklik (yukarıdaki myReference) olur tam olarak nerede bir uygulamada

    [] --> [] --> ... --> [] --> ... --> [] --| 
    ^     ^
    head     myReference 
    

    , ( immutable.List ile durum olurdu bu konuma her şeyi kopyalamak yerine bu konumu değiştirmek için çok daha az maliyeti yani myReference'dan sonra yeni bir düğüm ekliyorum.

           myNewNode 
              v 
    [] --> [] --> ... --> [] --> [] ---> ... --> [] --| 
    ^     ^
    head     myReference 
    

    böyle bir uygulamanın bir örneği - Bir dize bölümlerini genişletmek bir L-system. Yeni düğümlerin yerinde eklenmesi çok daha ucuzdur, çünkü genişletilmesi gereken her zaman tüm dizeyi kopyalamaktır.

    diğer nedeni tamamlanmasının - extra LinkedList sınıf standart kütüphane boyutuna düşük maliyetle geldi sağlayan ortak altyapı DoubleLinkedList ve LinkedListLike pay beri bir sürü.

    +0

    yeterince iyi neden. Yine de, harita, filtre vb. Gibi yerinde deyimler için uygulama yapılmamasının özel bir sebebi var mı? – m09

    +0

    Bu konuda bir çok tartışma var.Bu kısmen, birçoğunun performans nedenleriyle (inanıyorum ya da olmasın) kolayca ya da hiç uygulanamaz (bir 'Array' ya da 'patch', hatta bir 'flatMap' yerinde 'filter' yerine) olmadığı içindir. , yerinde bir güncelleme her zaman bir kopyalama-güncellemesinden daha hızlı değildir ve bir şekilde adlandırma sorunları nedeniyle. Bununla birlikte, mutable sekanslar üzerinde jenerik olarak uygulanabilen tek bir işlem vardır ve bu, her bir öğede basitçe 'update' olarak adlandırılan 'transforme' dir. – axel22

    +0

    Bu benim için mantıklı, ama yine de, bu uygulamaların mümkün olabileceği genel özelliklerin neden boş bırakıldığını merak ediyorum. Her halükarda, uygulamak ve uygulamak için çok zor olmadıkları için API'daki gürültüyü önceden yapılmış uygulamalara tercih etmek tercih edilir. Teşekkürler :) – m09

    İlgili konular