Sitation:
обзор:
У меня есть что-то вроде этого:
std::vector<SomeType> values;
std::vector<int> indexes;
struct Range{
int firstElement;//first element to be used in indexes array
int numElements;//number of element to be used from indexed array
int minIndex;/*minimum index encountered between firstElement
and firstElements+numElements*/
int maxIndex;/*maximum index encountered between firstElement
and firstElements+numElements*/
Range()
:firstElement(0), numElements(0), minIndex(0), maxIndex(0){
}
}
std::vector<Range> ranges;
Мне нужно отсортировать значения, индексы переназначения иПересчитать диапазоны, чтобы минимизировать maxValueIndex-minValueIndex для каждого диапазона.
детали:
значения - это массив (хорошо, «вектор») некоторыхтип (не имеет значения, какой).элементы в значениях могут быть уникальными, но это не гарантируется.
indexes - вектор целых чисел.каждый элемент в «indexes» является индексом, который соответствует некоторому элементу в значениях .Элементы в индексах не являются уникальными, одно значение может повторять несколько типов.И indexes.size ()> = values.size ().
Теперь диапазоны соответствуют «фрагменту» данных из indexes .firstElement - это индекс элемента, который будет использоваться из indexes (т. е. используется следующим образом: indexes [range.firstElement]), numElements - это (очевидно) количество элементов, которые нужно использовать, minIndex - это mininum in (indexes [firstElement] ... indexes [firstElement + numElements-1]) a, d maxIndex максимально в (indexes [firstElement] ... indexes [firstElement + numElements-1]).Диапазоны никогда не пересекаются.Т.е. для каждых двух диапазонов a, b
((a.firstElement >= b.firstElement) && (a.firstElement < (b.firstElement+b.numElements)) == false
Очевидно, что когда я делаю какую-либо операцию с значениями (переключение на элементы и т. Д.), Мне нужно обновить индексы (чтобы они продолжали указыватьна то же значение) и пересчитать соответствующий диапазон, чтобы значения minIndex и maxIndex были правильными.
Теперь мне нужно переставить значения таким образом, чтобы минимизировать Range.maxIndex - Range.minIndex.Мне не нужен «лучший» результат после упаковки, достаточно «вероятно, лучшей» или «хорошей» упаковки.
проблема:
Переназначение индексов и пересчет диапазоновлегко.Проблема в том, что я не уверен, как сортировать элементы в значениях , потому что один и тот же индекс может встречаться в нескольких диапазонах.
Есть идеи о том, как действовать?* ограничения:
Изменение типа контейнера не допускается.Контейнеры должны быть похожи на массивы.Нет карт, нет списков.Но вы можете свободно использовать любой контейнер, который вы хотите во время сортировки.Кроме того, нет ни буста, ни внешних библиотек - чистый C ++ / STL, мне действительно нужен только алгоритм.
дополнительная информация:
Нет большего или меньшего сравнения, определенного дляSomeType - только равенство / неравенство.Но не нужно когда-либо сравнивать два значения, только индексы.
Цель алгоритма - убедиться, что выходные данные
for (int i = 0; i < indexes.size; i++){
print(values[indexes[i]]); //hypothetical print function
}
будут одинаковыми до и после сортировки, атакже убедившись, что для каждого диапазона Range.maxIndex-Range.minIndex (после сортировки) настолько мал, насколько это возможно, при разумных усилиях.Я не ищу «идеальное» или «наиболее оптимальное» решение, достаточно иметь «вероятно идеальное» или «возможно, наиболее оптимальное» решение.
PS Это НЕ домашнее задание.