LINUX.ORG.RU

Нужен оптимальный алгоритм объединения двух упорядоченных массивов.

 ,


0

1

Суть: есть два упорядоченных массива. Нужно один добавить во второй объединением. Те которые не имеются в первом те вставляются. Те которые имеются в обоих, те не должны задублироватся, но нужно вызвать доп.обработку на эту пару элементов.

Упорядочены по доп.ключу, а не непосредственно по значению, т.е. прилагается функция сравнения.

Массивы равнозначны, и можно объединять в любой, или можно даже создать новый, если время на выделение памяти незначительно по сравнению с приростом скорости алгоритма.

Конечно, про это пишут везде и много, но везде повторяется примитивный вариант параллельного обхода. Так же как и в классическом std::merge.

В таком случае, не эффективно например, когда один из массивов из одного элемента - тогда проще поиском по сортированному массиву найти позицию вставки, чем перебирать все.

От которого количества имеет смысл вставлять по штучно, а не прогонкой объединения? И т.д.

В общем нюансов много, есть ли готовое, желательно на C++?

-----------------
Если более предметно, то имеется два массива, упорядоченных по Key:

using Key = ...;
using Aggr = int; // может быть любой складывамый класс
std::vector<pair<Key,Aggr>> ar1 = ...;
std::vector<pair<Key,Aggr>> ar2 = ...;

И из этих двух нужно сделать один объединением, а для случаев когда Key совпадают, то Aggr сложить для результатного массива.

===============================================
UPD: добавил описание результата изысканий: пост



Последнее исправление: victor79 (всего исправлений: 2)
Ответ на: комментарий от unanimous

Это последний проход сортировки merge sort – объединение двух уже отсортированных массивов. Смотри на wiki MergeSort

Как я упоминал парой тем позже, описание вопроса в этой теме читают не более 10%.

victor79
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.