筆試面試題總結(一) 軟體開發

2021-07-05 06:15:14 字數 3453 閱讀 8602

1.huffman編碼中的貪心策略,該部分所需要的計算時間。

首先,要理解huffman編碼中那部分用到了貪心演算法,貪心的策略,這樣才能求所需的計算時間。

哈夫曼編碼演算法:每次將集合中兩個權值最小的二叉樹合併成一棵新二叉樹,n-1次合併後,成為最終的一棵哈夫曼樹。這既是貪心法的思想:從某乙個最初狀態出發,根據當前的區域性最優策略,以滿足約束方程為條件,以使目標函式最快(或最慢)為原則,在候選集合中進行一系列的選擇,以便盡快構成問題的可行解。

每次求得兩個權值最小的兩個值,用的演算法,網上搜的基本上都是用的堆排序,那麼時間複雜度就是o(nlogn).

構造哈夫曼編碼

哈夫曼提出構造最優字首碼的貪心演算法,由此產生的編碼方案稱為哈夫曼編碼。

哈夫曼演算法以自底向上的方式構造表示最優字首碼的二叉樹t。

演算法以|c|個葉結點開始,執行|c|-1次的「合併」運算後產生最終所要求的樹t。 

以f為鍵值的優先佇列q用在貪心選擇時有效地確定演算法當前要合併的2棵具有最小頻率的樹。一旦2棵具有最小頻率的樹合併後,產生一棵新的樹,其頻率為合併的2棵樹的頻率之和,並將新樹插入優先佇列q。經過n-1次的合併後,優先佇列中只剩下一棵樹,即所要求的樹t。

演算法huffmantree用最小堆實現優先佇列q。初始化優先佇列需要o(n)計算時間,由於最小堆的removemin和put運算均需o(logn)時間,n-1次的合併總共需要o(nlogn)計算時間。因此,關於n個字元的哈夫曼演算法的計算時間為o(nlogn) 。

2.連通圖、連通分量、強連通圖、弱連通圖

連通圖:在無向圖中,

若從頂點v1到頂點v2有路徑, 則稱頂點v1與v2是連通的。如果圖中任意一對頂點都是連通的,則稱此圖是連通圖。

強連通和弱連通的概念只在

有向圖中存在。

強連通圖:在有向圖中,

若對於每一對頂點v1和v2, 都存在一條從v1到v2和從v2到v1的路徑,則稱此圖是強連通圖。

強連通圖

只有乙個強

連通分量

,即是其自身;非強連通的有向圖

有多個強連分量。

單向連通圖:如果有向圖中,對於任意節點v1和v2,至少存在從v1到v2和從v2到v1的路徑中的一條,則原圖為單向連通圖。

弱連通圖:將

有向圖的所有的有向邊替換為無向邊,所得到的圖稱為原圖的基圖。如果乙個有向圖

的基圖是連通圖,則有向圖是弱連通圖。

3.乙個關於陣列與指標的題目

自己有些模糊,因此程式又實現了一下。

問題:定義陣列和指標如下 char a[5]=;   char *p=a;,如下關於對陣列元素的操作是否正確:a[p-a].      printf("%c",a[p-a]); 程式輸出:g。即可以正確訪問。

4.關於switch語句中default語句所放位置的問題。

switch中的default,一般用在最後,表示非以上的任何情況下而發生的情況,我們一般習慣在他的後面加上個break。但是,如果default不是在最後,  switch還是最後執行default語句,如果default後面帶有break,那麼程式就會正常跳出switch,否則,程式會繼續向後執行switch語句!也就是說,不管default放在什麼位置,它總是在最後乙個處理,然後繼續向下處理!所以,最後的處理辦法,避免出現以外結果的最好辦法就是每乙個case以及default語句都要加乙個break!

5. 作業系統的使用者態和核心態

在cpu的所有指令中,有一些指令是非常危險的,如果錯用,將導致整個系統崩潰。比如:清記憶體、設定時鐘等。如果所有的程式都能使用這些指令,那麼你的系統一天宕機n回就不足為奇了。所以,cpu將指令分為特權指令和非特權指令,對於那些危險的指令,只允許作業系統及其相關模組使用,普通的應用程式只能使用那些不會造成災難的指令。intel的cpu將特權級別分為4個級別:ring0,ring1,ring2,ring3。

linux的核心是乙個有機的整體。每乙個使用者程序執行時都好像有乙份核心的拷貝,每當使用者程序使用系統呼叫時,都自動地將執行模式從使用者級轉為核心級,此時程序在核心的位址空間中執行。

當乙個任務(程序)執行系統呼叫而陷入核心**中執行時,我們就稱程序處於核心執行態(或簡稱為核心態)。此時處理器處於特權級最高的(0級)核心**中執行。當程序處於核心態時,執行的核心**會使用當前程序的核心棧。每個程序都有自己的核心棧。在處理器的儲存保護中,核心態,或者特權態(與之相對應的是使用者態),是作業系統核心所執行的模式。執行在該模式的**,可以無限制地對系統儲存、外部裝置進行訪問。

當程序在執行使用者自己的**時,則稱其處於使用者執行態(使用者態)。即此時處理器在特權級最低的(3級)使用者**中執行。當正在執行使用者程式而突然被中斷程式中斷時,此時使用者程式也可以象徵性地稱為處於程序的核心態。因為中斷處理程式將使用當前程序的核心棧。這與處於核心態的程序的狀態有些類似。

處理器總處於以下狀態中的一種:

1、核心態,執行於程序上下文,核心代表程序執行於核心空間;

2、核心態,執行於中斷上下文,核心代表硬體執行於核心空間;

3、使用者態,執行於使用者空間。

從使用者空間到核心空間有三種觸發手段:

(1).使用者空間的應用程式,通過系統呼叫,進入核心空間。這個時候使用者空間的程序要傳遞很多變數、引數的值給核心,核心態執行的時候也要儲存使用者程序的一些暫存器值、變數等。所謂的「程序上下文」,可以看作是使用者程序傳遞給核心的這些引數以及核心要儲存的那一整套的變數和暫存器值和當時的環境等。

(2).硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理。所謂的「中斷上下文」,其實也可以看作就是硬體傳遞過來的這些引數和核心需要儲存的一些其他環境(主要是當前被打斷執行的程序環境)。

(3).異常  當cpu在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。

6. 搶占式核心和非搶占式核心的區別

核心搶占(可搶占式核心):

即當程序位於核心空間時,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的程序。

非搶占式核心:

高優先順序的程序不能中止正在核心中執行的低優先順序的程序而搶占cpu執行。程序一旦處於核心態(例如使用者程序執行系統呼叫),則除非程序自願放棄cpu,否則該程序將一直執行下去,直至完成或退出核心。

7. 指標函式和函式指標

指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標。

函式指標是指向函式的指標變數,即本質是乙個指標變數。

參考文章:

[1].貪心演算法

[2].連通圖

[3].switch中的default

[4].作業系統為什麼要分使用者態和核心態

[5].搶占式核心與非搶占式核心的區別

[6].指標函式與函式指標的區別

軟體開發常見筆試面試題整理

1 物件導向和面向過程的區別是什麼?面向過程 概念 面向過程是一種以過程為中心的程式設計思想,它是一種基礎的順序的思維方式,物件導向方法的基礎實現中也包含面向過程思想 特性 模組化 流程化 優點 效能比物件導向高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源 比如微控制器 嵌入式開發 linux...

軟體開發面試題

1 10棵樹,種五行,每行四顆樹,怎麼種?2 乙個房間有三個開關,分別控制另乙個房間的三盞燈,每個房間只進去一次怎麼判斷三個開關分別控制的是哪盞燈。3 兩個盲人分別買了兩雙黑襪子和兩雙藍襪子放在了同乙個籃子裡,他們走的時候兩個人依然分別拿的是兩雙黑襪子和兩雙藍襪子,他們是如何分的。4 生公尺煮成了熟...

面試Java軟體開發職位面試題

1 oracle的分頁 2 jquery中常用的元素查詢方法 3 和 的區別 和 equers 的區別 4 ssh的知識點 5 hibernate的快取 一級 二級 6 map list linklist arraylist 7 設計模式 及作用 8 mabatis和hibernate的區別 9 介...