任务是队列中有N个号码。 原始序列从1到N. “移动b”操作意味着移动前面的所有数字(包括a) 然后将它们插入b前面(不改变顺序) 出现“退出”时输出整个队列。
这是我处理“移动”的代码:
//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)完成任务,我不知道在哪里可以改进。
除了建立链接列表之外的任何建议吗?
答案 0 :(得分:1)
您可以维护队列中数字的链接列表以及索引(散列,如std :: unordered_map),每个数字都作为指向队列中数字的键。要更改顺序,只需在O(1)时间内查找索引中的a和b,转到List中的数字并交换其链接指针以再次在O(1)时间内更改它们的顺序。
答案 1 :(得分:0)
您无法在Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address = "$A$1" Then
Dim rngAddress As Range
Set rngAddress = ThisWorkbook.Sheets(1).Range("B1") 'Location of your address formula
ThisWorkbook.Sheets(1).Range(rngAddress.Value2).Select
End If
End Sub
中执行Move
功能。这是因为复杂性由搜索和创建操作决定。您的搜索操作需要O(1)
,除非您更改数据结构(您不想做),否则无法减少它。即使您假设在O(n)
中进行搜索,如果数据存储在连续的内存块中,您也只能在O(1)
中执行复制操作,然后您可以使用{{ 1}}。但是,您的搜索操作永远不会在O(1)
之下,因此根据我的说法,没有更改渐近边界的空间。此外,如果memcpy()
和O(n)
相等,您的计划也不会做任何事情。