Bằng cách nhìn vào mã nguồn, bạn có thể thấy rằng thiết lập từ bốn yếu tố đã một thực hiện tối ưu hóa được cung cấp bởi EmptySet
, Set1
, Set2
, Set3
và Set4
, mà chỉ cần giữ các giá trị duy nhất.
Ví dụ đây là Set2
khai (như của scala 2.11.4):
class Set2[A] private[collection] (elem1: A, elem2: A) extends AbstractSet[A] with Set[A] with Serializable
Và đây là việc thực hiện contains
:
def contains(elem: A): Boolean =
elem == elem1 || elem == elem2
hoặc find
thực hiện
override def find(f: A => Boolean): Option[A] = {
if (f(elem1)) Some(elem1)
else if (f(elem2)) Some(elem2)
else None
}
Rất đơn giản.
Đối với các bộ có nhiều hơn 4 phần tử, triển khai cơ bản là HashSet
. Chúng ta có thể dễ dàng xác minh này trong REPL:
scala> Set(1, 2, 3, 4).getClass
res1: Class[_ <: scala.collection.immutable.Set[Int]] = class scala.collection.immutable.Set$Set4
scala> Set(1, 2, 3, 4, 5, 6).getClass
res0: Class[_ <: scala.collection.immutable.Set[Int]] = class scala.collection.immutable.HashSet$HashTrieSet
Điều đó đang được nói, find
phải luôn lặp trên toàn bộ HashSet
, vì nó không được phân loại, vì vậy nó sẽ O(n)
. Ngược lại, hoạt động tra cứu như contains
sẽ là O(1)
thay thế.
Here's a more in-depth reference về hiệu suất của bộ sưu tập scala nói chung.
Phát biểu của Map
, khá nhiều khái niệm tương tự được áp dụng. Có tối ưu hóa việc triển khai Map
tối đa 4 thành phần và sau đó là HashMap
.
Nhìn vào hệ thống cấp bậc kiểu, có vẻ như là các bộ chuyên biệt từ trống đến 4 phần tử, và sau đó nó đi đến một hashset. Tôi viết bài này làm bình luận vì tôi chưa thử nghiệm nó. – Luciano
@Luciano - Bạn là chính xác, và nó rất dễ dàng để kiểm tra với 'Set (1,2) .getClass' và muốn. –