Kaldırma operatörleri, Seq
parçası değildir, ama aslında scala.mutable
altında Buffer
özelliği parçası. (Bkz. Buffers)
Performance Characteristics numaralı ilk tabloya bakın. buf remove i
'un, hem ArrayBuffer
hem de ListBuffer
için doğrusal olan ekleme ile aynı özelliğe sahip olduğunu tahmin ediyorum. Array Buffers belgesinde belirtildiği gibi, dizileri dahili olarak kullanırlar ve Link Buffers bağlantılı listeler kullanırlar (bu hala kaldırılmak üzere O (n)).
Bir alternatif olarak, değişmez Vector size etkili bir sabit zaman verebilir.
vektörler yüksek dallanma faktörü ile ağaç olarak temsil edilir. Her ağaç düğümü, vektörün 32 öğesine kadar içerir veya 32'ye kadar diğer ağaç düğümleri içerir. [...] Bu nedenle, makul boyuttaki tüm vektörler için, bir eleman seçimi 5 ilkel dizi seçimini içerir. Öğe erişiminin "etkili bir şekilde sabit zaman" olduğunu yazdığımızda kastettiğimiz şey buydu.
scala> import scala.collection.immutable._
import scala.collection.immutable._
scala> def remove[A](xs: Vector[A], i: Int) = (xs take i) ++ (xs drop (i + 1))
remove: [A](xs: scala.collection.immutable.Vector[A],i: Int)scala.collection.immutable.Vector[A]
scala> val foo = Vector(1, 2, 3, 4, 5)
foo: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5)
scala> remove(foo, 2)
res0: scala.collection.immutable.Vector[Int] = Vector(1, 2, 4, 5)
Ancak, veri boyutu kadar hızlı lineer erişim kazanmak olmayabilir yükü dolu bir yüksek sabit zaman önemli ölçüde büyüktür.
"Ben endeksli kaldır eki olarak aynı özellikte olan tahmin ediyorum" diyor nedeni budur – Ron
"kaldırmak" için ilk tablodaki hiçbir sütun var. –
@Alexey Romanov @Ron'un işaret ettiği gibi yukarıdaki cevabın çoğunu ekledim. –