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

Нахождение максимального элемента

1.8 Middle🔥 191 комментариев
#Теория тестирования

Условие

Напишите функцию, которая находит максимальный элемент в массиве без использования встроенных функций.

Пример

Вход: [3, 7, 2, 9, 1, 5] Выход: 9

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

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

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

Решение: Нахождение максимального элемента в массиве

Описание проблемы

Нужно найти наибольший элемент в массиве, не использоваихая встроенные функции типа max(). Это фундаментальная задача, проверяющая понимание итерации, сравнения и логики управления состоянием. Рассмотрю несколько подходов с разными уровнями оптимизации.

Подход 1: Простой линейный поиск

def find_maximum(arr):
    """
    Находит максимум простой итерацией по всем элементам.
    
    Args:
        arr: List[int] - массив целых чисел
    
    Returns:
        int - максимальный элемент
    
    Raises:
        ValueError - если массив пуст
    """
    if not arr:  # Обработка пустого массива
        raise ValueError("Массив не может быть пустым")
    
    max_value = arr[0]  # Инициализируем первым элементом
    
    for i in range(1, len(arr)):  # Начинаем со второго элемента
        if arr[i] > max_value:
            max_value = arr[i]
    
    return max_value

# Примеры
print(find_maximum([3, 7, 2, 9, 1, 5]))  # 9
print(find_maximum([10]))                 # 10
print(find_maximum([-5, -2, -10]))        # -2

Подход 2: С возвращением индекса

def find_maximum_with_index(arr):
    """
    Возвращает максимальный элемент и его индекс.
    Полезно когда нужно знать позицию элемента.
    """
    if not arr:
        raise ValueError("Массив не может быть пустым")
    
    max_value = arr[0]
    max_index = 0
    
    for i in range(1, len(arr)):
        if arr[i] > max_value:
            max_value = arr[i]
            max_index = i
    
    return max_value, max_index

# Пример
value, index = find_maximum_with_index([3, 7, 2, 9, 1, 5])
print(f"Максимум: {value} на позиции {index}")  # Максимум: 9 на позиции 3

Подход 3: Через reduce (Функциональный)

from functools import reduce

def find_maximum_functional(arr):
    """
    Использует функциональный подход с reduce.
    Элегантно, но менее читаемо для beginners.
    """
    if not arr:
        raise ValueError("Массив не может быть пустым")
    
    return reduce(lambda max_val, current: 
                  max_val if max_val > current else current, 
                  arr)

print(find_maximum_functional([3, 7, 2, 9, 1, 5]))  # 9

Подход 4: Декомпозиция на подмассивы

def find_maximum_divide_conquer(arr, left=0, right=None):
    """
    Рекурсивный подход "разделяй и властвуй".
    Демонстрирует понимание рекурсии, но неэффективен практически.
    """
    if right is None:
        right = len(arr) - 1
    
    # Базовый случай: один элемент
    if left == right:
        return arr[left]
    
    # Базовый случай: два элемента
    if right == left + 1:
        return arr[left] if arr[left] > arr[right] else arr[right]
    
    # Рекурсивный случай
    mid = (left + right) // 2
    left_max = find_maximum_divide_conquer(arr, left, mid)
    right_max = find_maximum_divide_conquer(arr, mid + 1, right)
    
    return left_max if left_max > right_max else right_max

print(find_maximum_divide_conquer([3, 7, 2, 9, 1, 5]))  # 9

Подход 5: С минимальными сравнениями (Оптимизация)

def find_maximum_optimized(arr):
    """
    Оптимизированный вариант для больших массивов.
    Минимизирует количество сравнений.
    """
    if not arr:
        raise ValueError("Массив не может быть пустым")
    
    n = len(arr)
    max_value = arr[0]
    
    # Обработка пар элементов за раз
    i = 1
    while i < n:
        # Сравниваем пару между собой, потом больший с max
        if i + 1 < n:
            if arr[i] > arr[i + 1]:
                if arr[i] > max_value:
                    max_value = arr[i]
            else:
                if arr[i + 1] > max_value:
                    max_value = arr[i + 1]
            i += 2
        else:
            # Нечётный элемент
            if arr[i] > max_value:
                max_value = arr[i]
            i += 1
    
    return max_value

print(find_maximum_optimized([3, 7, 2, 9, 1, 5]))  # 9

Сравнение подходов

ПодходВременная сложностьПространственнаяЧитаемостьИспользование
ЛинейныйO(n)O(1)ОтличноProduction
С индексомO(n)O(1)ОтличноЧасто нужно
FunctionalO(n)O(n)СреднееСтиль кода
Divide & ConquerO(n)O(log n)ПлохоОбучение
ОптимизированныйO(n)O(1)СреднееРедко нужна

Анализ сложности

Временная: O(n) — требуется проверить каждый элемент в худшем случае Пространственная: O(1) — используем только константное количество переменных (для итеративного подхода)

Не существует алгоритма быстрее O(n) для неотсортированного массива, т.к. нужно проверить каждый элемент.

Граничные случаи

# Тестовые сценарии
test_cases = [
    ([3, 7, 2, 9, 1, 5], 9),      # Обычный случай
    ([10], 10),                    # Один элемент
    ([1, 1, 1], 1),               # Все элементы одинаковые
    ([-5, -2, -10], -2),          # Отрицательные числа
    ([0, -5, 3], 3),              # Смешанные значения
]

for arr, expected in test_cases:
    result = find_maximum(arr)
    assert result == expected, f"Ошибка: ожидалось {expected}, получено {result}"
    print(f"✓ Тест прошёл для {arr}")

Практическое применение в QA Automation

  • Поиск максимального времени выполнения тестов
  • Нахождение наибольшего размера файла в загруженном наборе
  • Поиск максимального ID элемента при проверке базы данных
  • Валидация граничных значений в API тестах
  • Мониторинг максимальных значений метрик производительности
  • Анализ логов для поиска критических ошибок с наивысшим уровнем severity
Нахождение максимального элемента | PrepBro