← Назад к вопросам

Какая сложность алгоритма перебор?

2.2 Middle🔥 121 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Временная сложность алгоритма перебора (брутфорс)

Ответ: O(n)

Времення сложность перебора всех элементов коллекции из n элементов составляет O(n).

Примеры перебора

Перебор массива

int[] array = {1, 2, 3, 4, 5};

// ✅ Простой перебор: O(n)
for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
// n = 5 итераций

// ✅ For-each: O(n)
for (int num : array) {
    System.out.println(num);
}

Перебор списка

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");

// ✅ O(n)
for (String item : list) {
    System.out.println(item);
}

// ✅ Поиск элемента: O(n) в худшем случае
boolean found = false;
for (String item : list) {
    if (item.equals("B")) {
        found = true;
        break;  // Может выйти раньше
    }
}

Усложненные случаи

Вложенные циклы: O(n²)

int[] array = {1, 2, 3, 4, 5};

// ❌ Двойной перебор: O(n²)
for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array.length; j++) {
        System.out.println(array[i] + ", " + array[j]);
    }
}
// Итераций: 5 * 5 = 25

Три вложенных цикла: O(n³)

// ❌ O(n³)
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            // операция
        }
    }
}
// Итераций: n * n * n = n³

Перебор с условиями

С ранним выходом: O(n)

int[] array = {1, 2, 3, 4, 5};

// Best case: O(1) - первый элемент
for (int i = 0; i < array.length; i++) {
    if (array[i] == 1) {
        System.out.println("Found!");
        break;  // Выходим сразу
    }
}

// Average case: O(n/2) = O(n)
for (int i = 0; i < array.length; i++) {
    if (array[i] == 3) {
        System.out.println("Found!");
        break;
    }
}

// Worst case: O(n) - элемента нет
for (int i = 0; i < array.length; i++) {
    if (array[i] == 999) {
        System.out.println("Found!");
        break;
    }
}

Перебор в HashMap: O(n)

HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

// ✅ Перебор всех элементов: O(n)
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
// n = количество пар в HashMap

Практический пример

public class BruteForce {
    
    // O(n) - простой перебор
    public boolean contains(int[] array, int target) {
        for (int num : array) {
            if (num == target) {
                return true;
            }
        }
        return false;
    }
    
    // O(n²) - поиск пары
    public boolean hasPair(int[] array, int target) {
        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (array[i] + array[j] == target) {
                    return true;
                }
            }
        }
        return false;
    }
    
    // O(n³) - поиск тройки
    public boolean hasTriple(int[] array, int target) {
        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                for (int k = j + 1; k < array.length; k++) {
                    if (array[i] + array[j] + array[k] == target) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

Таблица сложностей

Алгоритм                    Сложность
─────────────────────────────────────
Перебор всех элементов      O(n)
Линейный поиск              O(n)
Двойной перебор             O(n²)
Тройной перебор             O(n³)
Перебор с break/continue    O(n) в avg, O(n) в worst
Перебор HashMap/Set         O(n)

Оптимизация от O(n²) к O(n)

// ❌ Неэффективный O(n²)
public boolean hasDuplicate(int[] array) {
    for (int i = 0; i < array.length; i++) {
        for (int j = i + 1; j < array.length; j++) {
            if (array[i] == array[j]) {
                return true;
            }
        }
    }
    return false;
}

// ✅ Эффективный O(n)
public boolean hasDuplicate(int[] array) {
    Set<Integer> seen = new HashSet<>();
    for (int num : array) {
        if (seen.contains(num)) {
            return true;
        }
        seen.add(num);
    }
    return false;
}

Резюме

Перебор n элементов:

  • Один цикл: O(n)
  • Два цикла вложенные: O(n²)
  • Три цикла вложенные: O(n³)
  • С ранним выходом: O(n) в worst case
  • HashMap/Set: O(n) для полного перебора

Перебор - это самый простой алгоритм, но не всегда самый эффективный.

Какая сложность алгоритма перебор? | PrepBro