|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
|
|
Алгоритм для нахождения в массиве чисел максимально длинной последовательности в порядке возрастания12.10.2024, 18:59. Показов 856. Ответов 6
Метки нет (Все метки)
Добрый день!
Есть массив из разных чисел, следующих в случайном порядке. Какой может быть алгоритм для нахождения максимально длинной цепочки значений в порядке возрастания? Например [12, 0, 1, 5, 9, 8, 7, 3, 4, 5, 6, 10, 10, 11, 2] Может быть последовательность 0-1-2 или 0-1-5-9-10-11. Но может быть и такая- более длинная - 0-1-3-4-5-6-10-11. Может уже существуют алгоритмы для такого задания?
0
|
|
| 12.10.2024, 18:59 | |
|
Ответы с готовыми решениями:
6
Найти максимально длинный порядок чисел, идущих в порядке возрастания в строке Ход работы кода для нахождения самой длинной последовательности из Z Сортировка чисел в порядке возрастания в массиве |
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,697
|
|
| 12.10.2024, 19:17 | |
|
Учи динамическое программирование.
Смысл такой: пусть ранее была найдена цепочка длиной n. Посмотрим на элемент последовательности справа от цепочки: 1. Этот элемент продолжает цепочку, т.е. больше или равен последнему элементу цепочки. 2. Элемент завершает цепочку, т.е. меньше последнего элемента цепочки. В первом случае понятно. Во втором случае сравниваем текущую цепочку с максимально длинной найденной ранее. 3. Если цепочка длиннее, то ею замещаем максимальную. 4. Если цепочка меньше, то забываем её. 5. Продолжаем искать новую цепочку: первым элементом в ней будет тот элемент, который завершил последнюю цепочку в п.2. Начинается поиск с цепочки, состоящего из одного элемента - первого в общей последовательности. Длина максимальной цепочки на старте равна нулю. Смотрим элемент справа....... [см. выше]
0
|
|
|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
|
|
| 13.10.2024, 11:45 [ТС] | |
|
Если выстраивать последовательность из чисел, каждое из которых больше предыдущего, "на пути" такой цепочки может встретиться число, которое меньше последнего в уже созданной цепочки, и оно может быть меньше предпоследнего числа в создающейся цепочке и меньше того, что находится перед предпоследним. То есть, в случае попадания на число которое меньше, чем последнее в создающейся последовательности, его нужно сравнивать с каждым из этой последовательности - предпоследним, пред-предпоследним и т.д, пока не будет найдено число, которое меньше. Потом уже, когда, выстраивание текущей последовательности закончено, можно создавать новую, имея найденное выше число, и фрагмент уже созданной цепочки от её начала и до первого числа, которое оказалось меньше, чем упомянутое выше. То есть, при нахождение первого же числа, которое меньше, чем крайнее в создаваемой последовательности, нужно возвращаться вниз по этой последовательности и сравнивать каждое число в ней, с тем, на которое "наткнулись".
Но может есть, какой-то другой алгоритм? Массив выше был приведён только для примера.
0
|
|
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,697
|
|
| 13.10.2024, 13:05 | |
|
Ага, я понял. Я не учёл, что цепочка строится необязательно из соседствующих элементов.
Тогда важным является значение элементов. [12, 0, 1, 5, 9, 8, 7, 3, 4, 5, 6, 10, 10, 11, 2] Пробежимся по последовательности и преобразуем убывающие подпоследовательности так: [(0, 12), 1, 5, (3, 7, 8, 9), 4, 5, 6, (10, 10), (2, 11)] В итоге последовательность из 15 элементов содержит теперь 9 элементов (но сложных). 1 - (0, 12) 2 - 1 3 - 5 4 - (3, 7, 8, 9) 5 - 4 6 - 5 7 - 6 8 - 10 9 - (2, 11) Найти цепочку - это значит выбрать один элемент по индексу, либо не выбирать ни один из них. Динамическое программирование: допустим мы просмотрели первые m элементов и выбрали какие-то из них, последний выбранный элемент имеет индекс n (индексация начинается с 1). Смотрим на элемент под номером (m+1). 1. Если все числа A[m+1] <= A*[n], то переходим к следующему элементу. Здесь звёздочка в обозначении A*[n] означает число, которое было выбрано ранее из нескольких вариантов. 2. Если есть одно или несколько чисел таких, что A[m+1] > A*[n], то рассматриваем только наименьшее из них. Обозначим его A*[m+1]: 2.1 Мы можем добавить число A*[m+1] в цепочку. 2.2 Но в некоторых случаях лучше не добавлять. Чтобы определить 2.1 или 2.2, найдем ближайший справа элемент x, который A*[n] < x <= A*[m+1]. Если между элементом A*[m+1] и x имеется хотя бы один элемент, то поступаем по п.2.2. Добавлено через 28 минут Самые длинные цепочки могут начинаться только на первом элементе, либо на одной из убывающих подпоследовательностей, то есть всего три варианта начала цепочек 1 - (0, 12) 4 - (3, 7, 8, 9) 9 - (2, 11) Выбираем минимальные числа, то есть такие 1 - 0 4 - 3 9 - 2 Ниже я рассмотрю поиск первой цепочки, которая начинается с элемента "0": Кликните здесь для просмотра всего текста
Шаг №1 [0, 1, 5, (3, 7, 8, 9), 4, 5, 6, (10, 10), (2, 11)] Рассматриваем элемент "1". Между элементом 0 и 1 не может быть промежуточных чисел, поэтому п.2.1 без поиска справа. Шаг №2 [0, 1, 5, (3, 7, 8, 9), 4, 5, 6, (10, 10), (2, 11)] Элемент "5"? Между последним выбранным элементом "1" и "5" справа обнаруживаются целых три элемента 3, 4, 5, значит по п.2.2 пропускаем элемент. Шаг №3 [0, 1, (3, 7, 8, 9), 4, 5, 6, (10, 10), (2, 11)] Из элементов (3, 7, 8, 9) выбираем минимальный, то есть "3". На возрастающей подпоследовательности справа нет чисел в диапазоне 1...3, значит идём по п.2.1, добавляем "3" в нашу цепочку. Шаг №4 [0, 1, 3, 4, 5, 6, (10, 10), (2, 11)] Несколько простых шагов без комментариев. Шаг №5 [0, 1, 3, 4, 5, 6, (10, 10), (2, 11)] Шаг №6 [0, 1, 3, 4, 5, 6, (10, 10), (2, 11)] Шаг №7 [0, 1, 3, 4, 5, 6, (10, 10), (2, 11)] Минимальное число "10". Справа в диапазоне 6...10 нет чисел, поэтому п.2.1, добавляем число "10". Шаг №8 [0, 1, 3, 4, 5, 6, 10, (2, 11)] "11" - минимальное число, удовлетворяющее условию п.2. Мы его забираем, так как справа чисел больше нет. Ответ: [0, 1, 3, 4, 5, 6, 10, 11] Не забудьте собрать оставшиеся две цепочки. И выбрать среди них максимальную.
0
|
|
|
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
|
||
| 13.10.2024, 15:05 | ||
|
0
|
||
|
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,697
|
||
| 13.10.2024, 15:58 | ||
|
0
|
||
| 13.10.2024, 16:24 | ||||||
|
Проще написать чем объяснять
0
|
||||||
| 13.10.2024, 16:24 | |
|
Помогаю со студенческими работами здесь
7
Сортировка чисел в двумерном массиве в порядке возрастания Из последовательности целых чисел вывести в порядке возрастания все числа Вывести порядковые номера наибольших чисел последовательности в порядке возрастания их номеров Алгоритм нахождения 2 макс. чисел из числовой последовательности. Написать функцию для нахождения самой длинной последовательности подряд идущих элементов массива,равных какому-либо заданному Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|