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