演算法與數據結構試卷
A. 求《演算法與數據結構考研試題精析第三版》全文免費下載百度網盤資源,謝謝~
《演算法與數據結構考研試題精析第三版》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1hdJxho2NwiuZLzCNLVmA5A
簡介:《演算法與數據結構考研試題精析(第4版)》可以作為高等院校計算機及相關專業數據結構課程的參考書,也可作為相關專業碩士研究生考試的參考書,同時適用於講授該課程的教師以及希望學習數據結構課程的其他人員。
B. 求數據結構試題…重點
這是我們老師要求的重點,即考點。列印出來,背一下就行了,准過!
第一章:緒論
1.1:數據結構課程的任務是:討論數據的各種邏輯結構、在計算機中的存儲結構以及各種操作的演算法設計。
1.2:數據:是客觀描述事物的數字、字元以及所有的能輸入到計算機中並能被計算機接收的各種集合的統稱。
數據元素:表示一個事物的一組數據稱作是一個數據元素,是數據的基本單位。
數據項:是數據元素中有獨立含義的、不可分割的最小標識單位。
數據結構概念包含三個方面:數據的邏輯結構、數據的存儲結構的數據的操作。
1.3數據的邏輯結構指數據元素之間的邏輯關系,用一個數據元素的集合定義在此集合上的若干關系來表示,數據結構可以分為三種:線性結構、樹結構和圖。
1.4:數據元素及其關系在計算機中的存儲表示稱為數據的存儲結構,也稱為物理結構。
數據的存儲結構基本形式有兩種:順序存儲結構和鏈式存儲結構。
2.1:演算法:一個演算法是一個有窮規則的集合,其規則確定一個解決某一特定類型問題的操作序列。演算法規則需滿足以下五個特性:
輸入——演算法有零個或多個輸入數據。
輸出——演算法有一個或多個輸出數據,與輸入數據有某種特定關系。
有窮性——演算法必須在執行又窮步之後結束。
確定性——演算法的每個步驟必須含義明確,無二義性。
可行性——演算法的每步操作必須是基本的,它們的原則上都能夠精確地進行,用筆和紙做有窮次就可以完成。
有窮性和可行性是演算法最重要的兩個特徵。
2.2:演算法與數據結構:演算法建立數據結構之上,對數據結構的操作需用演算法來描述。
演算法設計依賴數據的邏輯結構,演算法實現依賴數據結構的存儲結構。
2.3:演算法的設計應滿足五個目標:
正確性:演算法應確切的滿足應用問題的需求,這是演算法設計的基本目標。
健壯性:即使輸入數據不合適,演算法也能做出適當的處理,不會導致不可控結
高時間效率:演算法的執行時間越短,時間效率越高。 果。
高空間效率:演算法執行時佔用的存儲空間越少,空間效率越高。
可讀性:演算法的可讀性有利於人們對演算法的理解。
2.4:度量演算法的時間效率,時間復雜度,(課本39頁)。
2.5:遞歸定義:即用一個概念本身直接或間接地定義它自己。遞歸定義有兩個條件:
至少有一條初始定義是非遞歸的,如1!=1.
由已知函數值逐步遞推計算出未知函數值,如用(n-1)!定義n!。
第二章:線性表
1.1線性表:線性表是由n(n>=0)個類型相同的數據元素a0,a1,a2,…an-1,組成的有限序列,記作: LinearList = (a0,a1,a2,…an-1)
其中,元素ai可以是整數、浮點數、字元、也可以是對象。n是線性表的元素個數,成為線性表長度。若n=0,則LinearList為空表。若n>0,則a0沒有前驅元素,an-1沒有後繼元素,ai(0<i<n-1)有且僅有一個直接前驅元素ai-1和一個直接後繼元素ai+1。
1.2線性表的順序存儲是用一組連續的內存單元依次存放線性表的數據元素,元素在內存的物理存儲次序與它們在線性表中的邏輯次序相同。
線性表的數據元素數據同一種數據類型,設每個元素佔用c位元組,a0的存儲地址為
Loc(a0),則ai的存儲地址Loc(ai)為:Loc(ai) = Loc(a0)+ i*c
數組是順序存儲的隨機存儲結構,它佔用一組連續的存儲單元,通過下標識別元素,元素地址是下標的線性函數。
1.3:順序表的插入和刪除操作要移動數據元素。平均移動次數是 屬數據表長度的一半。(課本第50頁)
1.4:線性表的鏈式存儲是用若乾地址分散的存儲單元存儲數據元素,邏輯上相鄰的數據元素在物理位置上不一定相鄰,必須採用附加信息表示數據元素之間的順序關系。
它有兩個域組成:數據域和地址域。通常成為節點。(課本第55頁及56頁)
1.5單鏈表(課本56頁)
單鏈表的遍歷:Node<E> p = head; while(p!=null){ 訪問p節點;p = p.next;}
單鏈表的插入和刪除操作非常簡便,只要改變節點間的鏈接關系,不需移動數據元素。
單鏈表的插入操作:1):空表插入/頭插入 2)中間插入/尾插入
if(head == null) Node<E> q = new Node<E>(x);
{ head = new Node<E>(x); q.next = p.next;
}else{ p.next = q;
Node<E> q=new Node<E>(x); 中間插入或尾插入都不會改變單表
q.next = head; 的頭指針head。
head = q;
}
單鏈表的刪除操作:
頭刪除:head = head.next;
中間/尾刪除:if(p.next!=null){ p.next = p.next.next;}
循環單鏈表:如果單鏈表最後一個節點的next鏈保存單鏈表的頭指針head值,則該單鏈表成為環形結構,稱為循環單鏈表。(課本67)
若rear是單鏈表的尾指針,則執行(rear.next=head;)語句,使單鏈表成為一條循環單鏈表。當head.next==head時,循環單鏈表為空。
1.6:雙鏈表結構:雙鏈表的每個結點有兩個鏈域,分別指向它的前驅和後繼結點,
當head.next==null時,雙鏈表為空。
設p指向雙鏈表中非兩端的某個結點,則成立下列關系:p=p.next.prev=p.prev.next。
雙鏈表的插入和刪除:1)插入 2)刪除
q=new DLinkNode(x); p.prev.next = p.next;
q.prev=p.prev;q.next =p; if(p.next=null){
p.prev.next = q;p.prev=q; (p.next).prev = p.prev;}
循環雙鏈表:當head.next==head且head.prev==head時,循環雙鏈表為空。
第三章:棧和隊列
1.1棧:棧是一種特殊的線性表,其中插入和刪除操作只允許在線性表的一端進行。允許操作的一端稱為棧頂,不允許操作的一端稱為棧底。棧有順序棧和鏈式棧。
棧中插入元素的操作稱為入棧,刪除元素的操作稱為出棧。沒有元素的中稱為空棧。
棧的進出棧順序:後進先出,先進後出。(及75頁的思考題)。
1.2:隊列:隊列是一種特殊的線性表,其中插入和刪除操作分別在線性表的兩端進行。
向隊列中插入元素的過程稱為入隊,刪除元素的過程稱為出對,允許入隊的一端稱為隊尾,允許出隊的一端稱為對頭。沒有元素的隊列稱為空隊列。隊列是先進先出。
第四章:串
1.1:串是一種特殊的線性表,其特殊性在於線性表中的每個元素是一個字元。一個串記為: s=「s0s1s2…sn-1」 其中n>=0,s是串名,一對雙引號括起來的字元序列s0s1s2…sn-1是串值,si(i=0,1,2,…n-1)為特定字元集合中的一個字元。一個串中包含的字元個數稱為串的長度。
長度為0的串稱為空串,記作「」,而由一個或多個空格字元構成的字元串稱為空格串。
子串:由串s中任意連續字元組成的一個子序列sub稱為s的子串,s稱為sub的主串。子串的序號是指該子串的第一個字元在主串中的序號。
串比較:兩個串可比較是否相等,也可比較大小。兩個串(子串)相等的充要條件是兩個串(子串)的長度相同,並且各對應位置上的字元也相同。
兩個串的大小由對應位置的第一個不同字元的大小決定,字元比較次序是從頭開始依次向後。當兩個串長度不等而對應位置的字元都相同時,較長的串定義為較「大」。
第五章:數組和廣義表
1.1:數組是一種數據結構,數據元素具有相同的數據類型。一維數組的邏輯結構是線性表,多維數組是線性表的擴展。
1.2:一維數組:一維數組採用順序存儲結構。一個一維數組佔用一組連續的存儲單元。
設數組第一個元素a0的存儲地址為Loc(a0),每個元素佔用c位元組,則數組其他元素ai的存儲地址Loc(ai)為: Loc(ai)= Loc(a0)+i*c
數組通過下標識別元素,元素地址是下標的線性函數。一個下標能夠唯一確定一個元素,所劃給的時間是O(1)。因此數組是隨機存取結構,這是數組最大的優點。
1.3:多維數組的遍歷:有兩種次序:行主序和列主序。
行主序:以行為主序,按行遞增訪問數組元素,訪問完第i行的所有元素之後再訪問第i+1行的元素,同一行上按列遞增訪問數組元素。
a00,a01,…a0(n-1), a10,a11,…a1(n-1),…a(m-1)0,a(m-1)1,…,a(m-1)(n-1)
2)列主序:以列為主序,按列遞增訪問數組元素,訪問完第j列的所有元素之後再訪問第j+1列的元素,同一列上按列遞增訪問數組元素。
多維數組的存儲結構:多維數組也是由多個一維數組組合而成,組合方式有一下兩種。
靜態多維數組的順序存儲結構:可按行主序和列主序進行順序存儲。
按行主序存儲時,元素aij的地址為:Loc(aij)= Loc(a00)+(i*n+j)*c
按列主序存儲時,Loc(aij)= Loc(a00)+(j*m+i)*c
動態多維數組的存儲結構。
二維數組元素地址就是兩個下標的線性函數。無論採用哪種存儲結構,多維數組都是基於一維數組的,因此也只能進行賦值、取值兩種存取操作,不能進行插入,刪除操作。
第六章:
樹是數據元素(結點)之間具有層次關系的非線性結構。在樹結構中,除根以外的結點只有一個直接前驅結點,可以有零至多個直接後繼結點。根沒有前驅結點。
樹是由n(n>=0)個結點組成的有限集合(樹中元素通常稱為結點)。N=0的樹稱為空樹;n>0大的樹T;
@有一個特殊的結點稱為根結點,它只有後繼結點,沒有前驅結點。
@除根結點之外的其他結點分為m(m>=0)個互不相交的集合T0,T1,T3……..,Tm-1,其中每個集合Ti(0<=i<m)本身又是一棵樹,稱為根的子樹。
樹是遞歸定義的。結點是樹大的基本單位,若干個結點組成一棵子樹,若干棵互不相交的子樹組成一棵樹。樹的每個結點都是該樹中某一棵子樹的根。因此,樹是由結點組成的、結點之間具有層次關系大的非線性結構。
結點的前驅結點稱為其父母結點,反之,結點大的後繼結點稱為其孩子結點。一棵樹中,只有根結點沒有父母結點,其他結點有且僅有一個父母結點。
擁有同一個父母結點的多個結點之間稱為兄弟結點。結點的祖先是指從根結點到其父母結點所經過大的所有結點。結點的後代是指該結點的所有孩子結點,以及孩子的孩子等。
結點的度是結點所擁有子樹的棵數。度為0的結點稱為葉子結點,又叫終端結點;樹中除葉子結點之外的其他結點稱為分支結點,又叫非葉子結點或非終端結點。樹的度是指樹中各結點度的最大值。
結點的層次屬性反應結點處於樹中的層次位置。約定根結點的層次為1,其他結點的層次是其父母結點的層次加1。顯然,兄弟結點的層次相同。
樹的高度或深度是樹中結點的最大層次樹。
設樹中x結點是y結點的父母結點,有序對(x,y)稱為連接這兩個結點的分支,也稱為邊。
設(X0,X1,….,Xk-1)是由樹中結點組成的一個序列,且(Xi,Xi+1)(0<=i<k-1)都是樹中的邊,則該序列稱為從X0到Xk-1的一條路徑。路徑長度為路徑上的邊數。
在樹的定義中,結點的子樹T0,T1…..,Tm-1之間沒有次序,可以交換位置,稱為無序樹,簡稱樹。如果結點的子樹T0,T1……,Tm-1從左到右是有次序的,不能交換位置,則 稱該樹為有序樹。
森林是m(m>=0)棵互不相乾的樹的集合。給森林加上一個根結點就變成一棵樹,將樹的根節點刪除就變成森林。
二叉樹的性質1:若根結點的層次為1,則二叉樹第i層最多有2 的i-1次方(i>=1)個結點。
二叉樹的性質2:在高度為k的二叉樹中,最多有2的k次方減一個結點。
二叉樹的性質3:設一棵二叉樹的葉子結點數為n0,2度結點數為n2,則n0=n2+1。
一棵高度為k的滿二叉樹是具有2的k次方減一個結點的二叉樹。滿二叉樹中每一層的結點數目都達到最大值。對滿二叉樹的結點進行連續編號,約定根節點的序號為0,從根節點開始,自上而下,每層自左至右編號。
一棵具有n個結點高度為k的二叉樹,如果他的每個節點都與高度為k的滿二叉樹中序號為0~n-1
的結點一一對應,則這棵二叉樹為為完全二叉樹。
滿二叉樹是完全二叉樹,而完全二叉樹不一定是滿二叉樹。完全二叉樹的第1~k-1層是滿二叉樹第k層不滿,並且該層所有結點必須集中在該層左邊的若干位置上。
二叉樹的性質4:一棵具有n個結點的完全二叉樹,其高度k=log2n的絕對值+1
二叉樹的性質5:一棵具有n個結點的完全二叉樹,對序號為i的結點,有
@若i=0,則i為根節點,無父母結點;若i>0,則i的父母結點的序號為[(i-1)/2]。
@若2i+1<n,則i的左孩子結點序號為2i+1;否則i無左孩子。
@若2i+2<n,則i的右孩子結點的序號為2i+2,否則i無右孩子。
二叉樹的遍歷
二叉樹的遍歷是按照一定規則和次序訪問二叉樹中的所有結點,並且每個結點僅被訪問一次。
二叉樹的三種次序遍歷
1:先根次序;訪問根節點,遍歷左子樹,遍歷右子樹。
2:中根次序;遍歷左子樹,訪問右子樹,遍歷右子樹。
3:後根次序;遍歷左子樹,遍歷右子樹,訪問根節點。
先根次序遍歷時,最先訪問根節點;後根次序遍歷時,最後訪問根節點;中根次序遍歷時,左子樹上的結點在根節點之前訪問,右子樹上的結點在根節點之後訪問。
二叉樹的插入和刪除操作P147
二叉樹的層次遍歷P149
習題P167 6—10,6—19
第七章
圖是由定點集合及頂點間的關系集合組成的一種數據關邊系。頂點之間的關系成為邊。一個圖G記為G=(V,E),V是頂點A的有限集合,E是邊的有限集合。即 V={A|A屬於某個數據元素集合}
E={(A,B)|A,B屬於V}或E={<A,B>|A,B屬於V且Path(A,B)}其中Path(A,B)表示從頂點A到B的一條單向通路,即Path(A,B)是有方向的。
無向圖中的邊事沒有方向,每條邊用兩個頂點的無序對表示。
有向圖中的邊是有方向,每條邊用兩個頂點的有序對表示。
完全圖指圖的邊數達到最大值。n個頂點的完全圖記為Kn。無向完全圖Kn的邊數為n*(n-1)/2,有向完全圖Kn的邊數為n*(n-1)。
子圖:設圖G==(V,E),G』=(V』,E』),若V』包含於V且E』包含於E,則稱圖G』是G的子圖。若G』是G的真子圖。
連通圖:在無向圖G中,若從頂點VI到Vj有路徑,則稱Vi和Vj是聯通的。若圖G中任意一對頂點Vi和Vj(Vi不等於Vj)都是聯通的,則稱G為連通圖。非連通圖的極大聯通子圖稱為該圖的聯通分量。
強連通圖:在有向圖中,若在每一對頂點Vi和Vj(Vi不等於Vj)之間都存在一條從Vi到Vj的路徑,也存在一條從Vi到Vj的路徑,也存在一條從Vi到Vj的路徑,則稱該圖的強連通圖。非強連通圖的極大強連通子圖稱為該圖的強連通圖分量。
圖的遍歷
遍歷圖是指從圖G中任意一個頂點V出發,沿著圖中的邊前行,到達並訪問圖中的所有頂點,且每個頂點僅被訪問一次。遍歷圖要考慮一下三個問題:
@指定遍歷的第一個訪問頂點
@由於一個頂點可能與多個頂點相鄰,因此要在多個鄰接頂點之間約定一種訪問次序。
@由於圖中可能存在迴路,在訪問某個頂點之後,可能沿著某條路徑又回到該頂點。
深度優先搜索
圖的深度優先搜索策略是,訪問某個頂點v,接著尋找v的另一個未被訪問的鄰接頂點w訪問,如此反復執行,走過一條較長路徑到達最遠頂點;若頂點v沒有未被訪問的其他鄰接頂點,則回到前一個被訪問頂點,再尋找其他訪問路徑。
圖的深度優先搜索遍歷演算法P188
聯通的無迴路的無向圖,簡稱樹。樹中的懸掛點又成為樹葉,其他頂點稱為分支點。各連通分量均為樹的圖稱為森林,樹是森林。
由於樹中無迴路,因此樹中必定無自身環也無重邊(否則他有迴路)若去掉樹中的任意一條邊,則變成森林,成為非聯通圖;若給樹加上一條邊,形成圖中的一條迴路,則不是樹。P191
生成樹和生成森林:
一個連通無向圖的生成樹是該圖的一個極小聯通生成子圖,它包含原圖中所有頂點(n個)以及足以構成一棵樹的n-1條邊。
一個非聯通的無向圖,其各連通圖分量的生成圖組成該圖的生成森林。
圖的生成圖或生成森林不是唯一的,從不同頂點開始、採用不同遍歷可以得到不同的生成樹或森林。
在生成樹中,任何樹中,任何兩個頂點之間只有唯一的一條路徑。
第八章
折半查找演算法描述 P206,P207
二叉排序樹及其查找:
二叉排序樹或者是一棵空樹;或者是具有下列性質的二叉樹:
@每個結點都有一個作為查找依據的關鍵字,所有結點的關鍵字互不相同。
@若一個結點的左子樹不空,則左子樹上所有結點的關鍵字均小於這個節點的關鍵字;
@每個結點的左右子樹也分別為二叉排序樹。
在一棵二叉排序樹中,查找值為value的結點,演算法描述如下:
@從根結點開始,設p指向根結點
@將value與p結點的關鍵字進行比較,若兩者相等,則查找成功;若value值較小,則在p的左子樹中繼續查找;若value值較大,則在p的右子樹中繼續查找。
@重復執行上一步,直到查找成功或p為空,若p為空,則查找不成功。
習題 8-6
第九章
直接插入排序演算法描述:p228
冒泡排序演算法的描述:p232
快速排序演算法描述p233
直接選擇排序演算法描述p236
直接選擇排序演算法實現如下:
Public static void selectSort(int[]table){
for(int i=0;i<table.length-1;i++){
int min=I;
for(int j=i+1;j<table.length;j++){
if(table[j]<table[min])
min=j;
if(min!=i){
int temp=table[i];
table[i]==table[min];
table[min]=temp;
}
}
}
}
堆排序是完全二叉樹的應用,是充分利用完全二叉樹特性的一種選擇排序。
堆定義:設n個元素的數據序列{k0,k1,。。。。kn-1},當且僅當滿足下列關系
k1<=k2i+1且ki<=k2i+2 i=0,1,2,3,….,[n/2-1]
或ki>==k2i+1且ki>=2i+2i=0,1,2,3,…..[n/2-1]時,序列{k0,k1…….kn-1}稱為最小堆或最大堆。將最小(大)堆看成是一顆完全二叉樹的層次遍歷序列,則任意一個結點的關鍵字都小於等於(大於等於)它的孩子節點的關鍵字值,由此可知,根結點值最小(大)。根據二叉樹的性質5,完全二叉樹中的第i(0<=i<n)個結點,如果有孩子,則左孩子為第2i+1個結點,右孩子為第2i+2個結點。
希望對你會有所幫助。
C. 數據結構與演算法試題,高分,求答案啊
給你第一題解法吧:後面的實在是不想做。
先根:ABCDEFGHI
中根:CBEDAGFHI
遍歷的基本方法:先左子樹後右子樹。
1,先根遍歷可以確定根節點為A,
2,依據1步,可以在中根遍歷中確定左子樹為:CBED,右為:GFHI
3,在可以重復1,2步。就可以得到結果。
A
BF
CDGH
I
4,O(n^3)+O(1)
D. 求下面數據結構試題的答案...
一.
1,復雜性2.線性結構非線性結構
3.可以按序號隨機存取4.數據元素
5.後進先出6.n7.只能在隊頭進行
9.長度1深度1
10-+A*BC/DE
11
12頂點Vp到頂點Vq之間的路徑是指定的序列Vp,Vi1,Vi2•••Vim,Vq。
13n(n-2)/214n—1152n—1
17一種存儲結構
19可以從表中任意結點開始遍歷整個鏈表;只用一個指向尾結點的指針對鏈表頭、尾進行操作,提高了效率。
20棧是僅限制在表的一端進行插入和刪除的運算的線性表,是一種操作受限的線性表。
二.
1演算法的時間復雜度和空間復雜度
2.隊列
3.
4嵌套集合表示法,廣義表表示法,凹入表示法
5.456.S(1)X(1)S(2)S(3)X(3)S(4)X(4)X(2)
7(1)O(nˆ2)
(2)O(nˆ2)
8.
哈夫曼樹:
WPL=2*5+4*5+5*4+16*3+8*3+7*3+30=173
9.鄰接矩陣:
鄰接表:
10.二叉樹:
前序:ABCEFD
中序:BEFCDA
後序:FEDCBA
E. 數據結構演算法 試題 急! 試構造下圖的最小生成樹,要求分步給出構造過程。
圖有如下參數:
邊數=8頂點數=5
頂點頂點邊的權值
v1v26
v1v34
v1v42
v2v35
v2v48
v2v56
v3v45
v4v57
用Kruskal(克魯斯卡爾)演算法,求最小生成樹.
先將所有邊的權值按照從小到大排序:
頂點頂點邊的權值
v1v42
v1v34
v2v35
v3v45
v1v26
v2v56
v4v57
v2v48
然後,每次提取權值最小邊,逐步組成最小生成樹:
(1)取最小邊(v1,v4,2)
v1--v4
(2)取邊(v1,v3,4),不會產生環路.
v1--v4
|
|
v3
(3)取邊(v2,v3,5),不會產生環路.
v1--v4
|
|
v3--v2
(4)如果取邊(v3,v4,5),會產生環路,所以不能取.
如果取邊(v1,v2,6),會產生環路,所以不能取.
取邊(v2,v5,6),不會產生環路.
v1--v4
|
|
v3--v2--v5
這就是最小生成樹,連通了所有頂點,總權值最小.
頂點邊的權值
(v1,v4)2
(v1,v3)4
(v2,v3)5
(v2,v5)6
//C語言測試程序
//最小生成樹Kruskal(克魯斯卡爾)演算法
#include"stdio.h"
#defineMAXEDGE20
#defineMAXVEX20
#defineINF65535
typedefstruct
{
intarc[MAXVEX][MAXVEX];
intnumVertexes,numEdges;
}MGraph;
typedefstruct
{
intbegin;
intend;
intweight;
}Edge;//對邊集數組Edge結構的定義
//創建圖
voidCreateMGraph(MGraph*G)
{
inti,j;
G->numEdges=8;//邊數
G->numVertexes=5;//頂點數
for(i=0;i<G->numVertexes;i++)//初始化圖
{
for(j=0;j<G->numVertexes;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=G->arc[j][i]=INF;
}
}
G->arc[0][1]=6;
G->arc[0][2]=4;
G->arc[0][3]=2;
G->arc[1][2]=5;
G->arc[1][3]=8;
G->arc[1][4]=6;
G->arc[2][3]=5;
G->arc[3][4]=7;
for(i=0;i<G->numVertexes;i++)
{
for(j=i;j<G->numVertexes;j++)
{
G->arc[j][i]=G->arc[i][j];
}
}
}
//交換權值以及頭和尾
voidSwapn(Edge*edges,inti,intj)
{
inttemp;
temp=edges[i].begin;
edges[i].begin=edges[j].begin;
edges[j].begin=temp;
temp=edges[i].end;
edges[i].end=edges[j].end;
edges[j].end=temp;
temp=edges[i].weight;
edges[i].weight=edges[j].weight;
edges[j].weight=temp;
}
//對權值進行排序(選擇排序法)
voidsort(Edgeedges[],MGraph*G)
{
inti,j,min;
for(i=0;i<(G->numEdges-1);i++)
{
min=i;
for(j=i+1;j<G->numEdges;j++)
{
if(edges[min].weight>edges[j].weight)
{
min=j;
}
}
if(i!=min)
{
Swapn(edges,i,min);
}
}
printf("邊的權值排序之後: ");
for(i=0;i<G->numEdges;i++)
{
printf("(%d,%d)%d ",edges[i].begin,edges[i].end,edges[i].weight);
}
}
//查找連線頂點的尾部下標
intFind(int*parent,intf)
{
while(parent[f]>0)
{
f=parent[f];
}
returnf;
}
//生成最小生成樹
voidMiniSpanTree_Kruskal(MGraphG)
{
inti,j,n,m;
intk=0;
intparent[MAXVEX];//定義一數組用來判斷邊與邊是否形成環路
Edgeedges[MAXEDGE];//定義邊集數組,edge的結構為begin,end,weight,均為整型
//用來構建邊集數組並排序
for(i=0;i<G.numVertexes-1;i++)
{
for(j=i+1;j<G.numVertexes;j++)
{
if(G.arc[i][j]<INF)
{
edges[k].begin=i;
edges[k].end=j;
edges[k].weight=G.arc[i][j];
k++;
}
}
}
sort(edges,&G);//從小到大排序
for(i=0;i<G.numVertexes;i++)
{
parent[i]=0;
}
printf("列印最小生成樹: ");
for(i=0;i<G.numEdges;i++) //循環每一條邊
{
n=Find(parent,edges[i].begin);
m=Find(parent,edges[i].end);
if(n!=m)//假如n與m不等,說明此邊沒有與現有的生成樹形成環路
{
parent[n]=m; //將此邊的結尾頂點放入下標為起點的parent中
//表示此頂點已經在生成樹集合中
printf("(%d,%d)%d ",edges[i].begin,edges[i].end,edges[i].weight);
}
}
}
intmain(void)
{
MGraphG;
CreateMGraph(&G);
MiniSpanTree_Kruskal(G);
return0;
}
F. 誰有數據結構的期末試題,借我參考下馬上考試了
A:
06-07第一學期期末考試試卷
試卷代碼:03266A 授課課時:112
課程名稱:數據結構與演算法 適用對象:本科
一、單項選擇題(從下列各題四個備選答案中選出一個正確答案,並將其代號寫在答題紙相應位置處。答案錯選或未選者,該題不得分。每小題2分,共24分。)
1.數據結構被形式地定義為(K,R),其中K是數據元素的有限集,R是K上的___有限集。
A.操作 B.映像 C.存儲 D.關系
2.線性表若採用鏈式存儲結構時,要求內存中可用存儲單元的地址____。
A.必須連續的 B.部分地址必須連續的 C.一定是不續的 D.連續不連續都可以
3.一個棧的入棧序列是a、b、c、d、e,則棧的不可能輸出序列是____。
A.edcba B.decba C.dceab D.abcde
4.一個隊列的入隊序列是1、2、3、4,則隊列輸出序列是____。
A.4、3、2、1 B.1、2、3、4 C.1、4、3、2 D.3、2、4、1
5.棧和隊列的共同點是____。
A.都是先進後出 B.都是先進先出
C.只允許在端點處插入、刪除元素 D.沒有共同點
6.在一個單鏈表中,已知q所指結點是p所指結點的前驅結點,若在q和p之間插入s結點,則執行____。
A. s->next = p->next; p->next=s; B. p->next = s->next; s->next = p;
C. q->next = s; s->next = p; D. p->next = s; s->next = q;
7.設串s1=『ABCDEFG』,s2=『PQRST』,函數con (x, y) 返回x與y串的連接串,函數subs (s, i, j) 返回串s的從序號i的字元開始的j個字元組成的子串,函數len (s) 返回串s的長度,則con (subs (s1, 2, len (s2)), subs (s1, len (s2), 2)) 的結果串是____。
A. BCDEF B. BCDEFG C. BCPQRST D. BCDEFEF
8.設高度為h的二叉樹上只有度為0和度為2的結點,則此類二叉樹中所包含的結點數至少為____。
A. 2h B. 2h-1 C. 2h +1 D. h +1
9.某二叉樹的前序遍歷結點訪問順序是abdgcefh,中序遍歷結點訪問順序是dgbaechf,則其後序遍歷結點訪問順序是____。
A. bdgcefha B. gdbecfha C. bdgaechf D. gdbehfca
10.具有6個頂點的無向圖至少應有____條邊才能確保是一個連通圖。
A. 5 B. 6 C. 7 D. 8
11.採用順序查找方法查找長度為n的線性表時,每個元素的平均查找長度為–。
A. n B. n/2 C. (n+1)/2 D. (n-1)/2
12.排序方法中,從未排序序列中挑選元素,並將其依次放入已排序序列(註:初始時為空)的一端的方法,稱為____。
A. 希爾排序 B. 歸並排序 C. 插入排序 D. 選擇排序
二、填空題(請在每小題的橫線上填入正確內容,每空1分,共7分。)
1.在樹形結構中,樹根結點沒有 結點,其餘每個結點有且只有 個前驅結點。
2.對n個元素的序列進行起泡排序時,最少的比較次數是 。
3.空串是 ,其長度等於0。
4.一棵有n個結點的滿二叉樹共有 個葉子結點。
5.在散列函數H(key)=key % p中,p應取 。
6.已知模式串t=『abcaabbabc』, 其用KMP法求得的每個字元對應的next函數值為 。
三、簡答題(本大題共3小題,每小題5分,共15分)
1.在對線性表的處理中一般使用兩種存儲結構,順序存儲結構和鏈式存儲結構。試敘述在什麼情況下使用順序表比鏈表好?
2.簡述什麼是穩定的排序,什麼是不穩定的排序。
3.下列中綴表達式對應的後綴形式是什麼?
(1) (A + B) * D + E / (F + A * D) + C
(2) A && B|| ! (E > F) {註:按C的優先順序)
四、判斷題(本大題共10小題,命題正確的在題後括弧內寫 「T」,錯誤的在題後括弧內寫「F」,每小題1分,共10分)
1.數據元素不是數據的最小單位( )。
2.已知一棵二叉樹的前序序列和後序序列可以唯一地構造出該二叉樹。( )
3.AOE網是一種帶權的無環連通圖。( )
4.對於同一組待輸入的關鍵碼集合,雖然各關鍵碼的輸入次序不同,但得到的二叉搜索樹都是相同的( )。
5.一棵樹中的葉子數一定等於與其對應的二叉樹的葉子數。( )
6.鄰接表只能用於有向圖的存儲,鄰接矩陣對於有向圖和無向圖的存儲都適用。( )
7.折半插入排序是穩定的。( )
8.在散列法中,使用雙散列函數可保證絕對不產生沖突。( )
9.消除遞歸不一定需要使用棧( )
10.堆排序是交換排序的一種。( )
五、分析應用題(本題共26分,1、4小題各6分,2、3小題各7分)
1.閱讀後分析下面程序段的功能是什麼? (6分)
SeqStack S1, S2, tmp;
DataType x; //設棧tmp和S2已做過初始化
while ( ! StackEmpty (S1))
{ x=Pop(S1) ;
Push(tmp,x);
}
while ( ! StackEmpty (tmp) )
{ x=Pop(tmp);
Push( S2, x);
}
2.某子系統在通信聯絡中只可能出現8種字元,其出現的概率分別為0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11試設計赫夫曼編碼。(7分)
3.設散列表為HT[13], 散列函數為 H (key) = key %13。用線性探測再散列法解決沖突, 對下列關鍵碼序列 12, 23, 45, 57, 20, 03, 78, 31, 15, 36 造表。畫出相應的散列表, 並計算等概率下搜索成功的平均搜索長度。(7分)
4.設待排序的排序碼序列為{12, 2, 16, 30, 28, 10, 16*, 20, 6, 18}, 試寫出使用希爾排序(增量為5,2,1)方法每趟排序後的結果。(6分)
六、演算法設計題(本題共18分,第1小題10分,第2小題8分)
1.編寫一個演算法frequency,統計在一個輸入字元串中所含各個不同字元出現的頻度。用適當的測試數據來驗證這個演算法。(10分)
2.在一棵以二叉鏈表表示的二叉樹上,試寫出用按層次順序遍歷二叉樹的方法,並統計樹中具有度為1的結點數目的演算法。要求給出二叉鏈表的類型定義。(8分)
答案:
06-07第一學期
期末考試參考答案與評分標准
試卷代碼:03266A 授課課時:112
課程名稱:數據結構與演算法 適用對象:本科
一、單項選擇題(每小題2分,共24分。)
1. D 2. D 3. C 4. B 5. C 6. C
7. D 8. B 9. D 10. A 11. C 12. D
二、填空題(每空1分,共7分。)
1.父(或前驅), 1
2. n-1
3. 不包含任何字元的串
4. (n+1)/2
5. 素數
6. 0111223123
三、簡答題(每小題5分,共15分)
1.答:① 順序存儲時,相鄰數據元素的存放地址也相鄰(邏輯與物理統一);要求內存中可用存儲單元的地址必須是連續的。
優點:存儲密度大,存儲空間利用率高。缺點:插入或刪除元素時不方便。
②鏈式存儲時,相鄰數據元素可隨意存放,但所佔存儲空間分兩部分,一部分存放結點值,另一部分存放表示結點間關系的指針
優點:插入或刪除元素時很方便,使用靈活。缺點:存儲密度小(<1),存儲空間利用率低。
順序表適宜於做查找這樣的靜態操作;鏈表宜於做插入、刪除這樣的動態操作。
若線性表的長度變化不大,且其主要操作是查找,則採用順序表;
若線性表的長度變化較大,且其主要操作是插入、刪除操作,則採用鏈表。
2.答:在排序序列中,任何兩個相等的關鍵字Ki=Kj,如果在排序前的序列中Ki領先於Kj,若在排序後的序列中Ki仍領先於Kj,則稱所用的排序方法是穩定的;反之,若可能使排序後的序列中Kj領先於Ki,則稱所用的排序方法是不穩定的。
3.答:各中綴表達式的後綴形式如下:
(1)AB+D*EFAD*+/+C+
(2)AB&&EF>!||
四、判斷題(本大題共10小題,命題正確的在題後括弧內寫 「T」,錯誤的在題後括弧內寫「F」,每小題1分,共10分)
1.T 2.F 3.T 4.F 5.F
6.F 7.T 8.F 9.T 10.F
五、分析應用題(1、4小題各6分,2、3小題各7分)
1.(6分)
答:程序段的功能是利用tmp棧將一個非空棧s1的所有元素按原樣復制到一個棧s2當中去。
2.(7分)
答:為方便起見,設各種字元的權值w={5,29,7,8,14,23,3,11}。因為n=8,所以要構造的赫夫曼樹共有m=2n-1=2*8-1=15個結點。生成的赫夫曼樹為下圖所示:
赫夫曼編碼為:概率為0.23的字元編碼為:00
概率為0.11的字元編碼為:010
概率為0.05的字元編碼為:0110
概率為0.03的字元編碼為:0111
概率為0.29的字元編碼為:10
概率為0.14的字元編碼為:110
概率為0.07的字元編碼為:1110
概率為0.08的字元編碼為:1111
3.(7分)
答:使用散列函數H(key)=key mod 13 有:
H(12)=12, H(23)=10,H(45)=6,H(57)=5,H(20)=7,H(03)=3,H(78)=0,H(31)=5,H(15)=2,H(36)=10
利用線性探查法造表:
0 1 2 3 4 5 6 7 8 9 10 11 12
78 15 03 57 45 20 31 23 36 12
1 1 1 1 1 1 4 1 2 1
搜索成功的平均搜索長度為:
ASL=1/10(1+1+1+1+1+1+4+1+2+1)=14/10
4.(6分)
答: 希爾排序(增量為5,2,1)
六、演算法設計題(第1小題10分,第2小題8分)
1. (10分)
include <iostream.h>
include」string.h」
int charnumber=128;
void frequency(string&s,int C[ ]){
for(int i=0;i< charnumber;i++) C[i]=0;
for( i=0;i< s.length();i++) C[atoi(s[i])]++;
for( i=0;i< charnumber;i++)
if(C[i]>0) cout<<」(」<<i<<」):\t」<<C[i]<<」\t」;
}
2. (8分)
類型定義(略)
int Level(BiTree bt) //層次遍歷二叉樹,並統計度為1的結點的個數
{
int num=0; //num統計度為1的結點的個數
if(bt){
QueueInit(Q); QueueIn(Q,bt);//Q是以二叉樹結點指針為元素的隊列
while(!QueueEmpty(Q))
{ p=QueueOut(Q); printf(p->data); //出隊,訪問結點
if(p->lchild && !p->rchild ||!p->lchild && p->rchild)
num++;//度為1的結點
if(p->lchild) QueueIn(Q,p->lchild); //非空左子女入隊
if(p->rchild) QueueIn(Q,p->rchild); //非空右子女入隊
}
}
return(num); //返回度為1的結點的個數
}
B:
06-07第一學期期末考試試卷
試卷代碼:03266B 授課課時:112
課程名稱:數據結構與演算法 適用對象:本科
一、單項選擇題(從下列各題四個備選答案中選出一個正確答案,並將其代號寫在答題紙相應位置處。答案錯選或未選者,該題不得分。每小題2分,共24分。)
1.數據結構被形式地定義為 (K, R),其中K是____的有限集,R是K上的關系有限集。
A.演算法 B.數據元素 C.數據操作 D.邏輯結構
2.在數據結構中,從邏輯上可以把數據結構分成____。
A.動態結構和靜態結構 B.緊湊結構和非緊湊結構
C.線性結構和非線性結構 D.內部結構和外部結構
3.以下的敘述中,正確的是____。
A.線性表的存儲結構優於鏈式存儲結構
B.二維數組是其數據元素為線性表的線性表
C.棧的操作方式是先進先出
D.隊列的操作方式是先進後出
4.若一個棧的入棧序列是1、2、3、… 、n,其輸出序列為p1、p2、p3、… 、pn,若p1=n,則pi為____。
A. i B. n = i C. n - i +1 D.不確定
5.判斷一個循環隊列QU (最多元素為m) 為空的條件是____。
A. QU->front == QU->rear B. QU->front != QU->rear
C. QU->front == (QU->rear+1)%m D. QU->front != (QU->rear+1)%m
6.在某單鏈表中,已知p所指結點不是最後結點,在p之後插入s所指結點,則執行____。
A. s->next = p; p->next=s; B. s->next = p->next; p->next = s;
C. s->next = p->next; p = s; D. p->next = s; s->next = p;
7.串是一種特殊的線性表,其特殊性體現在____。
A.可以順序存儲 B.數據元素是一個字元
C.可以鏈接存儲 D.數據元素可以是多個字元
8.已知某二叉樹的後序遍歷序列是dabec,中序遍歷序列是debac,前序遍歷序列是____。
A. acbed B. decab C. deabc D. cedba
9.對於一個滿二叉樹,m個樹葉,n個結點,深度為h,則____。
A. n = h + m B. h + m = 2n C. m = h-1 D. n = 2h -1
10.一個有n個頂點的無向圖最多有____條邊。
A. n B. n(n-1) C. n(n-1)/2 D. 2n
11.順序查找法適合於存儲結構為____的線性表。
A. 散列存儲 B. 順序存儲或鏈接存儲
C. 壓縮存儲 D. 索引存儲
12.在待排序的元素序列基本有序的前提下,效率最高的排序方法是____。
A. 插入排序 B.選擇排序 C.快速排序 D. 歸並排序
二、填空題(請在每小題的橫線上填入正確內容,每空1分,共7分。)
1.在線性結構中,第一個結點 前驅結點,其餘每個結點有且只有1個前驅結點。
2.在無權圖G的鄰接矩陣中,若A[i][j]等於1,則等於A[j][i] = 。
3.根據二叉樹的定義,具有三個結點的二叉樹有 種不同的形態。
4.空格串是指 ,其長度等於 。
5.在散列存儲中,裝填因子α的值越大,則存儲元素時發生沖突的可能性就 。
6.已知模式串t= 『abacabaaad』, 其用KMP法求得的每個字元對應的next函數值為 。
三、簡答題(本大題共3小題,每小題5分,共15分)
1.比較靜態查找與動態查找的主要區別,它們的基本運算有哪些不同?
2.邏輯結構分哪幾種,存儲結構有哪幾種?
3.在具有n(n>1)個結點的各棵不同形態樹中,其中深度最小的那棵樹的深度是多少?它共有多少葉子和非葉子結點?
四、判斷題(本大題共10小題,命題正確的在題後括弧內寫 「T」,錯誤的在題後括弧內寫「F」,每小題1分,共10分)
1.每種數據結構都應具備三種基本運算:插入、刪除、搜索( )。
2.滿二叉樹不一定是完全二叉樹。( )
3.帶權連通圖的最小生成樹的權值之和一定小於它的其它生成樹的權值之和。( )
4.任一棵二叉搜索樹的平均搜索時間都小於用順序搜索法搜索同樣結點的順序表的平均搜索時間。( )
5.線性鏈表中所有結點的類型必須相同。( )
6.用鄰接矩陣存儲一個圖時,在不考慮壓縮存儲的情況下,所佔用的存儲空間大小隻與圖中頂點個數有關,而與圖的邊數無關( )。
7.在散列法中解決沖突時,其裝載因子的取值一定在(0,1)之間。( )
8.任何一個關鍵活動延遲,那麼整個工程將會延遲。( )
9.平衡二叉樹的左右子樹深度之差的絕對值不超過1。( )
10.n個結點的有向圖,若它有n(n-1)條邊,則它一定是強連通的。( )
五、分析應用題(本題共26分,1、4小題各6分,2、3小題各7分)
1.下述演算法的功能是什麼? (6分)
LinkList Demo(LinkList L)
{ // L 是無頭結點單鏈表
ListNode *Q,*P;
if(L&&L->next){
Q=L;
L=L->next;
P=L;
while (P->next) P=P->next;
P->next=Q; Q->next=NULL;
}
return L;
}
2.將給定的圖簡化為最小的生成樹,要求從頂點1出發。(7分)
3.設散列表為HT[13], 散列函數為 H (key) = key %13。用雙散列法解決沖突, 對下列關鍵碼序列 12, 23, 45, 57, 20, 03, 78, 31, 15, 36 造表。再散列函數為 RH (key) = (7*key) % 10 + 1, 尋找下一個地址的公式為 Hi = (Hi-1 + RH (key)) % 13, H1 = H (key)。畫出相應的散列表, 並計算等概率下搜索成功的平均搜索長度。(7分)
4.設待排序的排序碼序列為{12, 2, 16, 30, 28, 10, 16*, 20, 6, 18},寫出使用快速排序法每趟排序後的結果。(6分)
六、演算法設計題(本題共18分,第1小題10分,第2小題8分)
1.試設計一個實現下述要求的查找運算函數Locate。設有一個帶表頭結點的雙向鏈表L, 每個結點有4個數據成員:指向前驅結點的指針llink、指向後繼結點的指針rlink,存放字元數據的成員data和訪問頻度freq。所有結點的freq 初始時都為0。每當在鏈表上進行一次Locate(L, x) 操作時,令元素值為x的結點的訪問頻度freq加1,並將該結點前移,鏈接到與它的訪問頻度相等的結點後面,使得鏈表中所有結點保持按訪問頻度遞減的順序排列,以使頻繁訪問的結點總是靠近表頭。(10分)
2.設一棵二叉樹以二叉鏈表為存貯結構,設計一個演算法將二叉樹中所有結點的左,右子樹相互交換。要求給出二叉鏈表的類型定義。(8分)
答案:
06-07第一學期
期末考試參考答案與評分標准
試卷代碼:03266B 授課課時:112
課程名稱:數據結構與演算法 適用對象:本科
一、單項選擇題(每小題2分,共24分。)
1. B 2. C 3. B 4. C 5. A 6. B
7. B 8. D 9. D 10.C 11. B 12. A
二、填空題(每空1分,共7分。)
1. 無
2. 1
3. 5
4. 串中字元全為空格 , 空格的個數
5. 大
6. 0112123422 。
三、簡答題(本大題共5小題,每小題5分,共15分)
1.答:兩種查找方法最大的區別在於:
靜態查找方法不修改查找表;動態查找在查找不成功時,將結點插入查找表中,即有可能修改查找表;
靜態查找的基本運算有建表、查找和讀表元;動態查找除上述基本操作外還有初始化、插入和刪除操作;
2.答:根據數據元素之間關系的不同特性,通常有下列四類基本結構:(1)集合;(2)線性結構;(3)樹形結構;(4)圖狀結構或網狀結構。有兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。
3.答:深度最小的那棵樹的深度為2。對於這n個結點,除了一個根結點之外,其餘得n-1個結點均為葉子結點,故其深度為2。該樹葉子結點數為n-1,非葉子結點數為1。
四、判斷題(每小題1分,共10分)
1. (T) 2. (F) 3. (T) 4. (F) 5. (T)
6. (T) 7. (F) 8. (T) 9. (T ) 10.(T)
五、分析應用題(本題共26分,1、4小題各6分,2、3小題各7分)
1.(6分)
答:該演算法的功能是:將開始結點摘下鏈接到終端結點之後成為新的終端結點,而原來的第二個結點成為新的開始結點,返回新鏈表的頭指針。
2.(7分)
答:
3.(7分)
答:使用散列函數H(key)=key mod 13 有:
H(12)=12, H(23)=10,H(45)=6,H(57)=5,H(20)=7,H(03)=3,H(78)=0,H(31)=5,H(15)=2,H(36)=10
利用雙散列法造表:Hi =(Hi-1+RH(key))%13, Hi =H(key)
0 1 2 3 4 5 6 7 8 9 10 11 12
78 15 03 57 45 20 31 36 23 12
1 1 1 1 1 1 3 5 1 1
搜索成功的平均搜索長度為:ASL =1/10(1+1+1+1+1+1+3+5+1+1)=16/10
4.(6分)
答:
六、演算法設計題(第1小題10分,第2小題8分)
1.(10分)
答:
(1) 定義鏈表結構
struct DoubleListNode {
char data ;
int freq;
DoubleListNode * llink, *rlink ;
};
初始時,所有結點的freq域的值都為0。
(2) 定義函數
DoubleListNode * locate ( DoubleListNode *f ; char &x ) {
DoubleListNode * p, *q;
p = f→rlink; /*跳過表頭結點*/
while ( p != NULL && p→data != x ) p = p→rlink; /*搜索*/
if ( p ) {
p→freq ++; q = p→llink;
p→rlink→llink = q; q→rlink = p→rlink; /*從鏈中摘下p*/
while ( q != f &&q→freq < p→freq ) q =q→llink;
p→llink = q;
p→rlink = q→rlink; q→rlink→llink = p;
q→rlink = p; /*在q後面插入p*/
}
return p;
}
2. (8分)
答:類型定義(略)
void exchange(BiTree bt)//將二叉樹bt所有結點的左右子樹交換
{
if(bt)
{ BiTree s;
s=bt->lchild; bt->lchild=bt->rchild; bt->rchild=s; //左右子女交換
exchange(bt->lchild); //交換左子樹上所有結點的左右子樹
exchange(bt->rchild); //交換右子樹上所有結點的左右子樹
}
}
G. 數據結構與演算法處理面試題
1、時針走一圈,時針分針重合幾次
2、N*N的方格紙,裡面有多少個正方形
3、2000萬個整數,找出第五十大的數字?
4、網路POI中如何試下查找最近的商家功能(提示:坐標鏡像+R樹)。
5、一個文件中有100萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件中。說出最優的方法
6、兩個不重復的數組集合中,這兩個集合都是海量數據,內存中放不下,怎麼求共同的元素?
7、燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鍾呢?
8、萬億級別的兩個URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁碟定址以及應用層面對定址的優化)
9、怎麼在海量數據中找出重復次數最多的一個?
10、海量日誌數據,提取出某日訪問網路次數最多的那個IP。
11、在2.5億個整數中找出不重復的整數,注,內存不足以容納這2.5億個整數。
12、搜索引擎會通過日誌文件把用戶每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。
13、有一個1G大小的一個文件,裡面每一行是一個詞,詞的大小不超過16位元組,內存限制大小是1M。返回頻數最高的100個詞。
14、有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。要求你按照query的頻度排序。
15、給定a、b兩個文件,各存放50億個url,每個url各佔64位元組,內存限制是4G,讓你找出a、b文件共同的url?
16、一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間復雜度分析。
17、騰訊面試題:給40億個不重復的unsigned int的整數,沒排過序的,然後再給一個數,如何快速判斷這個數是否在那40億個數當中?
18、100w個數中找出最大的100個數。
H. 數據結構試題 若X和Y是用結點大小為1的單鏈表表示的串,設計演算法找出X中第一個不再Y中出現的字元
一
選擇題(7分,每小題0.5分)
1.C語言源程序的基本單位是( )。
A 過程 B 函數 C 子程序 D 標識符
2.下列程序的輸出結果是( )。
main( )
{ int a=7,b=5;
printf("%d\n",b=b/a);
}
A 5 B 1 C 0 D不確定值
3.假設變數a,b均為整型,表達式(a=5,b=2,a>b?a++:b++,a+b)的值是( )。
A 7 B 8 C 9 D 2
4.設a為int型變數,執行下列賦值語句後,a的取值分別是( )。
a=125.534; a=(int)125.521%4; a=5<<2;
A 125,31,1 B 125,1,20 C 125,31,20 D 125.534,2,20
5.設有如下程序段,下面描述中正確的是 ( )。
int k=10; while(k=0) k=k-1;
A 循環執行一次 B循環是無限循環 C循環體語句一次也不執行 D循環體語句執行一次
6.以下程序的輸出結果為( )。
int i;
void prt( )
{ for(i=5;i<8;i++) printf("%c",'*');
printf("\t");
}
main( )
{ for(i=5;i<=8;i++) prt( );
}
A *** B *** *** *** *** C *** *** D * * *
7.在C語言程序中,以下說法正確的是( )。
A函數的定義可以嵌套,但函數的調用不可以嵌套
B函數的定義不可以嵌套,但函數的調用可以嵌套
C函數的定義和函數的調用都不可以嵌套
D函數的定義和函數的調用都可以嵌套
8.以下函數調用語句中含有( )個實參。
func((e1,e2),(e3,e4,e5));
A 2 B 3 C 5 D 語法錯誤
9.以下程序的輸出結果為( )。
#define ADD(x) x*x
main( )
{ int a=4,b=6,c=7,d=ADD(a+b)*c;
printf("d=%d",d);
}
A d=70 B d=80 C d=140 D d=700
10.已知職工記錄描述如下,在Turbo C中,系統為變數w分配( )位元組的空間。
struct worker
{ int no;
char name[20];
char sex;
union
birth;
} w;
A 29 B 20 C 25 D 6
11.設有以下定義,值為5的枚舉常量是( )。
enum week w;
A tue B sat C fri D thu
12.下面選項中正確的賦值語句是(設 char a[5],*p=a;)( )。
A p="abcd"; B a="abcd"; C *p="abcd"; D *a="abcd";
13.設有以下程序段,則值為6的表達式是( )。
struct st ;
static struct st a[3]=,*p;
p=&a[0];
A p++->n B ++p->n C p->n++ D (*p).n++
14.C語言中的文件類型只有( )。
A 索引文件和文本文件兩種 B 文本文件一種
C 二進制文件一種 D ASCII碼文件和二進制文件兩種
二 判斷對錯,對的劃「√」,錯的劃「×」(5分,每小題0.5分)
1.在Turbo C中,整型數據在內存中佔2個位元組。( )
2.int i=20;switch(i/10)的輸出結果為A。( )
3.break語句用在循環體中,可結束本層循環,continue語句用在循環體中,可結束本次循環。( )
4.函數的遞歸調用不過是一個函數直接或間接地調用它自身。( )
5.函數strlen("ASDFG\n")的值是7。( )
6.通過return語句,函數可以帶回一個或一個以上的返回值。( )
7.結構體類型只有一種。 ( )
8.char *p="girl";的含義是定義字元型指針變數p,p的值是字元串"girl"。( )
9.若有定義:char *p(char a[10]);則p是函數名。( )
10.用fopen("file","r+");打開的文件"file"可以進行修改。 ( )
三 寫出下列程序的運行結果(10分,每小題2分)
1.float average (float array[10])
{ int i;
float aver,sum=array[0];
for (i=1;i<10;i++)
sum=sum+array[i];
aver=sum/10;
return(aver);
}
main( )
,aver;
int i;
aver=average (score);
printf (「average score is %5.2f\n」,aver);
}
2.main( )
,*p=a,**pa;
for(p=0;p<a+5;p++)
printf(「%2c」,*p);
printf(「\n」);
printf(「%2c\n」,**(pa=&p));
}
3.main( )
{ int a,b,s=0;
for(a=1,b=1;a<=100;a++)
{ if(b>=20) break;
if(b%3==1)
b-=5;
}
printf(「a=%d\tb=%d\n」,a,b);
}
4.main()
{ printf(「main( ) :%d\n」,fact(5));
fact(-5);
}
fact(int value)
{ int f;
if(value<0)
{ printf(「Arg error\n");
return(-1);
}
else if(value==1||value==0) f=1;
else f=value*fact(value-1)+1;
printf(「This called value=%d\n」,f);
return f;
}
5.main( )
{ int a=012,b=0x12,k=12;
char c=『\102』,d=『\r』;
printf(「a=%d\tb=%d\tk=%d\n」,a,b,k);
printf(「c=%c,d=%c%o\n」,c,d,a);
a=『A』; c=49;
printf(「a=%d\tc=%c\n」,a,c);
}
四 閱讀下列程序,在 處填入適當內容,使程序完整(8分,每個空1分)
1.有一個3*4矩陣,求其中的最大元素。
max_value( (1) )
{ int i,j,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)
max=array[i][j];
(2) ;
}
main( )
{ int a[3][4], i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
(3) ;
printf(「max value is %d\n」,max_value(a));
}
2.輸入x、y兩個整數,按先大後小的順序輸出x、y。
#include 「stdio.h」
main( )
{ int x,y, *px,*py, (4) ;
scanf(「%d%d」,&x,&y);
(5) ; (6) ;
if(x<y)
printf(「x=%d,y=%d\n」,x,y);
printf(「MAX=%d,MIN=%d\n」,*px,*py);
}
3.用選擇排序法對任意10個整數按照由小到大排序。
main()
{ int a[11],i,j,k,t;
printf("Please input 10 numbers:\n");
for(i=1;i<11;i++) scanf("%d",&a[i]);
printf("\n");
for(i=1;i<=9;i++)
{ (7) ;
for(j=i+1; (8) ;j++)
if(a[j]>a[k]) k=j;
if(k!=i)
}
printf("The sorted numbers:\n");
for(i=1;i<11;i++) printf("%d ",a[i]);
}
答案
一 選擇題(7分,每小題0.5分)
1. B 2. C 3. B 4. B 5. C
6. A 7. B 8. A 9. A 10. C
11. A 12. A 13. B 14. D
二 判斷對錯,對的劃「√」,錯的劃「×」(5分,每小題0.5分)
1.× 2.× 3.√ 4.√ 5.×
6.× 7.× 8.× 9.√ 10.√
三 寫出下列程序的運行結果(10分,每小題2分)
1. 2. 3.
4. 5.
四 閱讀下列程序,在 處填入適當內容,使程序完整(8分,每個空1分)
1.(1)int array[3][4](int array[][4]) (2)return(max) (3)scanf(「%d」,&a[i][j])
2.(4)*p (5)px=&x(py=&y) (6)py=&y(px=&x)
3.(7) (8)
請參考
I. 數據結構試題求解
1 錯。給的條件能確定鏈表含1個元素,而非空。
2 錯。
3 錯。M階B樹要求(葉上)至少M/2個元素,上面所謂的葉就是倒數第二層了,而三階平衡樹最底層可以有1個元素。
1. 下面程序段時間復雜度為________
for (int i=0;i<n;i++)
for (int j=0;j<k;j++ )
S+=i;
O(n*k)
2 數據結構的存儲結構包括順序,________,索引和散列四種。
鏈接
3.設森林T中有三棵樹,第一,二,三棵樹的結點個數分別為n1,n2,n3,將森林轉換成二叉樹後,其根結點的左子樹上有________個結點。
n1-1。
森林轉為二叉樹之後,原第一棵樹T1的根節點將成為二叉樹Tn的根節點,其餘的採取貌似於長兄如父的方式排列,原先是父子關系的還是步子,但是原先是兄弟的也變成了父子,對於其他樹的根節點的有分支,會分到左分支的另一派左分支上。所以是n1-1
4.對二叉搜索樹進行________遍歷,可以得到按關鍵字從小到大排列的結點序列。
中序
二叉搜索樹為了搜索的方便,根節點大於左邊的,小於右邊的。所以中序遍歷才會得到所要序列
三.選擇題
1.已知單鏈表A長度為m,單鏈表B長度為n,若將B聯接在A的末尾,其時間復雜度應為________。
A. O(1) B. O(m) C. O(n) D.O(m+n)
B。步進m次(即O(m))以達到其尾節點,然後將該節點的next指向B。如果給定了條件是鏈表既存有頭,又存有尾,那麼就是o(1).這里選B。
2.設有一個遞歸演算法如下:
int fact(int n) { //n大於等於0
if(n<=0) return 1;
else return n*fact(n-1);
}
則計算fact(n)需要調用該函數的次數為________次。
A. n B. n+1 C. n+2 D.n-1
B
可樂答的不錯。可以保證。我做的結果一樣。