在Swift数组上设置操作(联合,交集)?
是否有任何标准库调用可用于对两个数组执行集合操作,或者自己实现这样的逻辑(理想情况下尽可能在function上和效率上尽可能)?
是的,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"}
感谢Michael Stern在Swift 2.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的操作,尽pipe比整数运算慢,但仍然非常快。
联合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。
没有任何标准的库调用,但是您可能需要查看ExSwift库。 它包括一系列新的函数,包括差异,交叉和联合。
您可能希望遵循与Objective-C中相同的模式,该模式也缺乏此类操作,但有一个简单的解决方法:
如何在目标C中交叉两个数组?