Как найти минимальное значение в массиве в Java? [закрыт]
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 4 года назад .
Есть массив чисел[1,4,-2,3]. Как найти минимальное значение в массиве??
По-всякому, например так:
Я бы сделал это более понятным способом:
Проходим по массиву, каждый элемент сравниваем с наименьшим.
Можно и без клонирования, если не нужен исходный массив
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Поиск наибольшего и наименьшего числа в списке в Python
Вы можете найти наибольший номер списка в Python, используя функцию sort() или более простой цикл for.
Использование функции sort() довольно лаконично, но использование цикла For является наиболее эффективным. Мы рассмотрим эти два подхода на примерах.
Пример 1
Мы знаем, что встроенная функция sort() сортирует список в порядке возрастания или убывания. После сортировки списка у вас будет самый большой номер в конце списка, если вы отсортировали его в порядке возрастания, или в начале списка, если вы отсортировали его в порядке убывания.
В следующем примере мы отсортируем данный список в порядке возрастания. Конечно, последний номер отсортированного списка – это самый большой номер.
a [-1] выбирает последний элемент в списке.
Пример 2: с помощью цикла For
Хотя найти наибольшее число с помощью функции sort() легко, использование цикла For делает это относительно быстрее с меньшим количеством операций.
В этом примере мы приняли список и инициализировали переменную ln с наибольшим числом первым элементом списка. Если в списке нет элементов, ln инициализируется значением None.
Повторяйте цикл для каждого элемента в списке. Во время каждой итерации мы проверяем, меньше ли наибольшее число этого элемента. В этом случае мы обновляем самое большое число с помощью элемента.
Когда вы завершите обход списка, вы получите наибольший номер списка в вашей переменной.
Вы можете найти наименьший номер списка в Python, используя функцию min(), функцию sort() или цикл for.
- встроенную функцию min();
- функцию сортировки sort();
- Цикл For.
Выберите один, исходя из требований вашей программы или ваших личных рекомендаций по производительности.
Пример 1: с помощью min()
Функция min() может принимать список в качестве аргумента и возвращать минимум элементов в списке.
В этом примере мы возьмем список чисел и найдем наименьшее из них с помощью функции min().
Пример 2: с помощью функции sort()
Мы знаем, что функция sort() сортирует список в порядке возрастания или убывания. После сортировки списка у вас будет наименьшее число в начале списка, если вы отсортировали его в порядке возрастания, в конце списка или в порядке убывания.
Пример 3: с помощью цикла for
Хотя найти наименьшее число с помощью функции sort() легко, использование For цикла делает это относительно быстрее с меньшим количеством операций. Кроме того, мы не меняем порядок элементов в данном списке.
MEX (Minimum EXcluded) Алгоритм поиска минимального отсутствующего числа
Добрый день. Сегодня хочется поговорить о том, как найти MEX (минимальное отсутствующие число во множестве).
Мы разберем три алгоритма и посмотрим на их производительность.
Добро пожаловать под cut
Предисловие
Перед тем как начать, хотелось бы рассказать — почему я вообще за этот алгоритм взялся?
Всё началось с задачки на OZON.

Как видно из задачи, в математике результатом работы функции MEX на множестве чисел является наименьшим значением из всего набора, который не принадлежит этому множеству. То есть это минимальное значение набора дополнений. Название «MEX» является сокращением для «Minimum EXcluded» значение.

И покопавшись в сети, оказалось, что нет общепринятого алгоритма нахождения MEX…
Есть решения в лоб, есть варианты с дополнительными массивами, графами, но, как-то всё это раскидано по разным углам интернета и нет единой нормальной статьи по этому поводу. Вот и родилась идея — написать эту статью. В этой статье мы разберем три алгоритма нахождения MEX и посмотрим, что у нас получиться по скорости и по памяти.
Код будет на языке C#, но в целом там не будет специфичных конструкций.
Базовый код для проверок будет таким.
И еще один момент в статье я часто упоминаю слово «массив», хотя более правильным будет «множество», то заранее хочу извиниться перед теми, кому будет резать слух данное допущение.
Примечание 1 на основе комментариев: Многие придрались к O(n), мол все алгоритмы O(n) и по фигу, что «O» везде разное и не даёт фактически сравнить количество итераций. То для душевного спокойствия поменяем O на T. Где T более-менее понятная операция: проверка или присвоение. Так, как я понимаю, всем будет проще
Примечание 2 на основе комментариев: мы рассматриваем случай когда исходное множество НЕупорядоченное. Ибо сортировка это множества — тоже требует времени.
1) Решение в лоб
Как нам найти «минимальное отсутствующие число»? Самый простой вариант – сделать счетчик и перебирать массив до тех пор, пока не найдем число равное счетчику.
Максимально базовый случай. Сложность алгоритма составляет T(n*cell(n/2))… Т.к. для случая < 0, 1, 2, 3, 4 >нам нужно будет перебрать все числа т.к. совершить 15 операций. А для полностью заполного ряда из 100 числе 5050 операций… Так себе быстродейственность.
2) Просеивание
Второй по сложности вариант в реализации укладывается в T(n)… Ну или почти T(n), математики хитрят и не учитывают подготовку данных… Ибо, как минимум, — нам нужно знать максимальное число во множестве.
С точки зрения математики выглядит так.
Берется битовый массив S длинной m (где m – длина массива V) заполненный 0. И в один проход исходному множеству (V) в массиве (S) ставятся 1. После этого в один проход находим первое пустое значение. Все значения больше m можно просто игнорировать т.к. если в массиве «не хватает» значений до m, то явно будет меньше длины m.
Т.к. «математики» – хитрые люди. То они говорят, что алгоритм T(n) ведь проход по исходному массиву всего один…
Вот сидят и радуются, что такой крутой алгоритм придумали, но правда такова.
Первое — нужно пройтись по исходному массиву и отметить это значение в массиве S T1(n)
Второе — нужно пройтись по массиву S и найти там первую попавшеюся свободную ячейку T2(n)
Итого, т.к. все операции в целом не сложные можно упростить все расчеты до T(n*2)
Но это явно лучше решения в лоб… Давайте проверим на наших тестовых данных:
- Для случая < 0, 12, 4, 7, 1 >: В лоб: 11 итераций, просеивание: 8 итераций
- Для случая < 0, 1, 2, 3, 4 >: В лоб: 15 итераций, просеивание: 10 итераций
- Для случая < 11,…>: В лоб: 441 итерация, просеивание: 108 итерация
- Для случая < 0,…,999>: В лоб: 500500 итераций, просеивание: 2000 итераций
Давайте сделаем это, и оптимизируем код.
Что мы тут сделали. Во-первых, в 64 раза уменьшили количество оперативной памяти, которая необходима.
Во-вторых, оптимизировали финальную проверку: мы проверяем сразу блок на вхождение первых 64 значений: if (sieve[i] != maxInblock) и как только убедились в том, что значение блока не равно бинарным 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111, только тогда ищем уже вхождение на уровне блока: ((sieve[i] & (one << j)) == 0
В итоге алгоритм просеивание нам дает следующие результат:
- Для случая < 0, 12, 4, 7, 1 >: просеивание: 8 итераций, просеивание с оптимизацией: 8 итераций
- Для случая < 0, 1, 2, 3, 4 >: просеивание: 10 итераций, просеивание с оптимизацией: 11 итераций
- Для случая < 11,…>: просеивание: 108 итерация, просеивание с оптимизацией: 108 итерации
- Для случая < 0,…,999>: просеивание: 2000 итераций, просеивание с оптимизацией: 1056 итераций
T(n*3) мы превратили в T(n*2) + T(n / 64) в целом, чуть увеличили скорость, да еще объём оперативной памяти уменьшили аж в 64 раза. Что хорошо)
3) Сортировка
Как не сложно догадаться, самый простой способ найти отсутствующий элемент во множестве – это иметь отсортированное множество.
Самый быстрый алгоритм сортировки — это «quicksort» (быстрая сортировка), которая имеет сложность в T1(n log(n)). И итого мы получим теоретическую сложность для поиска MEX в T1(n log(n)) + T2(n)
Шикарно. Ничего лишнего.
Проверим количество итераций
-
Для случая < 0, 12, 4, 7, 1 >: просеивание с оптимизацией: 8, сортировка:
Вот у меня и возникла идея оптимизировать quicksort для поиска MEX. Данный вариант алгоритма я не находил в интернете, ни с точки зрения математики, и уж тем более с точки зрения программирования. То код будем писать с 0 по дороге придумывая как он будет выглядеть 😀
Но, для начала, давайте вспомним как вообще работает quicksort. Я бы ссылку дал, но нормальное пояснение quicksort на пальцах фактически нет, создается ощущение, что авторы пособий сами разбираются в алгоритме пока его рассказывают про него…
Так вот, что такое quicksort:
У нас есть неупорядоченный массив < 0, 12, 4, 7, 1 >
Нам потребуется «случайное число», но лучше взять любое из массива, — это называется опорное число (T).
И два указателя: L1 – смотрит на первый элемент массива, L2 смотрит на последний элемент массива.
0, 12, 4, 7, 1
L1 = 0, L2 = 1, T = 1 (T взял тупа последние)
Первый этап итерации:
Пока работам только с указателем L1
Сдвигаем его по массиву вправо пока не найдем число больше чем наше опорное.
В нашем случае L1 равен 8
Второй этап итерации:
Теперь сдвигаем указатель L2
Сдвигаем его по массиву влево пока не найдем число меньше либо равное чем наше опорное.
В данном случае L2 равен 1. Т.к. я взял опорное число равным крайнему элементу массива, а туда же смотрел L2.
Третей этап итерации:
Меняем числа в указателях L1 и L2 местами, указатели не двигаем.
И переходим к первому этапу итерации.
Эти этапы мы повторяем до тех пор, пока указатели L1 и L2 не будет равны, не значения по ним, а именно указатели. Т.е. они должны указывать на один элемент.
После того как указатели сойдутся на каком-то элементе, обе части массива будут всё еще не отсортированы, но уже точно, с одной стороны «обединённых указателей (L1 и L2)» будут элементы, которые меньше T, а со второй больше T. Именно этот факт нам и позволяет разбить массив на две независимые группы, которые можно сортировать в разных потоках в дальнейших итерациях.
Проверим реальное количество итераций:
- Для случая < 0, 12, 4, 7, 1 >: просеивание с оптимизацией: 8, сортировка: 11 итераций
- Для случая < 0, 1, 2, 3, 4 >: просеивание с оптимизацией: 11 итераций, сортировка: 14 итераций
- Для случая < 11,…>: просеивание с оптимизацией: 108 итерации, сортировка: 1520 итераций
- Для случая < 0,…,999>: просеивание с оптимизацией: 1056 итераций, сортировка: 500499 итераций
Т.е. если мы точно знаем, что в одной из частей нет элементов больше определённого значения, то само это отсутствующие число нужно искать во второй части массива. В целом так работает алгоритм бинарного поиска.
В итоге у меня родилась мысль упростить quicksort для поиска MEX объединив его с бинарным поиском. Сразу скажу нам не нужно будет полностью отсортировывать весь массив только те части, в которых мы будем осуществлять поиск.
В итоге получаем код
Проверим количество итераций
- Для случая < 0, 12, 4, 7, 1 >: просеивание с оптимизацией: 8, сортировка MEX: 8 итераций
- Для случая < 0, 1, 2, 3, 4 >: просеивание с оптимизацией: 11 итераций, сортировка MEX: 4 итераций
- Для случая < 11,…>: просеивание с оптимизацией: 108 итерации, сортировка MEX: 1353 итераций
- Для случая < 0,…,999>: просеивание с оптимизацией: 1056 итераций, сортировка MEX: 999 итераций
Итого
Мы получили разные варианты поиска MEX. Какой из них лучше — решать вам.
В целом. Мне больше всех нравится просеивание, и вот по каким причинам:
У него очень предсказуемое время выполнения. Более того, этот алгоритм можно легко использовать в многопоточном режиме. Т.е. разделить массив на части и каждую часть пробегать в отдельном потоке:
Единственное, нужен lock при записи sieve[values[i] / size]. И еще — алгоритм идеален при выгрузке данных из базы данных. Можно грузить пачками по 1000 штук например, в каждом потоке и всё равно он будет работать.
Но если у нас строгая нехватка памяти, то сортировка MEX – явно выглядит лучше.
Как найти максимальное и минимальное значения в Java?
Этот урок на Java для начинающих заключается в написании Java-программы, которая принимает данные от пользователя, находит максимальное и минимальное число и выводит их на консоль.
Цель этой статьи – научить получать данные от пользователя и использовать класс java.lang.Math для выполнения некоторых математических операций, например, чтобы найти максимальное и минимальное значения в Java.
Также есть другие 4 способа, которые с примерами кода даны ниже.
Мы можем использовать класс Scanner, добавленный в Java 1.5, для чтения пользовательского ввода с консоли. Сканеру нужен InputStream для чтения данных, и поскольку мы читаем с консоли, мы можем передать System.in, который является InputStream для консоли Eclipse, или командную строку в зависимости от того, что используется.
Этот класс также помогает преобразовать пользовательский ввод в требуемый тип данных, например если пользователь вводит числа, необходимо затем преобразовать их в тип данных int и сохранить их в переменной int. Можно использовать метод nextInt(), чтобы считать пользовательский ввод как Integer.
Точно так же можно использовать nextLine() для чтения ввода пользователя как String. Есть другие методы, доступные для чтения с плавающей точкой, двойного или логического значения из командной строки.
Как только получены оба числа, просто нужно использовать оператор отношения меньше и больше, чтобы найти наименьшее и наибольшее число.
После этого можно использовать Math.max(), чтобы узнать максимум двух чисел, он должен совпадать с предыдущим результатом.
В этой статье вы узнаете
Максимум и минимум на примере
Пример программы состоит из двух частей. В первой части мы принимаем данные от пользователя , используем if block и реляционный оператор, чтобы найти максимальное значение в Java, и далее используем метод Math.max() для той же цели.
Во второй части программы мы попросим пользователя ввести еще два числа, а затем мы используем if блок, чтобы вычислить меньшее из двух. После этого мы снова используем функцию Math.min() для вычисления минимального числа. Если наша программа правильная, то оба результата должны быть выведены одинаковыми.
Java программа для нахождения максимума и минимума чисел
Мы можем запустить эту программу из Eclipse IDE, просто скопировав код после создания проекта. Eclipse автоматически создаст исходный файл с тем же именем, что и открытый класс, и поместит его в нужный пакет. Кроме того, также можно запустить эту программу из командной строки, следуя приведенным здесь шагам.

Вывод:
введите 2 числа
10
11
Between 10 and 11, maximum number is 11
Maximum value of 10 and 11 using Math.max() is 11
Please enter two numbers to find minimum of two
45
32
Between 45 and 32, Minimum is 32
Maximum value of 45 and 32 using Math.min() is 32
Из массива int
В этом примере мы находим максимальные и минимальные значения элемента из массива int на Java.
Вывод:
Maximum Value is: 120
Minimum Value is: 2
Методы max и min
В пакете java.util.Collections есть методы max и min.
Используя цикл
Вносим в переменные min и max первый элемент из списка, запускаем цикл и сравниваем число на итерации с числом в переменных.
Если оно меньше, чем min, то присваиваем его min, иначе если больше, чем max — то это max.
С помощью Collections.sort взять первый и последний из списка
Отсортируем список с помощью Collections.sort, теперь в этом списке первый элемент – это maximum,а последний будет minimum:
Средняя оценка 3.8 / 5. Количество голосов: 60
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.