2つの配列に対して集合演算を実行するために、またはそのようなロジックを自分で(理想的には機能的かつ可能な限り効率的に)実装するために使用できる標準ライブラリ呼び出しはありますか?
2つの配列に対して集合演算を実行するために、またはそのようなロジックを自分で(理想的には機能的かつ可能な限り効率的に)実装するために使用できる標準ライブラリ呼び出しはありますか?
回答:
はい、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を実装する必要があります。
Swift 2.0アップデートのコメントでMichael Sternに感謝します。
Hashable情報のコメントのAmjad Husseiniに感謝します。
set1.union(array2)
そしてset1.exclusiveOr(array2)
上に示した形態に加えて、両方の正当です。
標準のライブラリ呼び出しはありませんが、ExSwiftライブラリを確認することをお勧めします。これには、差分、交差、和集合など、配列に関する新しい関数が多数含まれています。
Objective-Cと同じパターンに従うこともできますが、このような操作もありませんが、簡単な回避策があります。
私が知っている最も効率的な方法は、godel数を使用することです。godelエンコーディング用のGoogle。
アイデアはそうです。N個の可能な数があり、それらのセットを作成する必要があるとします。たとえば、N = 100,000で、{1,2,3}、{5、88、19000}などのセットを作成したいとします。
アイデアは、メモリにN個の素数のリストを保持し、与えられたセット{a、b、c、...}に対して次のようにエンコードすることです。
prime[a]*prime[b]*prime[c]*...
したがって、セットをBigNumberとしてエンコードします。BigNumbersを使用した操作は、Integerを使用した操作よりも低速であるにもかかわらず、非常に高速です。
2セットA、Bを結合するには、
UNITE(A, B) = lcm(a, b)
AとBはセットと両方の数なので、AとBの最小公倍数。
交差点を作るには
INTERSECT(A, B) = gcd (a, b)
最大公約数。
等々。
このエンコーディングはゴデライゼーションと呼ばれ、グーグルでより多くのことができます。Fregeのロジックを使用して書かれた算術のすべての言語は、この方法で数値を使用してエンコードできます。
操作を取得するにはメンバーですか?とても簡単です
ISMEMBER(x, S) = remainder(s,x)==0
枢機卿を取得するには、少し複雑です-
CARDINAL(S) = # of prime factors in s
セットを表す数Sを素因数の積で分解し、それらの指数を追加します。セットが重複を許可しない場合、すべての指数が1になります。