Có bất kỳ lệnh gọi thư viện tiêu chuẩn nào mà tôi có thể sử dụng để thực hiện các hoạt động thiết lập trên hai mảng hoặc tự thực hiện logic như vậy không (lý tưởng là về mặt chức năng và cũng hiệu quả nhất có thể)?
Có bất kỳ lệnh gọi thư viện tiêu chuẩn nào mà tôi có thể sử dụng để thực hiện các hoạt động thiết lập trên hai mảng hoặc tự thực hiện logic như vậy không (lý tưởng là về mặt chức năng và cũng hiệu quả nhất có thể)?
Câu trả lời:
Vâng, Swift có Set
đẳng cấp.
let array1 = ["a", "b", "c"]
let array2 = ["a", "b", "d"]
let set1:Set<String> = Set(array1)
let set2:Set<String> = Set(array2)
Swift 3.0+ có thể thực hiện các thao tác trên các tập hợp như:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0 có thể tính toán trên các đối số mảng:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+ có thể tính toán trên các bộ:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
Nếu đang sử dụng cấu trúc tùy chỉnh, bạn cần triển khai Hashable.
Cảm ơn Michael Stern trong phần bình luận cho bản cập nhật Swift 2.0.
Cảm ơn Amjad Husseini trong phần bình luận cho thông tin Hashable.
set1.union(array2)
và set1.exclusiveOr(array2)
đều là hợp pháp, ngoài các hình thức hiển thị ở trên.
Không có bất kỳ lệnh gọi thư viện tiêu chuẩn nào, nhưng bạn có thể muốn xem thư viện ExSwift . Nó bao gồm một loạt các chức năng mới trên Mảng bao gồm sự khác biệt, giao điểm và liên kết.
Bạn có thể muốn làm theo cùng một mẫu như trong Objective-C, cũng thiếu các thao tác như vậy, nhưng có một cách giải quyết đơn giản:
Phương pháp hiệu quả nhất mà tôi biết là sử dụng số thần thánh. Google để mã hóa thần thánh.
Ý tưởng là như vậy. Giả sử bạn có N số có thể và cần tạo các tập hợp chúng. Ví dụ: N = 100.000 và muốn tạo các bộ như {1,2,3}, {5, 88, 19000}, v.v.
Ý tưởng là giữ danh sách N số nguyên tố trong bộ nhớ và đối với một tập hợp {a, b, c, ...} nhất định, bạn mã hóa nó thành
prime[a]*prime[b]*prime[c]*...
Vì vậy, bạn mã hóa một tập hợp dưới dạng BigNumber. Các hoạt động với BigNumbers, mặc dù thực tế là chúng chậm hơn các hoạt động với Số nguyên vẫn rất nhanh.
Để hợp nhất 2 tập hợp A, B, bạn lấy
UNITE(A, B) = lcm(a, b)
bội số chung thấp nhất của A và B vì A và B là tập hợp và cả hai số.
Để đến giao lộ bạn đi
INTERSECT(A, B) = gcd (a, b)
ước chung lớn nhất.
và như thế.
Mã hóa này được gọi là thần thánh hóa, bạn có thể google để biết thêm, tất cả ngôn ngữ số học được viết bằng logic của Frege đều có thể được mã hóa bằng cách sử dụng các con số theo cách này.
Để có được hoạt động là thành viên? nó rất đơn giản -
ISMEMBER(x, S) = remainder(s,x)==0
Để có được hồng y thì phức tạp hơn một chút -
CARDINAL(S) = # of prime factors in s
bạn phân tích số S đại diện cho tập hợp các thừa số nguyên tố và cộng số mũ của chúng. Trong trường hợp tập hợp không cho phép trùng lặp, bạn sẽ có tất cả các số mũ 1.