• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Jiang's C++ Space

            創(chuàng)作,也是一種學習的過程。

               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            最近做東西的時候出現(xiàn)這么一個問題,看起來很簡單的:
            #define LARGE_SIZE 1024
            #define ELEMENT_NUM 5
            class CItem
            {
            public:
             TCHAR cID;
             BYTE data[LARGE_SIZE];
            };

            CItem data[ELEMENT_NUM];

            INT reposition[ELEMENT_NUM] 
            = {4,2,0,3,1};
            要求,根據(jù)repositon的內(nèi)容調(diào)整data的內(nèi)容,如上,把原來下標4的元素調(diào)到0,把原來下標2的元素調(diào)到1。

            寫個算法,復雜度為O(n),還要盡量節(jié)省空間,因為LARGE_SIZE可以很大,并且ELEMENT_NUM可能遠遠不止5個元素。

            馬上能想到的方法就是:
                INT i;
                CItem 
            *pToHandle = new CItem[ELEMENT_NUM];
                memcpy(pToHandle, data, 
            sizeof(data));
                
            for(i=0; i<ELEMENT_NUM; i++)
                {
                    data[i] 
            = pToHandle[reposition[i]];
                }
                delete[] pToHandle;
            但這不太符合節(jié)省空間的原則,有可能在一個嵌入式平臺中,new操作就會失敗。

            問題看起來是簡單,但卻耗費了我不少時間,才寫出這么一個算法,我直接貼上全部代碼:
            #include "stdafx.h"
            #include 
            <Windows.h>

            #define LARGE_SIZE 1024

            class CItem
            {
            public:
                TCHAR cID;
                BYTE data[LARGE_SIZE];
            };

            #define ELEMENT_NUM 10

            int _tmain(int argc, _TCHAR* argv[])
            {
                
            //Data to test
                CItem allData[ELEMENT_NUM];
                INT i;
                
            for (i=0; i<ELEMENT_NUM; i++)
                {
                    allData[i].cID 
            = 'A' + i;
                }

                INT position[ELEMENT_NUM] 
            = {5143697208};
                
            //The result be    F  B  E  D  G  J  H  C  A  I

                
            for (i=0; i<ELEMENT_NUM; i++)
                {
                    CItem swapItem;
                    
            if (position[i]==i)
                        
            continue;
                    swapItem 
            = allData[i];
                    
                    INT iSeek 
            = i;
                    
            do 
                    {
                        INT iToSeekNext 
            = position[iSeek];
                        allData[iSeek] 
            = allData[iToSeekNext];
                        position[iSeek] 
            = iSeek;
                        iSeek 
            = iToSeekNext;
                    } 
            while (position[iSeek]!=i);

                    allData[iSeek] 
            = swapItem;
                    position[iSeek] 
            = iSeek;
                }

                
            for (i=0; i<ELEMENT_NUM; i++)
                {
                    _tprintf(TEXT(
            "%c "), allData[i].cID);
                }
                _tprintf(TEXT(
            "\n"));

                
            return 0;
            }
            看起來寫得稍微有些亂,而且明顯用了兩層迭代,按道理說算法復雜度應該為O(n2)了,但再仔細分析代碼后發(fā)覺:需要調(diào)整位置的元素,只需要移動一次,而整個遍歷過程并不會出現(xiàn)重復遍歷的情況。因此其實際復雜度應該為O(n),已經(jīng)是最高效了,看看還有沒別的辦法。
            posted on 2010-11-27 18:58 Jiang Guogang 閱讀(449) 評論(0)  編輯 收藏 引用 所屬分類: Knowledge
            88久久精品无码一区二区毛片| 久久久这里有精品中文字幕| 久久久免费精品re6| 久久国产精品77777| 国产成人精品久久| 久久人妻少妇嫩草AV蜜桃| 成人免费网站久久久| 精品久久久久中文字幕一区| 亚洲国产精品一区二区久久hs | 久久福利资源国产精品999| 一本综合久久国产二区| 国产精品天天影视久久综合网| 久久久精品久久久久特色影视| 亚洲av成人无码久久精品| 久久精品国产99久久久香蕉| 亚洲精品国产美女久久久| 久久国产免费直播| 久久综合九色综合精品| 久久久久久综合网天天| 久久精品国内一区二区三区| 777午夜精品久久av蜜臀| 国产午夜精品久久久久九九电影 | 精品久久久无码人妻中文字幕豆芽| 国产精品成人久久久久久久| 久久精品国产亚洲AV无码偷窥| 欧洲性大片xxxxx久久久| 国产精品女同一区二区久久| 99久久精品影院老鸭窝| 人妻少妇久久中文字幕| 久久中文字幕人妻熟av女| 欧美久久一区二区三区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久久久人妻精品一区| 亚洲中文字幕无码久久2020| 亚洲国产成人精品女人久久久| 99久久亚洲综合精品网站| 99久久精品免费看国产一区二区三区| 伊人久久大香线蕉av不变影院 | 国产∨亚洲V天堂无码久久久 | 久久久久久久久久久久久久|