ตั้งค่าการดำเนินการ (ยูเนี่ยนจุดตัด) บนอาร์เรย์ Swift?


100

มีการเรียกไลบรารีมาตรฐานใดบ้างที่ฉันสามารถใช้เพื่อดำเนินการตั้งค่าบนอาร์เรย์สองอาร์เรย์หรือใช้ตรรกะดังกล่าวด้วยตัวเอง (ตามหลักการทำงานและมีประสิทธิภาพมากที่สุด)


คุณสามารถติดตั้งชุดที่ด้านบนของพจนานุกรมได้หากคุณต้องการทำเอง
CodaFi

@CodaFi คุณหมายถึงการใช้กุญแจเพื่อรับรองความเป็นเอกลักษณ์หรือไม่?
devios1

คุณสามารถใช้ `พจนานุกรม <String, Void> ได้หรือไม่?
David Berry

คำตอบ:


185

ใช่ 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


8
โปรดทราบว่าอย่างน้อยใน Swift 2.0 คุณสามารถส่งอาร์เรย์เป็นอาร์กิวเมนต์ไปยังฟังก์ชันเหล่านี้ได้ ดังนั้นset1.union(array2)และset1.exclusiveOr(array2)เป็นสิ่งที่ถูกต้องตามกฎหมายนอกเหนือจากแบบฟอร์มที่แสดงด้านบน
Michael Stern

ถ้าคุณต้องการตัดกัน 5 อาร์เรย์ล่ะ? หรือ 6? จะเกิดอะไรขึ้นถ้าไม่ทราบจำนวนอาร์เรย์
Nathan McKaskle

2
@ นาธานขึ้นอยู่กับการทำงานของชุด ตัวอย่างเช่นเซตยูเนี่ยนและจุดตัดของเซตเป็นแบบสับเปลี่ยนและเชื่อมโยงกันดังนั้นคุณสามารถประมวลผลเซ็ตจำนวนมากโดยใช้การวนซ้ำหรือการเชื่อมโยง หรือคุณสามารถสร้างเมธอดแบบกำหนดเองที่ใช้ var args เช่น Set union_all (... ) และ intersect_all (... )
joelparkerhenderson

แล้วถ้าอาร์เรย์ของคุณมีค่าที่ซ้ำกันตัวอย่างเช่นเพื่อตรวจสอบว่า $ 0 เป็นแอนนาแกรมของ $ 1 ที่อักขระอินพุตอาจมีตัวอักษรซ้ำกันหรือไม่?
Dave Kliman

1
หากคุณใช้โครงสร้างแบบกำหนดเองคุณต้องสอดคล้องกับ Hashable ซึ่งอาจเป็นเรื่องที่น่ารำคาญหากคุณมีโครงสร้างที่ซับซ้อน
Amjad Husseini

0

ไม่มีการเรียกไลบรารีมาตรฐานใด ๆ แต่คุณอาจต้องการดูไลบรารีExSwift ประกอบด้วยฟังก์ชันใหม่มากมายในอาร์เรย์รวมถึงความแตกต่างจุดตัดและการรวมกัน


1
หมายเหตุข้อควรระวัง: ฉันใช้ ExSwift โดยไม่มีปัญหาสำหรับ Swift 1.x แต่ดูเหมือนว่าค่อนข้างจะเสียสำหรับ Swift 2.x และในขณะที่เขียนนี้ยังไม่ได้รับการอัปเดตภายในสองสามเดือน มีส้อมจำนวนมากที่อาจได้รับความสนใจมากขึ้น
Robin Macharg


0

วิธีที่มีประสิทธิภาพที่สุดที่ฉันรู้คือการใช้หมายเลข 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.