Apakah ada panggilan pustaka standar yang dapat saya gunakan untuk melakukan operasi set pada dua larik, atau mengimplementasikan sendiri logika tersebut (idealnya berfungsi dan seefisien mungkin)?
100
Apakah ada panggilan pustaka standar yang dapat saya gunakan untuk melakukan operasi set pada dua larik, atau mengimplementasikan sendiri logika tersebut (idealnya berfungsi dan seefisien mungkin)?
Jawaban:
Ya, Swift memiliki
Set
kelasnya.Swift 3.0+ dapat melakukan operasi pada set sebagai:
Swift 2.0 dapat menghitung argumen array:
Swift 1.2+ dapat menghitung set:
Jika Anda menggunakan struct kustom, Anda perlu menerapkan Hashable.
Terima kasih kepada Michael Stern di komentar untuk pembaruan Swift 2.0.
Terima kasih kepada Amjad Husseini di kolom komentar untuk info Hashable.
sumber
set1.union(array2)
danset1.exclusiveOr(array2)
keduanya sah, selain bentuk yang ditunjukkan di atas.Tidak ada panggilan perpustakaan standar, tetapi Anda mungkin ingin melihat perpustakaan ExSwift . Ini mencakup banyak fungsi baru pada Array termasuk perbedaan, persimpangan dan penyatuan.
sumber
Anda mungkin ingin mengikuti pola yang sama seperti di Objective-C, yang juga tidak memiliki operasi seperti itu, tetapi ada solusi sederhana:
bagaimana cara memotong dua array di tujuan C?
sumber
Metode paling efisien yang saya tahu adalah dengan menggunakan nomor godel. Google untuk pengkodean godel.
Idenya begitu. Misalkan Anda memiliki N kemungkinan nomor dan perlu membuat set dari mereka. Misalnya, N = 100.000 dan ingin membuat himpunan seperti {1,2,3}, {5, 88, 19000} dll.
Idenya adalah untuk menyimpan daftar bilangan prima N dalam memori dan untuk himpunan tertentu {a, b, c, ...} Anda menyandikannya sebagai
Jadi Anda mengenkode satu set sebagai BigNumber. Operasi dengan BigNumbers, meskipun faktanya mereka lebih lambat daripada operasi dengan Integer, masih sangat cepat.
Untuk menyatukan 2 set A, B, Anda ambil
kelipatan persekutuan terendah dari A dan B karena A dan B adalah himpunan dan kedua bilangan tersebut.
Untuk membuat persimpangan yang Anda ambil
pembagi persekutuan terbesar.
dan seterusnya.
Pengkodean ini disebut godelisasi, Anda dapat mencari lebih banyak di Google, semua bahasa aritmatika yang ditulis menggunakan logika Frege dapat dikodekan menggunakan angka dengan cara ini.
Untuk mendapatkan operasi is-member? itu sangat sederhana -
Untuk mendapatkan kardinal itu sedikit lebih rumit -
Anda menguraikan bilangan S yang mewakili himpunan dalam produk faktor prima dan menambahkan eksponennya. Jika himpunan tidak mengizinkan duplikat, Anda akan memiliki semua eksponen 1.
sumber