Существуют ли какие-либо стандартные вызовы библиотеки, которые я могу использовать для выполнения операций с двумя массивами или для самостоятельной реализации такой логики (в идеале как можно более функционально и эффективно)?
Существуют ли какие-либо стандартные вызовы библиотеки, которые я могу использовать для выполнения операций с двумя массивами или для самостоятельной реализации такой логики (в идеале как можно более функционально и эффективно)?
Ответы:
Да, у Свифта есть 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.
Спасибо Амджаду Хусейни в комментариях за информацию Hashable.
set1.union(array2)
и set1.exclusiveOr(array2)
оба являются законными, в дополнение к формам, показанным выше.
Нет никаких стандартных вызовов библиотеки, но вы можете посмотреть библиотеку ExSwift . Он включает в себя множество новых функций для массивов, включая разность, пересечение и объединение.
Возможно, вы захотите следовать тому же шаблону, что и в Objective-C, в котором также отсутствуют такие операции, но есть простой обходной путь:
Самый эффективный из известных мне методов - использовать годельные числа. Google для кодировки годеля.
Идея такая. Предположим, у вас есть 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)
наибольший общий делитель.
и так далее.
Эта кодировка называется годелизацией, вы можете найти в Google больше, весь язык арифметики, написанный с использованием логики Фреге, может быть закодирован с помощью чисел таким образом.
Чтобы получить операцию is-member? это очень просто -
ISMEMBER(x, S) = remainder(s,x)==0
Для кардинала немного сложнее -
CARDINAL(S) = # of prime factors in s
вы разлагаете число S, представляющее множество, на произведение простых множителей и складываете их показатели. Если набор не позволяет дублировать, у вас будут все показатели 1.