Sobes.tech
Senior
39

Есть два файла, каждый содержит целочисленные значения построчно. Какими алгоритмами можно найти пересечение этих двух множеств?

Сұралған компаниялар
Umbrella IT

AI-дан жауап

sobes.tech AI

Для поиска пересечения двух множеств целочисленных значений из файлов можно использовать несколько подходов:

  1. Считывание в множества (Set)

    • Считать все значения из первого файла в HashSet.
    • Считать значения из второго файла по одному и проверять наличие в первом множестве.
    • Все совпадающие элементы — пересечение.
  2. Сортировка и двухуказательный метод

    • Считать оба файла в массивы.
    • Отсортировать оба массива.
    • Использовать два указателя для одновременного прохода по массивам и поиска общих элементов.
  3. Использование потоков и фильтрации (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).