Вот один из способов вычисления разности множеств в сложности O (n) времени (и сложности пространства O (n)) без использования причудливой структуры данных, отличной от набора.Я предполагаю, что наборы A и B обладают способностью проверять членство за время O (1) (что типично для большинства реализаций HashSet).Этот алгоритм также не требует изменения наборов A и B.
Псевдокод алгоритма
Goal: Calculate (A-B)
Input: Set A, Set B;
BEGIN:
Create Empty Set C to contain (A-B).
for each element a in Set A:
if a does not exist in Set B:
Add a to Set C;
Return Set C;
END;
Сложность времени:
Это выполняется за O (n) сложности времени, потому чтовам нужно всего лишь перебрать все n элементов множества A.И для каждого из n элементов вы проверяете набор B на членство в O (1) раз.Это дает O (n) время выполнения для алгоритма.
Сложность пространства:
Сложность пространства равна O (n), поскольку используется новый набор C, который будет хранить до всех n элементов в решении.
Пример JavaРеализация
import java.util.HashSet;
public class Tester {
public static HashSet<String> setDifference(HashSet<String> A, HashSet<String> B) {
HashSet<String> C = new HashSet<String>();
for (String element : A) {
if (!B.contains(element)) {
C.add(element);
}
}
return C;
}
public static void main (String[] args) {
HashSet<String> A = new HashSet<String>();
HashSet<String> B = new HashSet<String>();
A.add("X");
A.add("Y");
A.add("Z");
B.add("X");
B.add("Y");
HashSet<String> C = setDifference(A, B);
// Set should only contain the element "Z"
System.out.println(C);
}
}