数据结构与算法常见笔试题 .
第一章 數(shù)據(jù)結(jié)構(gòu)與算法
一.算法的基本概念
計(jì)算機(jī)解題的過(guò)程實(shí)際上是在實(shí)施某種算法,這種算法稱(chēng)為計(jì)算機(jī)算法。
1.算法的基本特征:可行性,確定性,有窮性,擁有足夠的情報(bào)。
2.算法的基本要素:算法中對(duì)數(shù)據(jù)的運(yùn)算和操作、算法的控制結(jié)構(gòu)。
3.算法設(shè)計(jì)的基本方法:列舉法、歸納法、遞推、遞歸、減半遞推技術(shù)、回溯法。
4.算法設(shè)計(jì)的要求:正確性、可讀性、健壯性、效率與低存儲(chǔ)量需求
二.算法的復(fù)雜度
1.算法的時(shí)間復(fù)雜度:指執(zhí)行算法所需要的計(jì)算工作量
2.算法的空間復(fù)雜度:執(zhí)行這個(gè)算法所需要的內(nèi)存空間
三.數(shù)據(jù)結(jié)構(gòu)的定義
1.數(shù)據(jù)的邏輯結(jié)構(gòu):反映數(shù)據(jù)元素之間的關(guān)系的數(shù)據(jù)元素集合的表示。數(shù)據(jù)的邏輯結(jié)構(gòu)包括集合、線形結(jié)構(gòu)、樹(shù)形結(jié)構(gòu)和圖形結(jié)構(gòu)四種。
2.數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu):數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)空間種的存放形式稱(chēng)為數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。常用的存儲(chǔ)結(jié)構(gòu)有順序、鏈接、索引等存儲(chǔ)結(jié)構(gòu)。
四.數(shù)據(jù)結(jié)構(gòu)的圖形表示:
在數(shù)據(jù)結(jié)構(gòu)中,沒(méi)有前件的結(jié)點(diǎn)稱(chēng)為根結(jié)點(diǎn);沒(méi)有后件的結(jié)點(diǎn)成為終端結(jié)點(diǎn)。插入和刪除是對(duì)數(shù)據(jù)結(jié)構(gòu)的兩種基本運(yùn)算。還有查找、分類(lèi)、合并、分解、復(fù)制和修改等。
五.線性結(jié)構(gòu)和非線性結(jié)構(gòu)
根據(jù)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)元素之間前后件關(guān)系的復(fù)雜程度,一般將數(shù)據(jù)結(jié)構(gòu)分為兩大類(lèi)型:線性結(jié)構(gòu)和非線性結(jié)構(gòu)。
線性結(jié)構(gòu):非空數(shù)據(jù)結(jié)構(gòu)滿(mǎn)足:有且只有一個(gè)根結(jié)點(diǎn);每個(gè)結(jié)點(diǎn)最多有一個(gè)前件,最多只有一個(gè)后件。非線性結(jié)構(gòu):如果一個(gè)數(shù)據(jù)結(jié)構(gòu)不是線性結(jié)構(gòu),稱(chēng)之為非線性結(jié)構(gòu)。
常見(jiàn)的線性結(jié)構(gòu):線性表、棧、隊(duì)列
六.線性表的定義
線 性表是n 個(gè)元素構(gòu)成的有限序列(A1,A2,A3……)。表中的每一個(gè)數(shù)據(jù)元素,除了第一個(gè)以外,有且只有一個(gè)前件。除了最后一個(gè)以外有且只有一個(gè)后件。即線性表 是一個(gè)空表,或可以表示為(a1,a2,……an), 其中ai(I=1,2,……n)是屬于數(shù)據(jù)對(duì)象的元素,通常也稱(chēng)其為線性表中的一個(gè)結(jié)點(diǎn)。
非空線性表有如下一些特征:
(1)有且只有一個(gè)根結(jié)點(diǎn)a1,它無(wú)前件;
(2)有且只有一個(gè)終端結(jié)點(diǎn)an,它無(wú)后件;
(3)除根結(jié)點(diǎn)與終端結(jié)點(diǎn)外,其他所有結(jié)點(diǎn)有且只有一個(gè)前件,也有且只有一個(gè)后件。線性表中結(jié)點(diǎn)的個(gè)數(shù)n稱(chēng)為線性表的長(zhǎng)度。當(dāng)n=0時(shí)稱(chēng)為空表。
七.線性表的順序存儲(chǔ)結(jié)構(gòu)
線性表的順序表指的是用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的數(shù)據(jù)元素。
線性表的順序存儲(chǔ)結(jié)構(gòu)具備如下兩個(gè)基本特征:
1.線性表中的所有元素所占的存儲(chǔ)空間是連續(xù)的;
2.線性表中各數(shù)據(jù)元素在存儲(chǔ)空間中是按邏輯順序依次存放的。
即線性表邏輯上相鄰、物理也相鄰,則已知第一個(gè)元素首地址和每個(gè)元素所占字節(jié)數(shù),則可求出任一個(gè)元素首地址。
假設(shè)線性表的每個(gè)元素需占用K個(gè)存儲(chǔ)單元,并以所占的第一個(gè)單元的存儲(chǔ)地址作為數(shù)據(jù)元素的存儲(chǔ)位置。則線性表中第i+1個(gè)數(shù)據(jù)元素的存儲(chǔ)位置LOC(ai+1)和第i個(gè)數(shù)據(jù)元素的存儲(chǔ)位置LOC(ai)之間滿(mǎn)足下列關(guān)系:
LOC(ai+1)=LOC(ai)+K
LOC(ai)=LOC(a1)+(i-1)*K???? ①
其中,LOC(a1)是線性表的第一個(gè)數(shù)據(jù)元素a1的存儲(chǔ)位置,通常稱(chēng)做線性表的起始位置或基地址。
因?yàn)樵陧樞虼鎯?chǔ)結(jié)構(gòu)中,每個(gè)數(shù)據(jù)元素地址可以通過(guò)公式①計(jì)算得到,所以線性表的順序存儲(chǔ)結(jié)構(gòu)是隨機(jī)存取的存儲(chǔ)結(jié)構(gòu)。
在線性表的順序存儲(chǔ)結(jié)構(gòu)下,可以對(duì)線性表做以下運(yùn)算:
插入、刪除、查找、排序、分解、合并、復(fù)制、逆轉(zhuǎn)
八.順序表的插入運(yùn)算
線性表的插入運(yùn)算是指在表的第I個(gè)位置上,插入一個(gè)新結(jié)點(diǎn)x,使長(zhǎng)度為n的線性表(a1,a2 …ai…an)變成長(zhǎng)度為n+1的線性表(a1,a2…x,ai…an).
該算法的時(shí)間主要花費(fèi)在循環(huán)的結(jié)點(diǎn)后移語(yǔ)句上,執(zhí)行次數(shù)是n-I+1。
當(dāng)I=n+1,最好情況,時(shí)間復(fù)雜度o(1) 當(dāng)I=1, 最壞情況,時(shí)間復(fù)雜度o(n)
算法的平均時(shí)間復(fù)雜度為o(n)
九.順序表的刪除運(yùn)算
線性表的刪除運(yùn)算是指在表的第I個(gè)位置上,刪除一個(gè)新結(jié)點(diǎn)x,使長(zhǎng)度為n的線性表(a1,a2 …ai…an)變成長(zhǎng)度為n-1的線性表(a1,a2…ai-1,ai+1…an).
當(dāng)I=n,時(shí)間復(fù)雜度o(1),當(dāng)I=1,時(shí)間復(fù)雜度o(n) ,平均時(shí)間復(fù)雜度為o(n)
十.棧及其基本運(yùn)算
1. 什么是棧? 棧實(shí)際上也是一個(gè)線性表,只不過(guò)是一種特殊的線性表。棧是只能在表的一端進(jìn)行插入和刪除運(yùn)算的線性表,通常稱(chēng)插入、刪除這一端為棧頂(TOP),另一端為 棧底(BOTTOM)。當(dāng)表中沒(méi)有元素時(shí)稱(chēng)為空棧。棧頂元素總是后被插入的元素,從而也是最先被刪除的元素;棧底元素總是最先被插入的元素,從而也是最后 才能被刪除的元素。
假設(shè)棧S=(a1,a2,a3,……an),則a1 稱(chēng)為棧底元素,an稱(chēng)為棧頂元素。棧中元素按a1,a2,a3……an的次序進(jìn)棧,退棧的第一個(gè)元素應(yīng)該是棧頂元素。即后進(jìn)先出。
2.棧的順序存儲(chǔ)及其運(yùn)算
用S(1:M)作為棧的順序存儲(chǔ)空間。M為棧的最大容量。
棧的基本運(yùn)算有三種:入棧、退棧與讀棧頂元素。
入棧運(yùn)算:在棧頂位置插入一個(gè)新元素。
首先將棧頂指針進(jìn)一(TOP+1),然后將新元素插入到棧頂指針指向的位置。
退棧運(yùn)算:指取出棧頂元素并賦給一個(gè)指定的變量。
首先將棧頂元素賦給一個(gè)指定的變量,然后將棧頂指針退一(TOP-1)
讀棧頂元素:將棧頂元素賦給一個(gè)指定的變量。棧頂指針不會(huì)改變。
十一.隊(duì)列及其基本運(yùn)算
1.什么是隊(duì)列
隊(duì)列是只允許在一端刪除,在另一端插入的順序表,允許刪除的一端叫做對(duì)頭,允許插入的一端叫做對(duì)尾。
隊(duì)列的修改是先進(jìn)先出。往隊(duì)尾插入一個(gè)元素成為入隊(duì)運(yùn)算。從對(duì)頭刪除一個(gè)元素稱(chēng)為退隊(duì)運(yùn)算。
2.循環(huán)隊(duì)列及其運(yùn)算
在 實(shí)際應(yīng)用中,隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)一般采用循環(huán)隊(duì)列的形式。所謂循環(huán)隊(duì)列,就是將隊(duì)列存儲(chǔ)空間的最后一個(gè)位置繞到第一個(gè)位置,形成邏輯上的環(huán)狀空間。在循環(huán) 隊(duì)列中,,用隊(duì)尾指針rear指向隊(duì)列中的隊(duì)尾元素,用排頭指針front指向排頭元素的前一個(gè)位置,因此,從排頭指針front指向的后一個(gè)位置直到隊(duì) 尾指針 rear指向的位置之間所有的元素均為隊(duì)列中的元素。
在實(shí)際使用循環(huán)隊(duì)列時(shí),為了能區(qū)分隊(duì)滿(mǎn)還是隊(duì)列空,通常需要增加一個(gè)標(biāo)志S:
隊(duì)列空,則S=0,rear=front=m???? 隊(duì)列滿(mǎn),則S=1,rear=front=m
循環(huán)隊(duì)列主要有兩種基本運(yùn)算:入隊(duì)運(yùn)算和退隊(duì)運(yùn)算
n????? 入隊(duì)運(yùn)算
指在循環(huán)隊(duì)列的隊(duì)尾加入一個(gè)新元素,首先rear=rear+1,當(dāng)rear=m+1時(shí),置rear=1,然后將新元素插入到隊(duì)尾指針指向的位置。當(dāng)S=1,rear=front,說(shuō)明隊(duì)列已滿(mǎn),不能進(jìn)行入隊(duì)運(yùn)算,稱(chēng)為“上溢”。
n????? 退隊(duì)運(yùn)算
指在循環(huán)隊(duì)列的排頭位置退出一個(gè)元素并賦給指定的變量。首先f(wàn)ront=front+1,并當(dāng)front=m+1時(shí),置front=1,然后將排頭指針指向的元素賦給指定的變量。當(dāng)循環(huán)隊(duì)列為空S=0,不能進(jìn)行退隊(duì)運(yùn)算,這種情況成為“下溢”。
十二.線性單鏈表的結(jié)構(gòu)及其基本運(yùn)算
1.線性單鏈表的基本概念
一 組任意的存儲(chǔ)單元存儲(chǔ)線性表的數(shù)據(jù)元素,因此,為了表示每個(gè)數(shù)據(jù)元素ai與其直接后繼數(shù)據(jù)元素ai+1之間的邏輯關(guān)系,對(duì)數(shù)據(jù)元素ai來(lái)說(shuō),除了存儲(chǔ)其本 身的信息之外,還需存儲(chǔ)一個(gè)指示其直接后繼的信息(即直接后繼的存儲(chǔ)位置)。這兩部分信息組成數(shù)據(jù)元素ai的存儲(chǔ)映象,成為結(jié)點(diǎn)。它包括兩個(gè)域:其中存儲(chǔ) 數(shù)據(jù)元素信息的域稱(chēng)為數(shù)據(jù)域,存儲(chǔ)直接后繼存儲(chǔ)位置的域稱(chēng)為指針域。指針域中存儲(chǔ)的信息稱(chēng)做指針或鏈。N個(gè)結(jié)點(diǎn)鏈結(jié)成一個(gè)鏈表,即為線性表(a1, a2,……,an)的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。又由于此鏈表的每個(gè)結(jié)點(diǎn)中只包含一個(gè)指針域,故又稱(chēng)線性鏈表或單鏈表。
有時(shí),我們?cè)趩捂湵淼牡谝粋€(gè)結(jié)點(diǎn)之前附設(shè)一個(gè)結(jié)點(diǎn),稱(chēng)之為頭結(jié)點(diǎn),它指向表中第一個(gè)結(jié)點(diǎn)。頭結(jié)點(diǎn)的數(shù)據(jù)域可以不存儲(chǔ)任何信息,也可存儲(chǔ)如線性表的長(zhǎng)度等類(lèi)的附加信息,頭結(jié)點(diǎn)的指針域存儲(chǔ)指向第一個(gè)結(jié)點(diǎn)的指針(即第一個(gè)元素結(jié)點(diǎn)的存儲(chǔ)位置)。
在單鏈表中,取得第I個(gè)數(shù)據(jù)元素必須從頭指針出發(fā)尋找,因此,單鏈表是非隨機(jī)存取的存儲(chǔ)結(jié)構(gòu)?? 鏈表的形式:單向,雙向
2.線性單鏈表的存儲(chǔ)結(jié)構(gòu)
3帶鏈
3.帶列的棧與隊(duì)列
棧也是線性表,也可以采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。
隊(duì)列也是線性表,也可以采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。
十三.線性鏈表的基本運(yùn)算 1.線性鏈表的插入 2.線性鏈表的刪除
十四.雙向鏈表的結(jié)構(gòu)及其基本運(yùn)算
在雙向鏈表的結(jié)點(diǎn)中有兩個(gè)指針域,其一指向直接后繼,另一指向直接前驅(qū)。
十五.循環(huán)鏈表的結(jié)構(gòu)及其基本運(yùn)算
是另一種形式的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),它的特點(diǎn)是表中最后一個(gè)結(jié)點(diǎn)的指針域指向頭結(jié)點(diǎn),整個(gè)鏈表形成一個(gè)環(huán)。因此,從表中任一結(jié)點(diǎn)出發(fā)均可找到表中其他結(jié)點(diǎn)。
十六.樹(shù)的定義
樹(shù)是一種簡(jiǎn)單的非線性結(jié)構(gòu)。樹(shù)型結(jié)構(gòu)的特點(diǎn):
1.每個(gè)結(jié)點(diǎn)只有一個(gè)前件,稱(chēng)為父結(jié)點(diǎn),沒(méi)有前件的結(jié)點(diǎn)只有一個(gè),稱(chēng)為樹(shù)的根結(jié)點(diǎn)。
2.每一個(gè)結(jié)點(diǎn)可以有多個(gè)后件結(jié)點(diǎn),稱(chēng)為該結(jié)點(diǎn)的子結(jié)點(diǎn)。沒(méi)有后件的結(jié)點(diǎn)稱(chēng)為葉子結(jié)點(diǎn)
3.一個(gè)結(jié)點(diǎn)所擁有的后件個(gè)數(shù)稱(chēng)為樹(shù)的結(jié)點(diǎn)度
4.樹(shù)的最大層次稱(chēng)為樹(shù)的深度。
十七.二叉樹(shù)的定義及其基本性質(zhì)
1.二叉樹(shù)是另一種樹(shù)型結(jié)構(gòu),它的特點(diǎn)是每個(gè)結(jié)點(diǎn)至多只有二棵子樹(shù)(即二叉樹(shù)中不存在度大于2的結(jié)點(diǎn)),并且,二叉樹(shù)的子樹(shù)有左右之分,其次序不能任意顛倒。
2.二叉樹(shù)的基本性質(zhì)
①在二叉樹(shù)的第I層上至多有2i-1個(gè)結(jié)點(diǎn)。
②深度為k的二叉樹(shù)至多有2k-1個(gè)結(jié)點(diǎn)(k>=1)
③在任意一個(gè)二叉樹(shù)中,度為0的結(jié)點(diǎn)總是比度為2的結(jié)點(diǎn)多一個(gè);
④具有n 個(gè)結(jié)點(diǎn)的二叉樹(shù),其深度至少為[log2n]+1。
一棵深度為k且有2k-1個(gè)結(jié)點(diǎn)的二叉樹(shù)稱(chēng)為滿(mǎn)二叉樹(shù)。這種樹(shù)的特點(diǎn)是每一層上的結(jié)點(diǎn)數(shù)都是最大結(jié)點(diǎn)數(shù)。
3.滿(mǎn)二叉樹(shù)與完全二叉樹(shù)
滿(mǎn)二叉樹(shù):除最后一層以外,每一層上的所有結(jié)點(diǎn)都有兩個(gè)子結(jié)點(diǎn)。在滿(mǎn)二叉樹(shù)的第K層上有2K-1個(gè)結(jié)點(diǎn),且深度為M的滿(mǎn)二叉樹(shù)右2M-1個(gè)結(jié)點(diǎn)
完全二叉樹(shù):除最后一層以外,每一層上的結(jié)點(diǎn)數(shù)均達(dá)到最大值;在最后一層上只缺少右邊的若干結(jié)點(diǎn)。具有N個(gè)結(jié)點(diǎn)的完全二叉樹(shù)的深度為[log2n]+1
完全二叉樹(shù)總結(jié)點(diǎn)數(shù)為N,
若N為奇數(shù),則葉子結(jié)點(diǎn)數(shù)為(N+1)/2 若N為偶數(shù),則葉子結(jié)點(diǎn)數(shù)為N/2
4.二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)
二叉樹(shù)通常采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
二叉樹(shù)具有下列重要特性:
??? 性質(zhì)1 在二叉樹(shù)的第i層上至多有2i-1個(gè)結(jié)點(diǎn)(i≥1)。
???? 利用歸納法容易證得此性質(zhì)。
???? i=1時(shí),只有一個(gè)根結(jié)點(diǎn)。 顯然,2i-1=20=1是對(duì)的。
???? 現(xiàn)在假定對(duì)所有的j,1≤j<i,命題成立,即第j層上至多有2j-1個(gè)結(jié)點(diǎn)。那么,可以證明j=i時(shí)命題也成立。
???? 由歸納假設(shè):第i-1層上至多有2i-2個(gè)結(jié)點(diǎn)。由于二叉樹(shù)的每個(gè)結(jié)點(diǎn)的度至多為 2,故在第i層上的最大結(jié)點(diǎn)數(shù)為第i-1層上的最大結(jié)點(diǎn)數(shù)的2倍,即2*2i-2=2i-1。
??? 性質(zhì)2 深度為k的二叉樹(shù)至多有2k-1個(gè)結(jié)點(diǎn),(k≥1)。
??? 由性質(zhì)1可見(jiàn),深度為k的二叉樹(shù)的最大結(jié)點(diǎn)數(shù)為
k??????????????????????? k
∑(第i層上的最大結(jié)點(diǎn)數(shù)) =∑2i-1=2k -1
i=1???????????????????? i=1
??? 性質(zhì)3 對(duì)任何一棵二叉樹(shù)T,如果其終端結(jié)點(diǎn)數(shù)為n0,度為2的結(jié)點(diǎn)數(shù)為n2,則n0=n2+1。
???? 設(shè)n1為二叉樹(shù)T中度為1的結(jié)點(diǎn)數(shù)。因?yàn)槎鏄?shù)中所有結(jié)點(diǎn)的度均小于或等于2所以其結(jié)點(diǎn)總數(shù)為
n=n0+n1+n2 (6—1)
???? 再看二叉樹(shù)中的分支數(shù)。除了根結(jié)點(diǎn)外,其余結(jié)點(diǎn)都有一個(gè)分支進(jìn)入,設(shè)B為分支總數(shù),則n=B+1。由于這些分支是由度為1或2的結(jié)點(diǎn)射出的,所以又有B=n1+ 2n2。
n=n1+2*n2+1 (6—2)
???? 于是得由式(6—1)和(6—2)得 n0=n2+1
十八.二叉樹(shù)的遍歷
就是遵從某種次序,訪問(wèn)二叉樹(shù)中的所有結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)僅被訪問(wèn)一次。一般先左后右。
1.前序遍歷DLR 首先訪問(wèn)根結(jié)點(diǎn),然后遍歷左子樹(shù),最后遍歷右子樹(shù)。
2.中序遍歷LDR 首先遍歷左子樹(shù),然后根結(jié)點(diǎn),最后右子樹(shù)
3.后序遍歷LRD 首先遍歷左子樹(shù),然后遍歷右子樹(shù),最后訪問(wèn)根結(jié)點(diǎn)。
十九.順序查找與二分查找
1.順序查找 在兩種情況下只能用順序查找:線性表為無(wú)序表、鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的有序表
2.二分查找 只適用于順序存儲(chǔ)的有序表(從小到大)。
對(duì)于長(zhǎng)度為N的有序線性表,在最壞情況下,二分查找只需要比較log2N次,而順序查找要比較N次。 排序:指將一個(gè)無(wú)序序列整理成按值非遞減順序排列的有序序列。
二十.交換類(lèi)排序法
冒泡排序與快速排序法屬于交換類(lèi)的排序方法
1.冒泡排序法 假設(shè)線性表的長(zhǎng)度為N,則在最壞的情況下,冒跑排序需要經(jīng)過(guò)N/2遍的從前往后的掃描和N/2遍的從后往前的掃描,需要的比較次數(shù)為N(N-1)/2
2.快速排序法
二十一.選擇類(lèi)排序法 1.簡(jiǎn)單選擇排序法 2.堆排序法
二十三.插入類(lèi)排序法 1.簡(jiǎn)單插入排序法2.希爾排序法
?????????? 最壞情況下????? 最好情況下????? 說(shuō)明
交換排序????? 冒泡排序????? n(n-1)/2??????????? 最簡(jiǎn)單的交換排序。在待排序的元素序列基本有序的前提下,效率最高
???? 快速排序????? n(n-1)/2????? O(Nlog2 N)????
插入排序????? 簡(jiǎn)單插入排序????? n(n-1)/2??????????? 每個(gè)元素距其最終位置不遠(yuǎn)時(shí)適用
???? 希爾排序????? O(n1.5)??????????
選擇排序????? 簡(jiǎn)單選擇排序????? n(n-1)/2??????????
???? 堆排序????? O(nlog2n)??????????? 適用于較大規(guī)模的線性表
練習(xí):
1.棧和隊(duì)列的共同特點(diǎn)是(只允許在端點(diǎn)處插入和刪除元素)
2.如果進(jìn)棧序列為e1,e2,e3,e4,則可能的出棧序列是(e2,e4,e3,e1)
3.棧底至棧頂依次存放元素A、B、C、D,在第五個(gè)元素E入棧前,棧中元素可以出棧,則出棧序列可能是(DCBEA)
4.棧通常采用的兩種存儲(chǔ)結(jié)構(gòu)是(線性存儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu))
5.下列關(guān)于棧的敘述正確的是(D)
???? A.棧是非線性結(jié)構(gòu)B.棧是一種樹(shù)狀結(jié)構(gòu)C.棧具有先進(jìn)先出的特征D.棧有后進(jìn)先出的特征
6.鏈表不具有的特點(diǎn)是(B)A.不必事先估計(jì)存儲(chǔ)空間?????? B.可隨機(jī)訪問(wèn)任一元素
C.插入刪除不需要移動(dòng)元素????? D.所需空間與線性表長(zhǎng)度成正比
7.用鏈表表示線性表的優(yōu)點(diǎn)是(便于插入和刪除操作)
8.在單鏈表中,增加頭結(jié)點(diǎn)的目的是(方便運(yùn)算的實(shí)現(xiàn))
9.循環(huán)鏈表的主要優(yōu)點(diǎn)是(從表中任一結(jié)點(diǎn)出發(fā)都能訪問(wèn)到整個(gè)鏈表)
10.線性表L=(a1,a2,a3,……ai,……an),下列說(shuō)法正確的是(D)
???? A.每個(gè)元素都有一個(gè)直接前件和直接后件?? B.線性表中至少要有一個(gè)元素
???? C.表中諸元素的排列順序必須是由小到大或由大到小
???? D.除第一個(gè)和最后一個(gè)元素外,其余每個(gè)元素都有一個(gè)且只有一個(gè)直接前件和直接后件
11.線性表若采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí),要求內(nèi)存中可用存儲(chǔ)單元的地址(D)
A.必須是連續(xù)的 B.部分地址必須是連續(xù)的C.一定是不連續(xù)的 D.連續(xù)不連續(xù)都可以
12.線性表的順序存儲(chǔ)結(jié)構(gòu)和線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)分別是(隨機(jī)存取的存儲(chǔ)結(jié)構(gòu)、順序存取的存儲(chǔ)結(jié)構(gòu))
13.樹(shù)是結(jié)點(diǎn)的集合,它的根結(jié)點(diǎn)數(shù)目是(有且只有1)
14.在深度為5的滿(mǎn)二叉樹(shù)中,葉子結(jié)點(diǎn)的個(gè)數(shù)為(31)
15.具有3個(gè)結(jié)點(diǎn)的二叉樹(shù)有(5種形態(tài))
16.設(shè)一棵二叉樹(shù)中有3個(gè)葉子結(jié)點(diǎn),有8個(gè)度為1的結(jié)點(diǎn),則該二叉樹(shù)中總的結(jié)點(diǎn)數(shù)為(13)
17.已知二叉樹(shù)后序遍歷序列是dabec,中序遍歷序列是debac,它的前序遍歷序列是(cedba)
18.已知一棵二叉樹(shù)前序遍歷和中序遍歷分別為ABDEGCFH和DBGEACHF,則該二叉樹(shù)的后序遍歷為(DGEBHFCA)
19.若某二叉樹(shù)的前序遍歷訪問(wèn)順序是abdgcefh,中序遍歷訪問(wèn)順序是dgbaechf,則其后序遍歷的結(jié)點(diǎn)訪問(wèn)順序是(gdbehfca)
20.數(shù)據(jù)庫(kù)保護(hù)分為:安全性控制、 完整性控制 、并發(fā)性控制和數(shù)據(jù)的恢復(fù)。
1. 在計(jì)算機(jī)中,算法是指(解題方案的準(zhǔn)確而完整的描述)
2.在下列選項(xiàng)中,哪個(gè)不是一個(gè)算法一般應(yīng)該具有的基本特征(無(wú)窮性)
說(shuō)明:算法的四個(gè)基本特征是:可行性、確定性、有窮性和擁有足夠的情報(bào)。
3. 算法一般都可以用哪幾種控制結(jié)構(gòu)組合而成(順序、選擇、循環(huán))
4.算法的時(shí)間復(fù)雜度是指(算法執(zhí)行過(guò)程中所需要的基本運(yùn)算次數(shù))
5. 算法的空間復(fù)雜度是指(執(zhí)行過(guò)程中所需要的存儲(chǔ)空間)
6. 算法分析的目的是(分析算法的效率以求改進(jìn))
7. 下列敘述正確的是(C)
A.算法的執(zhí)行效率與數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)無(wú)關(guān)
B.算法的空間復(fù)雜度是指算法程序中指令(或語(yǔ)句)的條數(shù)
C.算法的有窮性是指算法必須能在執(zhí)行有限個(gè)步驟之后終止
D.算法的時(shí)間復(fù)雜度是指執(zhí)行算法程序所需要的時(shí)間
8.數(shù)據(jù)結(jié)構(gòu)作為計(jì)算機(jī)的一門(mén)學(xué)科,主要研究數(shù)據(jù)的邏輯結(jié)構(gòu)、對(duì)各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行的運(yùn)算,以及(數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu))
9. 數(shù)據(jù)結(jié)構(gòu)中,與所使用的計(jì)算機(jī)無(wú)關(guān)的是數(shù)據(jù)的(C)
A.存儲(chǔ)結(jié)構(gòu)?? B.物理結(jié)構(gòu)???? C.邏輯結(jié)構(gòu)???? D.物理和存儲(chǔ)結(jié)構(gòu)
10. 下列敘述中,錯(cuò)誤的是(B)
A.數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)與數(shù)據(jù)處理的效率密切相關(guān)
B.數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)與數(shù)據(jù)處理的效率無(wú)關(guān)
C.數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)在計(jì)算機(jī)中所占的空間不一定是連續(xù)的
D.一種數(shù)據(jù)的邏輯結(jié)構(gòu)可以有多種存儲(chǔ)結(jié)構(gòu)
11. 數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是指(數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的表示)
12. 數(shù)據(jù)的邏輯結(jié)構(gòu)是指(反映數(shù)據(jù)元素之間邏輯關(guān)系的數(shù)據(jù)結(jié)構(gòu))
13. 根據(jù)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)元素之間前后件關(guān)系的復(fù)雜程度,一般將數(shù)據(jù)結(jié)構(gòu)分為(線性結(jié)構(gòu)和非線性結(jié)構(gòu))
14. 下列數(shù)據(jù)結(jié)構(gòu)具有記憶功能的是(C)A.隊(duì)列B.循環(huán)隊(duì)列C.棧D.順序表
15. 下列數(shù)據(jù)結(jié)構(gòu)中,按先進(jìn)后出原則組織數(shù)據(jù)的是(B)
A.線性鏈表?? B.棧??????????? C.循環(huán)鏈表??????? D.順序表
16. 遞歸算法一般需要利用(隊(duì)列)實(shí)現(xiàn)。
17. 下列關(guān)于棧的敘述中正確的是(D)A.在棧中只能插入數(shù)據(jù)B.在棧中只能刪除數(shù)據(jù)
C.棧是先進(jìn)先出的線性表??????????? D.棧是先進(jìn)后出的線性表
18. 棧底至棧頂依次存放元素A、B、C、D,在第五個(gè)元素E入棧前,棧中元素可以出棧,則出棧序列可能是(DCBEA)
19.如果進(jìn)棧序列為e1,e2,e3,e4,則可能的出棧序列是(e2,e4,e3,e1)
20. 由兩個(gè)棧共享一個(gè)存儲(chǔ)空間的好處是(節(jié)省存儲(chǔ)空間,降低上溢發(fā)生的機(jī)率)
21. 應(yīng)用程序在執(zhí)行過(guò)程中,需要通過(guò)打印機(jī)輸出數(shù)據(jù)時(shí),一般先形成一個(gè)打印作業(yè),將其存放在硬盤(pán)中的一個(gè)指定(隊(duì)列)中,當(dāng)打印機(jī)空閑時(shí),就會(huì)按先來(lái)先服務(wù)的方式從中取出待打印的作業(yè)進(jìn)行打印。
22.下列關(guān)于隊(duì)列的敘述中正確的是(C)A.在隊(duì)列中只能插入數(shù)據(jù) B.在隊(duì)列中只能刪除數(shù)據(jù)?? C.隊(duì)列是先進(jìn)先出的線性表??????????? D.隊(duì)列是先進(jìn)后出的線性表
23.下列敘述中,正確的是(D)A.線性鏈表中的各元素在存儲(chǔ)空間中的位置必須是連續(xù)的
B.線性鏈表中的表頭元素一定存儲(chǔ)在其他元素的前面 C.線性鏈表中的各元素在存儲(chǔ)空間中的位置不一定是連續(xù)的,但表頭元素一定存儲(chǔ)在其他元素的前面 D.線性鏈表中的各元素在存儲(chǔ)空間中的位置不一定是連續(xù)的,且各元素的存儲(chǔ)順序也是任意的
24.下列敘述中正確的是(A)A.線性表是線性結(jié)構(gòu)????? B.棧與隊(duì)列是非線性結(jié)構(gòu)
C.線性鏈表是非線性結(jié)構(gòu)???????????????????????????????? D.二叉樹(shù)是線性結(jié)構(gòu)
25. 線性表L=(a1,a2,a3,……ai,……an),下列說(shuō)法正確的是(D)
A.每個(gè)元素都有一個(gè)直接前件和直接后件????? B.線性表中至少要有一個(gè)元素
C.表中諸元素的排列順序必須是由小到大或由大到小D.除第一個(gè)元素和最后一個(gè)元素外,其余每個(gè)元素都有一個(gè)且只有一個(gè)直接前件和直接后件
26.線性表若采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí),要求內(nèi)存中可用存儲(chǔ)單元的地址(連續(xù)不連續(xù)都可以)
27. 鏈表不具有的特點(diǎn)是(B)A.不必事先估計(jì)存儲(chǔ)空間??????????? B.可隨機(jī)訪問(wèn)任一元素
C.插入刪除不需要移動(dòng)元素??????????? D.所需空間與線性表長(zhǎng)度成正比
28. 非空的循環(huán)單鏈表head的尾結(jié)點(diǎn)(由p所指向),滿(mǎn)足(p->next=head)
29.與單向鏈表相比,雙向鏈表的優(yōu)點(diǎn)之一是(更容易訪問(wèn)相鄰結(jié)點(diǎn))
30. 在(D)中,只要指出表中任何一個(gè)結(jié)點(diǎn)的位置,就可以從它出發(fā)依次訪問(wèn)到表中其他所有結(jié)點(diǎn)。A.線性單鏈表??????????? B.雙向鏈表??????????? C.線性鏈表??????????? D.循環(huán)鏈表
31. 以下數(shù)據(jù)結(jié)構(gòu)屬于非線性數(shù)據(jù)結(jié)構(gòu)的是(C)A.隊(duì)列????? B.線性表C.二叉樹(shù)????? D.棧
32.樹(shù)是結(jié)點(diǎn)的集合,它的根結(jié)點(diǎn)數(shù)目是(有且只有1)
33.具有3個(gè)結(jié)點(diǎn)的二叉樹(shù)有(5種形態(tài))
34. 在一棵二叉樹(shù)上第8層的結(jié)點(diǎn)數(shù)最多是(128) 注:2K-1
35. 在深度為5的滿(mǎn)二叉樹(shù)中,葉子結(jié)點(diǎn)的個(gè)數(shù)為(16) 注:2n-1
36. 在深度為5的滿(mǎn)二叉樹(shù)中,共有(31)個(gè)結(jié)點(diǎn)。 注:2n-1
37.設(shè)一棵完全二叉樹(shù)共有699個(gè)結(jié)點(diǎn),則在該二叉樹(shù)中的葉子結(jié)點(diǎn)數(shù)為(350)
說(shuō)明:完全二叉樹(shù)總結(jié)點(diǎn)數(shù)為N,若N為奇數(shù),則葉子結(jié)點(diǎn)數(shù)為(N+1)/2;若N為偶數(shù),則葉子結(jié)點(diǎn)數(shù)為N/2。
38. 設(shè)有下列二叉樹(shù),對(duì)此二叉樹(shù)中序遍歷的結(jié)果是(B)
A.ABCDEF????
B.DBEAFC
C.ABDECF????
D.DEBFCA
39.已知二叉樹(shù)后序遍歷序列是dabec,中序遍歷序列debac,它的前序遍歷序列是(cedba)
40. 已知一棵二叉樹(shù)前序遍歷和中序遍歷分別為ABDEGCFH和DBGEACHF,則該二叉樹(shù)的后序遍歷為(DGEBHFCA)
41.若某二叉樹(shù)的前序遍歷訪問(wèn)順序是abdgcefh,中序遍歷訪問(wèn)順序是dgbaechf,則其后序遍歷的結(jié)點(diǎn)訪問(wèn)順序是(gdbehfca)
42. 串的長(zhǎng)度是(串中所含字符的個(gè)數(shù))
43.設(shè)有兩個(gè)串p和q,求q在p中首次出現(xiàn)位置的運(yùn)算稱(chēng)做(模式匹配)
44. N個(gè)頂點(diǎn)的連通圖中邊的條數(shù)至少為(N-1)
45.N個(gè)頂點(diǎn)的強(qiáng)連通圖的邊數(shù)至少有(N)
46.對(duì)長(zhǎng)度為n的線性表進(jìn)行順序查找,在最壞情況下所需要的比較次數(shù)為(N)
47. 最簡(jiǎn)單的交換排序方法是(冒泡排序)
48.假設(shè)線性表的長(zhǎng)度為n,則在最壞情況下,冒泡排序需要的比較次數(shù)為(n(n-1)/2)
49. 在待排序的元素序列基本有序的前提下,效率最高的排序方法是(冒泡排序)
50. 在最壞情況下,下列順序方法中時(shí)間復(fù)雜度最小的是(堆排序)
51. 希爾排序法屬于(插入類(lèi)排序)
52. 堆排序法屬于(選擇類(lèi)排序)
53. 在下列幾種排序方法中,要求內(nèi)存量最大的是(歸并排序)
54. 已知數(shù)據(jù)表A中每個(gè)元素距其最終位置不遠(yuǎn),為節(jié)省時(shí)間,應(yīng)采用(直接插入排序)
55. 算法的基本特征是可行性、確定性、 有窮性?? 和擁有足夠的情報(bào)。
1.一個(gè)算法通常由兩種基本要素組成:一是對(duì)數(shù)據(jù)對(duì)象的運(yùn)算和操作,二是算法的控制結(jié)構(gòu)。
1. 算法的復(fù)雜度主要包括時(shí)間復(fù)雜度和 空間 復(fù)雜度。
2. 實(shí)現(xiàn)算法所需的存儲(chǔ)單元多少和算法的工作量大小分別稱(chēng)為算法的空間復(fù)雜度和時(shí)間復(fù)雜度 。
3.所謂數(shù)據(jù)處理是指對(duì)數(shù)據(jù)集合中的各元素以各種方式進(jìn)行運(yùn)算,包括插入、刪除、查找、更改等運(yùn)算,也包括對(duì)數(shù)據(jù)元素進(jìn)行分析。
4.數(shù)據(jù)結(jié)構(gòu)是指相互有關(guān)聯(lián)的 數(shù)據(jù)元素 的集合。
5.數(shù)據(jù)結(jié)構(gòu)分為邏輯結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu),線性鏈表屬于 存儲(chǔ)結(jié)構(gòu) 。
6.數(shù)據(jù)結(jié)構(gòu)包括數(shù)據(jù)的 邏輯 結(jié)構(gòu)和數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)。
7. 數(shù)據(jù)結(jié)構(gòu)包括數(shù)據(jù)的邏輯結(jié)構(gòu)、數(shù)據(jù)的 存儲(chǔ)結(jié)構(gòu) 以及對(duì)數(shù)據(jù)的操作運(yùn)算。
8.數(shù)據(jù)元素之間的任何關(guān)系都可以用 前趨和后繼 關(guān)系來(lái)描述。
9.數(shù)據(jù)的邏輯結(jié)構(gòu)有線性結(jié)構(gòu)和非線性結(jié)構(gòu)兩大類(lèi)。
10.常用的存儲(chǔ)結(jié)構(gòu)有順序、鏈接、 索引 等存儲(chǔ)結(jié)構(gòu)。
11. 順序存儲(chǔ)方法是把邏輯上相鄰的結(jié)點(diǎn)存儲(chǔ)在物理位置?? 相鄰 的存儲(chǔ)單元中。
12. 棧的基本運(yùn)算有三種:入棧、退棧與讀棧頂元素 。
13. 隊(duì)列主要有兩種基本運(yùn)算:入隊(duì)運(yùn)算與 退隊(duì)運(yùn)算 。
14. 在實(shí)際應(yīng)用中,帶鏈的棧可以用來(lái)收集計(jì)算機(jī)存儲(chǔ)空間中所有空閑的存儲(chǔ)結(jié)點(diǎn),這種帶鏈的棧稱(chēng)為 可利用棧 。
15.棧和隊(duì)列通常采用的存儲(chǔ)結(jié)構(gòu)是 鏈?zhǔn)酱鎯?chǔ)和順序存儲(chǔ)?? 。
16.當(dāng)線性表采用順序存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)存儲(chǔ)時(shí),其主要特點(diǎn)是 邏輯結(jié)構(gòu)中相鄰的結(jié)點(diǎn)在存儲(chǔ)結(jié)構(gòu)中仍相鄰 。
17. 循環(huán)隊(duì)列主要有兩種基本運(yùn)算:入隊(duì)運(yùn)算與退隊(duì)運(yùn)算。每進(jìn)行一次入隊(duì)運(yùn)算,隊(duì)尾指針就 進(jìn)1 。
18.當(dāng)循環(huán)隊(duì)列非空且隊(duì)尾指針等于對(duì)頭指針時(shí),說(shuō)明循環(huán)隊(duì)列已滿(mǎn),不能進(jìn)行入隊(duì)運(yùn)算。這種情況稱(chēng)為 上溢?? 。
19.當(dāng)循環(huán)隊(duì)列為空時(shí),不能進(jìn)行退隊(duì)運(yùn)算,這種情況稱(chēng)為 下溢 。
20. 在一個(gè)容量為25的循環(huán)隊(duì)列中,若頭指針front=16,尾指針rear=9,則該循環(huán)隊(duì)列中共有 18 個(gè)元素。注:當(dāng)rear<front時(shí),元素個(gè)數(shù)=總?cè)萘?#xff0d;(front-rear);
當(dāng)rear>front時(shí),元素個(gè)數(shù)=rear-front。
21. 在一個(gè)容量為15的循環(huán)隊(duì)列中,若頭指針front=6,尾指針rear=9,則該循環(huán)隊(duì)列中共有3 個(gè)元素。
22.順序查找一般是指在 線性表 中查找指定的元素。
23.在計(jì)算機(jī)中存放線性表,一種最簡(jiǎn)單的方法是 順序存儲(chǔ) 。
24.在程序設(shè)計(jì)語(yǔ)言中,通常定義一個(gè) 一維數(shù)組 來(lái)表示線性表的順序存儲(chǔ)空間。
25.在鏈?zhǔn)酱鎯?chǔ)方式中,要求每個(gè)結(jié)點(diǎn)由兩部分組成:一部分用于存放數(shù)據(jù)元素值,稱(chēng)為數(shù)據(jù)域,另一部分用于存放指針,稱(chēng)為 指針域 。其中指針用于指向該結(jié)點(diǎn)的前一個(gè)或后一個(gè)結(jié)點(diǎn)(即前件或后件)。
26.在 線性單鏈表中 ,每一個(gè)結(jié)點(diǎn)只有一個(gè)指針域,由這個(gè)指針只能找到后繼結(jié)點(diǎn),但不能找到前驅(qū)結(jié)點(diǎn)。
27. 為了要在線性鏈表中插入一個(gè)新元素,首先要給該元素分配一個(gè) 新結(jié)點(diǎn) ,以便用于存儲(chǔ)該元素的值。
28. 在線性鏈表中刪除一個(gè)元素后,只需要改變被刪除元素所在結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)的 指針域 即可。
29. 用鏈表表示線性表的突出優(yōu)點(diǎn)是 便于插入和刪除操作 。
30. 在樹(shù)形結(jié)構(gòu)中,樹(shù)根結(jié)點(diǎn)沒(méi)有?? 前件 。
31. 在樹(shù)結(jié)構(gòu)中,一個(gè)結(jié)點(diǎn)所擁有的后件個(gè)數(shù)稱(chēng)為該結(jié)點(diǎn)的度。葉子結(jié)點(diǎn)的度為 0 。
32. 設(shè)一棵二叉樹(shù)中有3個(gè)葉子結(jié)點(diǎn),8個(gè)度為1的結(jié)點(diǎn),則該二叉樹(shù)中總的結(jié)點(diǎn)數(shù)為 13。
33. 設(shè)一棵完全二叉樹(shù)共有739個(gè)結(jié)點(diǎn),則在該二叉樹(shù)中有 370 個(gè)葉子結(jié)點(diǎn)。
34. 設(shè)一棵完全二叉樹(shù)共有700個(gè)結(jié)點(diǎn),則在該二叉樹(shù)中有 350 個(gè)葉子結(jié)點(diǎn)。
35. 在先左后右的原則下,根據(jù)訪問(wèn)根結(jié)點(diǎn)的次序,二叉樹(shù)的遍歷可以分為三種:前序遍歷、 中序 遍歷和后序遍歷。
36. 若串S="Program",則其子串的數(shù)目是 29 。 注:n(n+1)/2+1
37. 若串S=”MathTypes”,則其子串的數(shù)目是 46 。
38. 對(duì)長(zhǎng)度為n的線性表進(jìn)行插入一個(gè)新元素或刪除一個(gè)元素時(shí),在最壞情況下所需要的比較次數(shù)為 n 。
39. 在長(zhǎng)度為n的有序線性表中進(jìn)行順序查找。最壞的情況下,需要的比較次數(shù)為?? n?? 。
40. 在長(zhǎng)度為n的有序線性表中進(jìn)行二分查找。最壞的情況下,需要的比較次數(shù)為 log2n 。
41. 長(zhǎng)度為n的順序存儲(chǔ)線性表中,當(dāng)在任何位置上插入一個(gè)元素概率都相等時(shí),插入一個(gè)元素所需移動(dòng)元素的平均個(gè)數(shù)為 n/2 。
42. 排序是計(jì)算機(jī)程序設(shè)計(jì)中的一種重要操作,常見(jiàn)的排序方法有插入排序、 交換排序 和選擇排序等。
43. 快速排序法可以實(shí)現(xiàn)通過(guò)一次交換而消除多個(gè) 逆序 。
44. 快速排序法的關(guān)鍵是對(duì)線性表進(jìn)行 分割 。
45. 冒泡排序算法在最好的情況下的元素交換次數(shù)為 0 。
46. 在最壞情況下,冒泡排序的時(shí)間復(fù)雜度為 n(n-1) /2 。
47. 對(duì)于長(zhǎng)度為n的線性表,在最壞情況下,快速排序所需要的比較次數(shù)為 n(n-1) /2 。
48.在最壞情況下,簡(jiǎn)單插入排序需要比較的次數(shù)為 n(n-1) /2 。
49.在最壞情況下,希爾排序需要比較的次數(shù)為 O(n1.5) 。注:括號(hào)里是n的1.5次方。
50. 在最壞情況下,簡(jiǎn)單選擇排序需要比較的次數(shù)為 n(n-1) /2 。
51. 在最壞情況下,堆排序需要比較的次數(shù)為 o(nlog2n) 。
52.對(duì)于輸入為N個(gè)數(shù)進(jìn)行快速排序算法的平均時(shí)間復(fù)雜度是 O(Nlog2 N)。
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法常见笔试题 .的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 常用的排序算法的时间复杂度和空间复杂度
- 下一篇: softirq/tasklet/work