Чи є якісь стандартні виклики бібліотеки, які я можу використовувати, щоб виконувати задані операції на двох масивах, або самостійно реалізовувати таку логіку (в ідеалі максимально функціонально та ефективно)?
Чи є якісь стандартні виклики бібліотеки, які я можу використовувати, щоб виконувати задані операції на двох масивах, або самостійно реалізовувати таку логіку (в ідеалі максимально функціонально та ефективно)?
Відповіді:
Так, у Свіфта є 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, який також не має таких операцій, але є просте вирішення:
Найбільш ефективний метод, який я знаю, - це використання чисел 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, незважаючи на те, що вони повільніші, ніж операції з Integers, все ще дуже швидкі.
Щоб об'єднати 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.