Senior
Existují dva soubory, každý obsahující celočíselné hodnoty po řádcích. Jakými algoritmy lze najít průnik těchto dvou množin?
sobes.tech AI
Odpověď od AI
Для поиска пересечения двух множеств целочисленных значений из файлов можно использовать несколько подходов:
-
Считывание в множества (Set)
- Считать все значения из первого файла в HashSet.
- Считать значения из второго файла по одному и проверять наличие в первом множестве.
- Все совпадающие элементы — пересечение.
-
Сортировка и двухуказательный метод
- Считать оба файла в массивы.
- Отсортировать оба массива.
- Использовать два указателя для одновременного прохода по массивам и поиска общих элементов.
-
Использование потоков и фильтрации (Java 8+)
- Считать файлы как Stream<Integer>.
- Преобразовать один поток в Set для быстрого поиска.
- Отфильтровать второй поток по наличию в этом Set.
Пример с использованием HashSet:
import java.nio.file.*;
import java.io.IOException;
import java.util.*;
public class IntersectionFinder {
public static Set<Integer> findIntersection(Path file1, Path file2) throws IOException {
Set<Integer> set1 = new HashSet<>();
try (Stream<String> lines = Files.lines(file1)) {
lines.map(Integer::parseInt).forEach(set1::add);
}
Set<Integer> intersection = new HashSet<>();
try (Stream<String> lines = Files.lines(file2)) {
lines.map(Integer::parseInt)
.filter(set1::contains)
.forEach(intersection::add);
}
return intersection;
}
}
Этот метод эффективен при большом объёме данных, так как операции с HashSet имеют амортизированную сложность O(1).