Sobes.tech
Назад к вопросам
Senior
8

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

Компании, где спрашивали
Umbrella IT

Ответ от нейросети

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).