Задача состоит в том, что в очереди есть N номеров. И начальная последовательность от 1 до N. Операция «Переместить ab» означает перемещение всех чисел перед (включая a) , а затем вставить их перед b (без изменения порядка) и вывести весь очередь, когда появляется «Выход».Улучшение движения деления от O (n) до O (1)
Вот мой код, чтобы иметь дело с «Move»:
//I establish q & q1 deque
while(cin>>commend){
if(commend == "Move"){
cin>>a>>b;
int checka,checkb = 0;
//search for a,b position
//it1,it2 are both iterators
for(int m = 0; m < num ; m++){
if(q[m] == a){
it1 = q.begin()+m;
checka = 1;
}
else if(q[m] == b){
it2 = q.begin()+m;
con2 = m; //store m in con2 to use below
checkb = 1;
}
else if(checka == 1 && checkb == 1)
break;
}
//con is also a iterator
//q1 is a new deque to store the elements before (include)number"a"
//procedures below are moving the numbers before(include)"a" and push_front the elements between number "a" and number "b"
for(con = it1; con>= q.begin() ; con--)
q1.push_front(*con);
for(con = it2; con > it1+1; con--){
q1.push_front(*con);
}
//copy the "swaped" elements from q1 to q
//and clear q1
for(int m = 0; m<con2-1; m++)
q[m] = q1[m];
q1.clear();
}
}
Но скорость O (N), и я не знаю, где я могу улучшить это, если это требуется для выполнения задачи с O (1).
Любое предложение, кроме построения связанного списка?
Если вы знаете, где в списке находится ваша «точка разреза», то повторная организация очереди может быть O (1). но если вам нужно отсканировать этот список, чтобы найти свою точку пересечения, то не может быть O (1). –
Я не вижу, как это можно сделать в 'O (1)'. Вы выполняете 'O (1)' операцию 'n' раз, что всегда приведет к' O (n) 'runtime –
Это вопрос о конкуренции в программировании? Я уверен, что видел другие ответы на этот вопрос, но я не могу их найти, потому что забыл, что называется проблемой. Можете ли вы включить информацию о том, где проблема, так что этот вопрос может быть связан с другими? В частности, я уверен, что был хороший ответ на этот вопрос, который включал некоторый вариант списка пропусков. –