數(shù)據(jù)結(jié)構(gòu)線性表考研真題

2010計(jì)算機(jī)聯(lián)考真題之大題順序表.png
typedef int ElemType;
//使用靜態(tài)分配的方式創(chuàng)建一維數(shù)組:數(shù)組的大小和空間固定没佑,一旦占滿再加入新的數(shù)據(jù)會(huì)導(dǎo)致程序崩潰脸甘。 
typedef struct{
    ElemType data[MAXSIZE];
    int length;
}Vector;

/*算法思想:借助輔助數(shù)組v_temp存儲(chǔ)原表的前p個(gè)元素,并把原順序表中p之后的元素順序前移咒唆,然后將v_temp中暫存的p個(gè)數(shù)的元素依次放回到原順序表的后續(xù)單元弯屈。*/
Vector* CircleLeftMove(Vector *v , int p){
    Vector *v_temp = (Vector*)malloc(sizeof(Vector));
    v_temp->length =  p;
    int i;
    for(i = 0;i < v->length ;i++){
        v_temp->data[i] = v->data[i];
        v->data[i] = v->data[i+p];
    }
    for(i = 0 ; i < p ;i++){
        v->data[v->length - p + i] = v_temp->data[i];
    }
    return v;
}
/*時(shí)間復(fù)雜度:O(n) 空間復(fù)雜度:O(p)*/
2010計(jì)算機(jī)聯(lián)考真題之大題順序表測(cè)試結(jié)果.png

解2

/*算法思想:1. 把順序表中的前p個(gè)元素逆序存儲(chǔ)睡毒,
            2. 再把順序表中的后length-p個(gè)元素逆序存儲(chǔ)谱秽,
            3. 然后把整個(gè)順序表逆序存儲(chǔ)生巡。
比如:v = 1 2 3 4 5 6 7 p = 3
    1. v = 3 2 1 4 5 6 7
    2. v = 3 2 1 7 6 5 4
    3. v = 4 5 6 7 1 2 3*/
Vector* Reverse(Vector *v , int from, int to){
    int i ; 
    ElemType temp ;
    for( i = 0 ; i < (to-from+1)/2 ; i++){
        temp = v->data[from+i];
        v->data[from+i] = v->data[to-i];
        v->data[to-i] = temp;
    }
    return v;
}

Vector* CircleLeftMove2(Vector *v , int p){
    Reverse(v,0,p-1);
    Reverse(v,p,v->length-1);
    Reverse(v,0,v->length-1);
}
/*時(shí)間復(fù)雜度:O(n) 空間復(fù)雜度:O(1)*/
2010計(jì)算機(jī)聯(lián)考真題之大題順序表測(cè)試結(jié)果ByReverse.png
2011計(jì)算機(jī)聯(lián)考真題之大題順序表.png
/*算法思想: 
        1.若v1.data[mid1] == v2.data[mid2]耙蔑,則mid1和mid2即為所求中位數(shù),立即返回孤荣。
        2.若v1.data[mid1] < v2.data[mid2]2甸陌,則序列1中比mid1還要小數(shù)必不可能為所求中位數(shù),故舍棄序列1中較小的一半
                        (若序列元素個(gè)數(shù)為奇數(shù)則舍棄中位數(shù)前的元素盐股,若為偶數(shù)則舍去包括中位數(shù)在內(nèi)的元素)钱豁,
                        同理,這時(shí)也要舍棄序列2中較大的一半
                        (兩次舍棄的長(zhǎng)度需相等疯汁,這樣才能保證同升序且等長(zhǎng))牲尺。
        3.若v1.data[mid1] > v2.data[mid2], 則舍棄序列1中大于mid1的數(shù),同時(shí)也要舍棄序列2中較小的一半
                        (若序列元素個(gè)數(shù)為奇數(shù)則舍棄序列2中位數(shù)的元素幌蚊,若為偶數(shù)則舍去包括中位數(shù)在內(nèi)的元素)谤碳。
            直到邏輯上的序列只含一個(gè)元素時(shí),較小者即為所求中位數(shù)霹肝。*/
int getMidByCompare(Vector v1,Vector v2){
    int num1 = 0,num2 = 0; //num結(jié)點(diǎn)始終指向序列中的第一個(gè)元素的下標(biāo) 
    int end1 = v1.length - 1;
    int end2 = v2.length - 1;//end結(jié)點(diǎn)始終指向序列中的最后一個(gè)元素的下標(biāo) 
    int mid1 , mid2;
    while(num1 != end1 || num2 != end2){
        mid1 = (num1 + end1)/2;//邏輯上的中位數(shù)下標(biāo) 
        mid2 = (num2 + end2)/2;
        if(v1.data[mid1] == v2.data[mid2]){
            return v1.data[mid1];
        }
        if(v1.data[mid1] < v2.data[mid2]){
            if((num1+end1) %2 == 0){
                //v1的元素個(gè)數(shù)為奇數(shù) 
                num1 = mid1; //舍棄序列1中位數(shù)前的元素
                end2 = mid2;
            }else{
                num1 = mid1 + 1; //舍棄序列1中位數(shù)及中位數(shù)前的元素
                end2 = mid2;
            }
        }else{//序列1的中位數(shù)大于序列2的中位數(shù) 
            if((num2+end2)%2 == 0){
                end1 = mid1;//舍棄序列1中比中位數(shù)大的元素
                num2 = mid2; 
            }else{
                end1 = mid1;
                num2 = mid2+1; //舍棄序列2的中位數(shù)及比中位數(shù)小的元素 
            }
        }
    }
    return v1.data[num1] < v2.data[num2] ? v1.data[num1] : v2.data[num2];
}
/*時(shí)間復(fù)雜度:O(log2n) 空間復(fù)雜度:O(1)*/ 
2011計(jì)算機(jī)聯(lián)考真題之大題順序表測(cè)試結(jié)果.png
2013計(jì)算機(jī)聯(lián)考真題之大題順序表.png
/*算法思想: 
        從數(shù)組的第一個(gè)元素開(kāi)始遍歷估蹄,為每個(gè)元素設(shè)置一個(gè)count值表示數(shù)組中該元素值的元素個(gè)數(shù),
        和后面的元素比較沫换,當(dāng)值相等時(shí)臭蚁,count+1最铁,當(dāng)某個(gè)元素的count值大于數(shù)組長(zhǎng)度一半時(shí)立刻返回該元素的值。
        當(dāng)某個(gè)元素的count值等于數(shù)組長(zhǎng)度一半時(shí)立刻返回-1垮兑,因?yàn)楸夭豢赡艽嬖谄渌闹髟亍?/
int getMain(int a[],int length){
    int i,j;
    for(i = 0; a[i] <length;.i++){
        int count = 1;
        for( j = i+1; a[j] <length;j++){
            if(a[i] == a[j]){
                count++;            
            }
        }
        if(count > length/2){
                return a[i];
        }else if(count == length/2){
            return -1;
        }
    }
    return -1;
}
/*時(shí)間復(fù)雜度:O(n^2) 空間復(fù)雜度:O(1)*/ 
/*其他解法:先排序再統(tǒng)計(jì)O(nlong2n)*/
/*最優(yōu)解:標(biāo)記一個(gè)可能成為主元素的元素冷尉。然后重新計(jì)算是否為主元素。
        1. 選取候選的主元素(數(shù)列中出現(xiàn)次數(shù)最多的元素):
        依次掃描所給數(shù)組中的每個(gè)整數(shù)系枪,將遇到的第一個(gè)元素保存到main中雀哨,
        記錄該元素出現(xiàn)的次數(shù)為1;若遇到下一個(gè)整數(shù)仍等于main,則count+1私爷,否則count-1雾棺。
        當(dāng)count == 0時(shí),將遇到的下一個(gè)整數(shù)保存到main中衬浑,count重新設(shè)置為1,開(kāi)始新一輪計(jì)數(shù)工秩。
        重復(fù)上述過(guò)程直到掃描完所有數(shù)組元素尸饺。
        2.判斷main是否為真正的主元素:再次遍歷數(shù)組助币,統(tǒng)計(jì)main元素出現(xiàn)的次數(shù)浪听,
        如果大于數(shù)組長(zhǎng)度一半則返回main否則返回-1.*/ 

int getMain(int a[],int length){
    int i, main , count = 1;
    main = a[0];
    for(i = 1;i < length;i++){
        if(a[i] == main){
            count++ ;
        }else{
            if(count>0){
                count--;
            }else{
                main = a[i];
                count = 1;
            }
        }
    }
    if(count > 0){
        for(i = count = 0;i<length;i++){
            if(a[i] == main){
                count++;
            }
        }
    }
    if(count > (length/2)){
        return main;
    }else return -1;
} 
/*時(shí)間復(fù)雜度:O(N),空間復(fù)雜度O(1)*/

參考資料:《王道數(shù)據(jù)結(jié)構(gòu)考研復(fù)習(xí)指導(dǎo)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眉菱,一起剝皮案震驚了整個(gè)濱河市迹栓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倍谜,老刑警劉巖迈螟,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尔崔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)季春,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)载弄,“玉大人耘拇,你說(shuō)我怎么就攤上這事∮罟ィ” “怎么了惫叛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逞刷。 經(jīng)常有香客問(wèn)我嘉涌,道長(zhǎng)妻熊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任扔役,我火速辦了婚禮,結(jié)果婚禮上亿胸,老公的妹妹穿的比我還像新娘。我一直安慰自己预皇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布深啤。 她就那樣靜靜地躺著路星,像睡著了一般溯街。 火紅的嫁衣襯著肌膚如雪洋丐。 梳的紋絲不亂的頭發(fā)上呈昔,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天友绝,我揣著相機(jī)與錄音堤尾,去河邊找鬼迁客。 笑死郭宝,一個(gè)胖子當(dāng)著我的面吹牛掷漱,可吹牛的內(nèi)容都是我干的粘室。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衔统,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锦爵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤险掀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后湾宙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體枝恋,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗡害,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年焚碌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霸妹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十电。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叹螟,死狀恐怖鹃骂,靈堂內(nèi)的尸體忽然破棺而出罢绽,到底是詐尸還是另有隱情畏线,我是刑警寧澤良价,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布寝殴,位于F島的核電站明垢,受9級(jí)特大地震影響蚣常,放射性物質(zhì)發(fā)生泄漏痊银。R本人自食惡果不足惜抵蚊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一溯革、第九天 我趴在偏房一處隱蔽的房頂上張望贞绳。 院中可真熱鬧致稀,春花似錦冈闭、人聲如沸豺裆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躺酒。三九已至蔑歌,卻和暖如春羹应,著一層夾襖步出監(jiān)牢的瞬間次屠,已是汗流浹背园匹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裸违,地道東北人掖桦。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓供汛,卻偏偏與公主長(zhǎng)得像枪汪,于是被迫代替她去往敵國(guó)和親怔昨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雀久,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359