Название: Слияние диапазонов Отправлено: Igors от Январь 25, 2022, 11:14 Добрый день
Нужно написать ф-цию собирающую диапазоны в порядке возрастания и объединяющую если они перекрываются Код Как для новой пары(p) так и для всех эл-тов вектора гарантируется first <= second. Примеры ( {1, 2}, {8, 9 } } + {5, 5} = ( {1, 2}, {5, 5}, {8, 9 } } // перекрытий нет ( {1, 2}, {8, 9 } } + {5, 7} = ( {1, 2}, {5, 9 } } // объединение Ну и задача-максимум - то же для пар double, может даже удастся обобщить темплейтами. Конечно было бы замечательно "воспользоваться готовым", но где ж взять :) Спасибо Название: Re: Слияние диапазонов Отправлено: RedDog от Январь 25, 2022, 16:21 С вектором "в лоб" решается, тупым пробегом итератором и сравнением по std::pair::first.
Дальше сравнение по std::pair::second и логика "слияния". С double через задание точности, с какой точностью должны диапазоны пересекаться Название: Re: Слияние диапазонов Отправлено: ssoft от Январь 25, 2022, 23:31 Используйте для поиска в упорядоченном векторе функции алгоритмов https://en.cppreference.com/w/cpp/algorithm/equal_range (https://en.cppreference.com/w/cpp/algorithm/equal_range), а далее решайте, что следует сделать - изменить значение по одному из итераторов или вставить значение в контейнер.
Название: Re: Слияние диапазонов Отправлено: Igors от Январь 26, 2022, 07:34 С вектором "в лоб" решается, тупым пробегом итератором и сравнением по std::pair::first. Зачем тупой пробег если есть хотя бы lower_bound? Ну и тема посвящена "логике слияния", т.е. это совсем не "известная деталь/подробность". Задание точности для double - другая задача, здесь об этом речь не идет, напр парыДальше сравнение по std::pair::second и логика "слияния". С double через задание точности, с какой точностью должны диапазоны пересекаться { 5.0, 6.0 } + { 5.5, 9.0 } пересекаются при любой точности Используйте для поиска в упорядоченном векторе функции алгоритмов https://en.cppreference.com/w/cpp/algorithm/equal_range (https://en.cppreference.com/w/cpp/algorithm/equal_range), а далее решайте, что следует сделать - изменить значение по одному из итераторов или вставить значение в контейнер. Наверно Вы имели ввиду получить диапазон всех пар пересекающих вставляемую. Это особо ничего не экономит, а проверяет все эл-ты (в отличие от lower_bound). И если диапазон пуст - куда вставлять?Ну в общем, так понимаю - в std готового нет. Я не удивлен, наверно такой алгоритм для std слишком сложен :) А вот с (пресловутыми) template интересно. Стали бы Вы обобщать? Заметим что логика слияния различна { 5, 6 } + { 7, 8 } = { 5, 8 } { 5.0, 6.0 } + { 7.0, 8.0 } = { { 5.0, 6.0 }, { 7.0, 8.0 } } Ой! Совсем забыл - есть же еще ИИ!!! :) Название: Re: Слияние диапазонов Отправлено: Авварон от Январь 26, 2022, 10:55 Я не удивлен, наверно такой алгоритм для std слишком сложен :) https://leetcode.com/problems/merge-intervals/ да, оч сложно, задачка уровня medium Название: Re: Слияние диапазонов Отправлено: RedDog от Январь 26, 2022, 11:25 Зачем тупой пробег если есть хотя бы lower_bound? А он как то по другому в векторе найдет?Название: Re: Слияние диапазонов Отправлено: Old от Январь 26, 2022, 11:28 А он как то по другому в векторе найдет? Вектор отсортирован же. Конечно найдет по другому. :)Название: Re: Слияние диапазонов Отправлено: Igors от Январь 27, 2022, 08:37 да, оч сложно, задачка уровня medium Не понял, а писать бум или уже готовое нашли? ???Название: Re: Слияние диапазонов Отправлено: Авварон от Январь 27, 2022, 17:23 да, оч сложно, задачка уровня medium Не понял, а писать бум или уже готовое нашли? ???я уже писал, хз Название: Re: Слияние диапазонов Отправлено: ssoft от Январь 28, 2022, 10:55 Поиграйте с таким примером
Код
Название: Re: Слияние диапазонов Отправлено: Igors от Январь 29, 2022, 11:24 Поиграйте с таким примером Работает, с double не проверял, но верю. Все-таки этажерка из 3 хвункторов воспринимается тяжело. Хотя это общая проблема темплейтов. Пока "в теме" и это интересно - вроде ничего. Но если подзабыл, а особенно "не сам писал" - понять "замысел обобщения" трудно.У меня так получилось (аттач). Смысл такой Код В обоих случаях может "слиться" или найденный или предыдущий, ну или никакой. Да, и посоветуйте как (красиво) избежать "first" и "second", напр массив вместо пары Спасибо |