基础数据结构测试
今天晚上考了基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),把題拿出來(lái)跟大家分享一下,希望對(duì)大家有一定的幫助!!!
時(shí)間復(fù)雜度,即執(zhí)行了多少次,i是從1到n,j是從n到0,又因?yàn)檫@個(gè)是for循環(huán)的嵌套,所以正確答案D.O(n^2)
首先來(lái)看A 線性表即順序表和鏈表 正確
B 順序表必須占用一塊連續(xù)的內(nèi)存 無(wú)論是邏輯上還是物理上都是連續(xù)的 正確
C 鏈表沒(méi)有明確的規(guī)定 所占內(nèi)存可連續(xù) 可不連續(xù) 都可以的 錯(cuò)誤
D 鏈表的實(shí)現(xiàn)方式 正確
A.單鏈表要實(shí)現(xiàn)尾刪尾插的話,得從頭開(kāi)始遍歷,那么時(shí)間復(fù)雜度就是O(n)
B.單循環(huán)鏈表比起單鏈表就是多了個(gè)指向頭節(jié)點(diǎn)的尾指針,然后你要實(shí)現(xiàn)尾刪尾插都得從末尾開(kāi)始操作,但是它是單循環(huán)鏈表,只能從尾結(jié)點(diǎn)指向頭節(jié)點(diǎn),而不能從頭節(jié)點(diǎn)指向尾結(jié)點(diǎn),所以時(shí)間復(fù)雜度也是O(n)
C.帶尾指針的單循環(huán)鏈表 比起B(yǎng)選項(xiàng)多了個(gè)尾指針,尾插確實(shí)可以省時(shí)間,但是尾刪的話,你不能從尾指針往回找找到倒數(shù)第二個(gè)節(jié)點(diǎn)(尾刪得找到倒數(shù)第二個(gè)節(jié)點(diǎn)進(jìn)行操作),也就是尾插時(shí)間復(fù)雜度是O(1) 尾刪是O(n)
D.就可以很好的解決前三個(gè)選項(xiàng)的問(wèn)題 時(shí)間復(fù)雜度嗾使O(1)
A. 單鏈表和上道題一樣的問(wèn)題,頭刪O(1) 尾插的話得遍歷線性表 時(shí)間復(fù)雜度O(n)
B. 這個(gè)選項(xiàng)和A選項(xiàng)時(shí)間復(fù)雜度一毛一樣,帶有頭指針的單循環(huán)鏈表尾刪不能直接找到最后一個(gè)系欸DNA來(lái)實(shí)現(xiàn)尾插,單循環(huán)指的是尾指針指向頭指針 頭刪O(1) 尾插O(n)
C. 雙向鏈表找到最后一個(gè)節(jié)點(diǎn)還得遍歷一遍 頭刪O(1) 尾插O(n)
D. 尾指針直接找到危機(jī)欸但進(jìn)行尾插O(1) 然后單循環(huán)鏈表直接找到頭節(jié)點(diǎn)進(jìn)行頭刪O(1)
ABD對(duì)的 沒(méi)什么好說(shuō)的
C的話它其實(shí)是寫(xiě)反了,又因?yàn)橛邢聵?biāo)的幫助,所以尾部操作時(shí)間復(fù)雜度為O(1) 除了尾部之外的操作 得挪動(dòng)數(shù)據(jù)
因?yàn)闂5奶攸c(diǎn)是先進(jìn)后主 FILO(first Input Last Output)
然后A選項(xiàng)的話就是a先進(jìn)去然后,b再進(jìn)去再出來(lái),就是每次進(jìn)去一個(gè)然后出來(lái),再進(jìn)去下一個(gè)輸出就是abcd
B選項(xiàng)就是abcd挨個(gè)進(jìn)去,然后再出來(lái)就是dcba了 反過(guò)來(lái)了
C選項(xiàng)就是ab先進(jìn)去,b出來(lái),然后再重復(fù)A選項(xiàng)的操作,輸出就是bcda
D選項(xiàng)的就是b先于a出棧了 因?yàn)檩斎氲氖莂bcd,所以D不可能
因?yàn)殛?duì)列的特點(diǎn)和棧剛好相反,它的特點(diǎn)是先進(jìn)先出(FIFO) 然后它的正確輸出是abcd ,然后錯(cuò)誤的就是BCD
答案在下圖:
這玩意kmp算法中的next數(shù)組的求法,就是那個(gè)字符串的真子串的個(gè)數(shù)。
具體求法我在這篇博客中寫(xiě)到了:BF算法的優(yōu)化----KMP算法
相當(dāng)于給m和n都遍歷了一遍 所以n(n+m)
這個(gè)也是kmp算法中的 去看這個(gè)就好:KMP算法
這兩個(gè)題沒(méi)啥說(shuō)的,算是常識(shí)吧,八大排序中四個(gè)穩(wěn)定四個(gè)不穩(wěn)定
大家可以去看我的數(shù)據(jù)結(jié)構(gòu)專(zhuān)欄去加深一下印象:數(shù)據(jù)結(jié)構(gòu)與算法
對(duì)于冒泡排序,直接來(lái)看代碼:
void bubbleSort(int *arr,int len)
{for(int i = 0 ; i < len -1 ; i++){for(int j = 0 ; j < len -1 -i ; j++){if(arr[j] > arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}
上面代碼中只有arr[j] > arr[j+1]的時(shí)候,才會(huì)進(jìn)行交換,如果次次都需要交換,那么交換次數(shù)等于比較次數(shù),然而大多數(shù)情況下都是交換次數(shù)小于比較次數(shù),所以B選項(xiàng)正確
再來(lái)看選擇排序:選擇排序
鏈接中有明確的動(dòng)圖來(lái)解釋選擇排序中的比較次數(shù)和交換次數(shù)
這道題就是背吧,面試有時(shí)候會(huì)考到的
我們來(lái)看一下,節(jié)點(diǎn)總數(shù)是有規(guī)律的,就是((2^n)-1),那么我們將n = 6帶進(jìn)去,答案是63,63 < 100 所以小了,那么將n = 7帶進(jìn)去,答案是127 > 100,那么深度就是7
數(shù)據(jù)越亂,使用快速排序越有利,數(shù)據(jù)要是已經(jīng)排序好的1 2 3 4 5的話,第一遍得遍歷4次,第二遍三次,兩次,一次,最后總的時(shí)間復(fù)雜度就是O(n^2),所以數(shù)據(jù)不是很亂的話,使用快速排序不是很省時(shí)間
只想要獲取前幾個(gè)最小值,那么大家應(yīng)該要想到小頂堆,也就是堆排序按照小頂堆來(lái)弄,每一次弄出序列中最小的值,就很符合題意,所以選堆排序!
大家可以去看這篇博客的堆排序,講的很詳細(xì):堆排序
照著上圖,可以看出左半邊有6個(gè)元素,21下標(biāo)為6,答案為6,6
這次的考題中主要還是關(guān)于鏈表和順序表那塊的考題比較經(jīng)典,還有就是快排和冒泡排序,這兩很重要,一定得會(huì)寫(xiě)!
“每一個(gè)不曾起舞的日子,搜是對(duì)生命的辜負(fù)!”
總結(jié)
- 上一篇: 微信网名女孩可爱女生
- 下一篇: 仓库货位卡标识牌_仓储管理中的货位与标识