从O(n)到O(1)的改进双胞胎运动

时间:2016-06-28 19:25:34

标签: c++ algorithm performance deque

任务是队列中有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)完成任务,我不知道在哪里可以改进。

除了建立链接列表之外的任何建议吗?

2 个答案:

答案 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)相等,您的计划也不会做任何事情。