Предположим, у меня есть массив чересстрочных данных, например 1a2b3c4d5e, и я хочу деинтерлейсировать его в массив, который выглядит как 12345abcde, на месте (без временного буфера). Каким будет самый быстрый способ сделать это?
Что я до сих пор это
template<typename T>
void deinterlace(T* arr, int length){
if(length<=1) return;
int i = 1;
for(i = 1; i*2<length; i++){
//swap i with i*2
T temp = arr[i];
arr[i] = arr[i*2];
arr[i*2] = temp;
}
deinterlace(arr+i, length-i);
}
который, к сожалению, не работает с массивами, не имеющими мощности 2 по размеру
отредактируйте: этот алгоритм терпит неудачу при больших мощностях 2 в любом случае, поэтому я думаю, что снова на квадрате 0
edit 2: для этого я нашел алгоритм nlogn, заданный либо функцией поворота массива O (n), либо начальным размером, равным 2
работает так:
1a2b3c4d5e6f7g, "размер блока" = 1 начальный,
расщепляется на группы размером куска * 4 1a2b 3c4d 5e6f 7g
поменять внутренние 2 куска каждой группы 12ab 34cd 56ef 7g
повторить с размером блока = размер блока * 2
12ab34cd 56ef7g (читай: 56 ef 7 г) → 1234abcd 567efg
1234abcd567efg → 1234567abcdefg
template<typename T>
void deinterlace(T* arr, int length, int group_ct = 1){
if(group_ct*2 >= length) return;
for(int i = 0; i<length; i+=group_ct*4){
int rot_count = group_ct;
int i1 = i + group_ct;
int i2 = i+group_ct*4 - group_ct;
if(i2+group_ct > length){
i2 = i1 + (length-i1)/2+group_ct/2;
}
rotate(arr, i1, i2, group_ct);
}
deinterlace(arr, length, group_ct * 2);
}
edit 3 Я думаю, что правильный термин является обратным, а не деинтерлейсом