Buradaki ifadelerin bazıları kafa karıştırıcı ya da yanlış, özellikle değişmez olduğu fikri. Scala'daki vektör ArrayList gibi bir şey. List ve Vector değişmez, kalıcı (yani "değiştirilmiş bir kopya almak için ucuz") veri yapılarıdır. Değişebilir veri yapıları için makul bir varsayılan seçenek yoktur, ancak algoritmanızın ne yaptığına bağlıdır. Liste tek başına bağlantılı bir listedir, Vector ise bir taban-32 tam sayı trie iken, 32 derece düğümlü bir tür arama ağacıdır. Bu yapıyı kullanarak, Vector en yaygın işlemleri oldukça hızlı sağlayabilir, yani O (log_32 ( n)). Bu, baş / kuyrukta başa ekleme, ekleme, güncelleme, rasgele erişim, ayrışma için çalışır. Ardışık sırada yineleme doğrusaldır. Öte yandan liste sadece doğrusal yineleme ve sabit zaman başlangıcı, baş / kuyrukta ayrışma sağlar.
Bu, Vector neredeyse tüm durumlarda Liste için iyi bir yedek gibi görünebilir, ancak başa dönme, ayrışma ve yineleme genellikle işlevsel bir programdaki diziler üzerinde önemli işlemlerdir ve bu işlemlerin sabitleri vektör nedeniyle (daha) daha yüksektir. daha karmaşık yapısına. Birkaç ölçüm yaptım, bu yüzden yineleme liste için yaklaşık iki kat daha hızlı, başa çıkma listelerde yaklaşık 100 kat daha hızlı, baş / kuyrukta ayrışma listelerde yaklaşık 10 kat daha hızlı ve çaprazlanabilir bir üretimden vektörler için yaklaşık 2 kat daha hızlı. (Muhtemelen bunun nedeni, Vector öğelerini tek tek eklemek veya eklemek yerine bir oluşturucu kullanarak oluşturduğunuzda 32 öğenin dizilerini aynı anda ayırabilmesidir).
Peki hangi veri yapısını kullanmalıyız? Temel olarak, dört yaygın durum vardır:
- Dizileri yalnızca harita, filtre, katlama vb. İşlemlerle dönüştürmemiz gerekir: temelde önemli değil, algoritmamızı genel olarak programlamalıyız ve hatta paralel dizileri kabul etmekten faydalanabiliriz. Sıralı işlemler için Liste muhtemelen biraz daha hızlıdır. Ancak optimizasyon yapmanız gerekiyorsa karşılaştırmalı değerlendirmeniz gerekir.
- Çok sayıda rastgele erişime ve farklı güncellemelere ihtiyacımız var, bu yüzden vektör kullanmalıyız, liste yasak yavaş olacak.
- Listeler üzerinde klasik işlevsel bir şekilde çalışır, bunları tekrarlayarak ve yinelemeli ayrışmayla yineleyerek oluştururuz: kullanım listesi, vektör 10-100 veya daha fazla faktör kadar yavaşlar.
- Temelde zorunlu olan ve bir listede çok sayıda rasgele erişim gerçekleştiren, hızlı sıralama gibi bir şey olan, performans açısından kritik bir algoritmaya sahibiz: örneğin, ArrayBuffer gibi zorunlu bir veri yapısı kullanın ve verilerinizi yerel olarak ve ona kopyalayın.
List<String> l = new ArrayList<String>()
Scala bloglar size herkesin kalıcı koleksiyon iyiliği elde etmek için List'i kullandığına inanmasını isterdim - ama Vector genel amaçlı onu List'in yerinde kullanmamız yeterli mi?