我想知道哪些數據結構對於使用「包含」或「存在」檢查是最佳的。SCALA:當使用「.contains()」或「.exists()」時,哪些數據結構是最優的?
我問,因爲我來自Python的背景,並習慣於使用if x in something:
表達式的一切。例如,該表達式的計算最快:
val m = Map(1 -> 1, 2 -> 2, 3 -> 3, 4 -> 4)
//> m : scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3, 4
//| -> 4)
val l = List(1,2,3,4) //> l : List[Int] = List(1, 2, 3, 4)
val v = Vector(1,2,3,4) //> v : scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4)
m.exists(_._1 == 3) //> res0: Boolean = true
m.contains(3) //> res1: Boolean = true
l.exists(_ == 3) //> res2: Boolean = true
l.contains(3) //> res3: Boolean = true
v.exists(_ == 3) //> res4: Boolean = true
v.contains(3) //> res5: Boolean = true
直覺上,我會假設,載體應該是最快的隨機檢查,如果一個人知道該檢查值在的開頭列出將最快清單,並有大量的數據。但是,確認或更正將是最受歡迎的。另外,請隨意擴展到其他數據結構。
注意:請讓我知道,如果您覺得這個問題太含糊,因爲我不確定我是否正確地措詞。
僅供參考http://www.scala-lang.org/docu/files/collections-api/collections_40.html – 2013-05-08 14:25:08
在Python中,與其他語言一樣,當您主要需要成員資格檢查時選擇的抽象數據類型是**集**,而不是序列或映射。 – delnan 2013-05-08 14:27:48
檢查一個特定的元素是**不是**一個隨機檢查,而是對向量/列表/數組進行全掃描shortcircuting:*取第一個元素,比較,如果不是等於,則取第二個,比較...... *。另一方面,集合和地圖上的「包含」應該是恆定時間的(不同於存在的,它必須首先應用一些謂詞,因此我認爲它也是線性的) – 2013-05-08 14:28:00