• <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>

            無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典?

               這是算法導(dǎo)論習(xí)題11.1-4。
               具體題目如下:
               
                 
               解決該題目的要點(diǎn):
               1.由于是無窮大的數(shù)組,所以無法事先初始化該數(shù)組。
               2.所提供的方案必須是O(1)。
               3.使用的額外空間只能是O(n),這樣平均到每一個(gè)項(xiàng)上的空間都是O(1)。

               一時(shí)之間好像沒有一點(diǎn)頭緒,在幾個(gè)群里面發(fā)問了,網(wǎng)上搜了很久也沒有找到答案,后面一群里有個(gè)高人給了個(gè)鏈接,里面有解法。
            鏈接地址:http://www.cnblogs.com/flyfy1/archive/2011/03/05/1971502.html,這篇文章里面另外給了個(gè)pdf,這個(gè)pdf估計(jì)是解法
            的來源。偽代碼寫得不給力,不過前面的英文描述卻很清晰。說實(shí)話,這個(gè)方法很巧妙。

               解法大概的意思如下:
               開一個(gè)額外的數(shù)組A,A[0]表示A數(shù)組元素的數(shù)目(當(dāng)然不包括A[0]本身),A[i]代表插入的第i個(gè)元素的key。假設(shè)原來的無窮大數(shù)組用Huge
            表示,如果Huge[i](直接尋址,假設(shè)i就是key)有效,則表示其在A數(shù)組中的索引。那么如果A[Huge[i]] == i 而且 Huge[i] <= A[0] &&
            Huge[i] > 0,則表示i這個(gè)位置已經(jīng)有元素插入了。

               插入:A[0]++;A[A[0]] = key; Huge[key] = A[0];
               搜索:  A[Huge[i]] == i && Huge[i] <= A[0] && Huge[i] > 0 則return true;
               刪除:  先搜索該位置是否有元素, 如果Search(key)成功,則先把Huge[ A[A[0]] ] = Huge[key],
                        然后交換A[A[0]]和A[Huge[key]],A[0]--即可。
               所有操作都是O(1),平均到每一個(gè)項(xiàng),使用的空間都是O(1)。

               我用代碼實(shí)現(xiàn)的模擬如下:
            #include <stdio.h>
            #include <vector>
            #include <algorithm>
            using std::swap;
            using std::vector;
            #define INF (100)

            int nHuge[INF];//假設(shè)這個(gè)巨大的數(shù)組是無法初始化的
            vector<int> vA;

            void Init()
            {
                vA.push_back(0);//添加A[0]表示元素的數(shù)目
            }

            void Insert(int nKey)
            {
                vA[0]++;
                nHuge[nKey] = vA[0];
                vA.push_back(nKey);
            }

            bool Search(int nKey)
            {
                if (nHuge[nKey] > 0 && nHuge[nKey] <= vA[0] && vA[nHuge[nKey]] == nKey)
                {
                    return true;
                }

                return false;
            }

            void Delete(int nKey)
            {
                if (Search(nKey))
                {
                    nHuge[ vA[vA[0]] ] = nHuge[nKey];//將huge的最后一個(gè)元素中存儲的A數(shù)組的索引改為nHuge[nKey]
                    swap(vA[vA[0]], vA[nHuge[nKey]]);//交換key
                    --vA[0];
                    vA.erase(vA.end() - 1);
                }
            }

            #define MAX (10)
            int main()
            {
                Init();
                int i;
                for (i = 0; i < MAX; ++i)
                {
                    Insert(i);
                }
                for (i = 0; i < MAX; ++i)
                {
                    printf("Search:%d %s\n", i, Search(i) == true? "Success" : "Failure");
                }
                printf("\n");

                Delete(4);
                Delete(9);
                Delete(1);
                for (i = 0; i < MAX * 2; ++i)
                {
                    printf("Search:%d %s\n", i, Search(i) == true? "Success" : "Failure");
                }

                return 0;
            }

            posted on 2012-03-20 19:26 yx 閱讀(1423) 評論(7)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            評論

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-21 10:38 zhongshan.li

            void Delete(int nKey)
            {
            if (Search(nKey))
            {
            nHuge[ vA[vA[0]] ] = nHuge[nKey];//將huge的最后一個(gè)元素中存儲的A數(shù)組的索引改為nHuge[nKey]
            swap(vA[vA[0]], vA[nHuge[nKey]]);//交換key
            --vA[0];
            }
            }

            沒有erase vA 中最后一個(gè)元素  回復(fù)  更多評論   

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-21 16:12 遠(yuǎn)行

            vA[0]--就可以表示刪除了,至于刪除這點(diǎn)內(nèi)存就沒必要了,哦,沒想清楚,確實(shí)應(yīng)該erase,因?yàn)镮nsert的時(shí)候是push_back的@zhongshan.li
              回復(fù)  更多評論   

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-24 10:02 泡菜

            說實(shí)話,是被標(biāo)題吸引進(jìn)來的---無窮大數(shù)組
            是個(gè)神馬東東哦???
            C/C++規(guī)定數(shù)組形式為X[int]。。。。int無窮木?

            具體代碼沒看,看著頭痛。。。老年人都這樣  回復(fù)  更多評論   

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-24 13:05 遠(yuǎn)行

            說的很清楚,算法導(dǎo)論習(xí)題,代碼前面有算法解釋,敢問你有多老了。。。@泡菜
              回復(fù)  更多評論   

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-24 17:29 泡菜

            老得字看不清楚老。。。。

            在Win下默認(rèn)堆棧為1M;Linux下一般為8~10M。。。。

            介個(gè)、介個(gè)。。。默認(rèn)狀況就能無窮了哇  回復(fù)  更多評論   

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-24 20:20 遠(yuǎn)行

            那你繼續(xù)老你的吧@泡菜
              回復(fù)  更多評論   

            # re: 無窮大數(shù)組上如何直接尋址來實(shí)現(xiàn)字典? 2012-03-24 22:12 泡菜

            就木考慮在AIX系統(tǒng)上用介段代碼?介個(gè)AIX默認(rèn)堆棧為60多M

            俺決定老。。。為了抵抗衰老
            回家一定多吃菠菜,多補(bǔ)充A~Z的維生素。。。爭取早日回到人民的大懷抱中  回復(fù)  更多評論   

            <2012年10月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产AVJUST麻豆| 日本久久中文字幕| 狠狠色狠狠色综合久久| 精品伊人久久大线蕉色首页| 色婷婷综合久久久久中文一区二区| 91精品国产91久久久久福利| 久久97久久97精品免视看秋霞| 亚洲精品成人网久久久久久| 久久亚洲精品中文字幕| 四虎久久影院| 亚洲国产精品久久| 久久精品国产2020| 国产69精品久久久久9999| 久久国产欧美日韩精品免费| 老司机国内精品久久久久| 亚洲国产一成久久精品国产成人综合 | 精品久久久久成人码免费动漫 | 亚洲国产精品久久| 久久WWW免费人成一看片| 国产69精品久久久久99| 99精品国产在热久久无毒不卡| 色综合合久久天天给综看| 久久精品中文字幕久久| 色婷婷久久综合中文久久蜜桃av| 亚洲美日韩Av中文字幕无码久久久妻妇| 久久精品人人做人人爽97 | 久久精品国产亚洲沈樵| 亚洲AV日韩精品久久久久| 色青青草原桃花久久综合| 精品久久久久国产免费| 久久精品国产99国产精品澳门| 久久久久久毛片免费播放| 国产精品99久久久久久宅男小说| 久久久久综合国产欧美一区二区| 国产精品激情综合久久| 91久久精品国产91性色也| 色综合久久天天综合| A级毛片无码久久精品免费| 99热热久久这里只有精品68| 国产精品美女久久久久av爽| 久久国产精品免费一区|