มีการเรียกไลบรารีมาตรฐานใดบ้างที่ฉันสามารถใช้เพื่อดำเนินการตั้งค่าบนอาร์เรย์สองอาร์เรย์หรือใช้ตรรกะดังกล่าวด้วยตัวเอง (ตามหลักการทำงานและมีประสิทธิภาพมากที่สุด)
มีการเรียกไลบรารีมาตรฐานใดบ้างที่ฉันสามารถใช้เพื่อดำเนินการตั้งค่าบนอาร์เรย์สองอาร์เรย์หรือใช้ตรรกะดังกล่าวด้วยตัวเอง (ตามหลักการทำงานและมีประสิทธิภาพมากที่สุด)
คำตอบ:
ใช่ Swift มีSet
คลาส
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+ สามารถดำเนินการกับชุดเป็น:
firstSet.union(secondSet)// Union of two sets
firstSet.intersection(secondSet)// Intersection of two sets
firstSet.symmetricDifference(secondSet)// exclusiveOr
Swift 2.0 สามารถคำนวณอาร์กิวเมนต์อาร์เรย์:
set1.union(array2) // {"a", "b", "c", "d"}
set1.intersect(array2) // {"a", "b"}
set1.subtract(array2) // {"c"}
set1.exclusiveOr(array2) // {"c", "d"}
Swift 1.2+ สามารถคำนวณในชุด:
set1.union(set2) // {"a", "b", "c", "d"}
set1.intersect(set2) // {"a", "b"}
set1.subtract(set2) // {"c"}
set1.exclusiveOr(set2) // {"c", "d"}
หากคุณใช้โครงสร้างแบบกำหนดเองคุณต้องใช้ Hashable
ขอบคุณ Michael Stern ในความคิดเห็นสำหรับการอัปเดต Swift 2.0
ขอบคุณ Amjad Husseini ในความคิดเห็นสำหรับข้อมูล Hashable
set1.union(array2)
และset1.exclusiveOr(array2)
เป็นสิ่งที่ถูกต้องตามกฎหมายนอกเหนือจากแบบฟอร์มที่แสดงด้านบน
ไม่มีการเรียกไลบรารีมาตรฐานใด ๆ แต่คุณอาจต้องการดูไลบรารีExSwift ประกอบด้วยฟังก์ชันใหม่มากมายในอาร์เรย์รวมถึงความแตกต่างจุดตัดและการรวมกัน
คุณอาจต้องการทำตามรูปแบบเดียวกับใน Objective-C ซึ่งขาดการดำเนินการดังกล่าว แต่มีวิธีแก้ปัญหาง่ายๆ:
วิธีที่มีประสิทธิภาพที่สุดที่ฉันรู้คือการใช้หมายเลข godel Google สำหรับการเข้ารหัส Godel
ความคิดเป็นเช่นนั้น สมมติว่าคุณมี N จำนวนที่เป็นไปได้และจำเป็นต้องสร้างชุดเหล่านี้ ตัวอย่างเช่น N = 100,000 และต้องการสร้างชุดเช่น {1,2,3}, {5, 88, 19000} เป็นต้น
แนวคิดคือการเก็บรายชื่อจำนวนเฉพาะ N ไว้ในหน่วยความจำและสำหรับชุดที่กำหนด {a, b, c, ... } คุณเข้ารหัสเป็น
prime[a]*prime[b]*prime[c]*...
คุณจึงเข้ารหัสชุดเป็น BigNumber การดำเนินการกับ BigNumbers แม้ว่าจะช้ากว่าการดำเนินการกับจำนวนเต็มก็ยังเร็วมาก
ในการรวม 2 ชุด A, B คุณต้องใช้
UNITE(A, B) = lcm(a, b)
ค่าสามัญต่ำสุดของ A และ B เนื่องจาก A และ B เป็นเซตและตัวเลขทั้งสอง
เพื่อสร้างทางแยกที่คุณใช้
INTERSECT(A, B) = gcd (a, b)
ตัวหารร่วมที่ยิ่งใหญ่ที่สุด
และอื่น ๆ
การเข้ารหัสนี้เรียกว่า godelization คุณสามารถ google ได้มากขึ้นภาษาทั้งหมดของเลขคณิตที่เขียนโดยใช้ตรรกะของ Frege สามารถเข้ารหัสโดยใช้ตัวเลขด้วยวิธีนี้
จะได้รับการดำเนินการเป็นสมาชิก? มันง่ายมาก -
ISMEMBER(x, S) = remainder(s,x)==0
เพื่อให้ได้พระคาร์ดินัลมันซับซ้อนกว่าเล็กน้อย -
CARDINAL(S) = # of prime factors in s
คุณย่อยสลายตัวเลข S ที่แสดงเซตในผลคูณของปัจจัยเฉพาะและเพิ่มเลขชี้กำลัง ในกรณีที่ชุดไม่อนุญาตให้มีการทำซ้ำคุณจะมีเลขชี้กำลังทั้งหมด 1