《C++開發工程師崗位必備知識點五》

①判斷圖是否有迴路問題

 1.DFS,深度優先遍歷:從一個頂點出發存在搜回到自己的路徑。

 2.拓撲排序:是對有向無迴路圖進行排序,以期找到一個線性序列,這個線性序列可以表示某些事情完成的相應順序。

    如果說所求的圖有迴路的話,則不可能找到這個序列。

 3.求最短路徑:有環則最短路徑爲零。

②廣度優先搜索、深度優先搜索理解

深度優先搜索:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問  的鄰接點出發深度優先搜索遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到。 若此時尚有其他頂點未被訪問到,則另選一個未被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到爲止。深度優先搜索是一個遞歸的過程。

廣度優先搜索:從圖中某頂點v出發,在訪問了v之後依次訪問v的各個未曾訪問過的鄰接點,然後分別從這些鄰接點出發依次訪問它們的鄰接點,並使得“先被訪問的頂點的鄰接點先於後被訪問的頂點的鄰接點被訪問,直至圖中所有已被訪問的頂點的鄰接點都被訪問到。如果此時圖中尚有頂點未被訪問,則需要另選一個未曾被訪問過的頂點作爲新的起始點,重複上述過程,直至圖中所有頂點都被訪問到爲止。也就是說廣度優先搜索遍歷圖的過程是以v爲起點,由近至遠,依次訪問和v有路徑相通且路徑長度爲1,2...的頂點。

③循環隊列的理解

1、隊列添加元素是在對尾,刪除元素是在對頭; 2、添加元素,尾指針rear+1 ; 刪除元素,頭指針front+1;

④基於比較的內部排序理解

基於關鍵字的比較操作排序方法,其排序過程均可以利用判定樹來描述。判定樹上所有葉子結點恰好表示所有排序結果,每個初始序列經過排序達到有序所需要進行的比較次數,正好等於從樹根到和該序列相應的葉子結點的路徑長度。由於含n個記錄的序列可能出現的初始狀態有n!個,則描述n個記錄排序過程的判定樹必須有n!個葉結點。因爲,若少一個葉結點,則說明尚有兩種狀態沒有分辨出來。由於若二叉樹高度爲h,則葉子結點的個數不超過2h-1個;反之,若有u個結點,則二叉樹的高度至少爲log2u(向上取整,以2爲底u的對數)。因此,描述n個記錄排序的判定樹上必定存在一條長度爲的路徑。

⑤內聯函數理解

程序中總是會定義很多函數,以供調用,但是調用函數比求解等價表達式要慢得多。在大多數的機器上,調用函數都要做很多工作:調用前要先保存寄存器,並在返回時恢復,複製實參,程序還必須轉向一個新位置執行。C++中支持內聯函數,其目的是爲了提高函數的執行效率,用關鍵字 inline 放在函數定義(注意是定義而非聲明)的前面即可將函數指定爲內聯函數,內聯函數通常就是將它在程序中的每個調用點上“內聯地”展開。例如:

//求0-9的平方
inline int inlineFunc(int num)
{  
  if(num>9||num<0)
      return -1;  
  return num*num;  
}  

int main(int argc,char* argv[])
{
    int a=8;
    int res=inlineFunc(a);
    cout<<"res:"<<res<<endl;
}
inline之後的main函數代碼可以理解爲如下形式:

int main(int argc,char* argv[])
{
    int a=8;
    {  
        int _temp_b=8;  
        int _temp;  
        if (_temp_q >9||_temp_q<0) _temp = -1;  
        else _temp =_temp*_temp;  
        b = _temp;  
    }
}  
這就是所謂的內聯展開。

⑥程序內存佔用問題彙總

棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區。裏面的變量通常是局部變量、函數參數等。 
堆:就是那些由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。 
自由存儲區:就是那些由malloc等分配的內存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。 
全局/靜態存儲區:全局變量和靜態變量被分配到同一塊內存中,在以前的C語言中,全局變量又分爲初始化的和未初始化的,在C++裏面沒有這個區分了,他們共同佔用同一塊內存區。 
常量存儲區:這是一塊比較特殊的存儲區,他們裏面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多) 

⑦中間件的理解

中間件是一種獨立的系統軟件或服務程序,分佈式應用軟件藉助這種軟件在不同的技術之間共享資源。中間件位於客戶機/ 服務器的操作系統之上,管理計算機資源和網絡通訊。是連接兩個獨立應用程序或獨立系統的軟件。相連接的系統,即使它們具有不同的接口,但通過中間件相互之間仍能交換信息。執行中間件的一個關鍵途徑是信息傳遞。通過中間件,應用程序可以工作於多平臺或OS環境。(簡單來說,中間件並不能提高內核的效率,一般只是負責網絡信息的分發處理)

中間件特點的描述:

1. 中間件應支持標準的協議和接口

2. 中間件可運行於多種硬件和操作系統平臺上

3. 跨越網絡,硬件,操作系統平臺的應用或服務可通過中間件透明交互

⑧前、中、後綴表達式理解

總體方法:前綴表達式,從右往左掃描,遇到操作數壓棧,遇到操作符出棧兩個數運算,其結果入棧; 後綴表達式,從左往右掃描,遇到操作數壓棧,遇到操作符出棧兩個數運算,其結果入棧。重複上述過程直到表達式最左端,最後運算得出的值即爲表達式的結果。例子如下:

前綴形式爲:+-*^ABCD/E/F+GH

1) 首先掃描 H,是數字 入棧 ,棧中爲: H

2) 掃描 G 爲數字 入棧 ,棧中爲:G,H

3)掃描+ 爲運算符 ,依次彈出G ,H ,得到 G+H 的結果 入棧,棧中爲: G+H(在這裏方便講解 標記爲  G+H)

4)掃描 F 爲數字 ,入棧 ,棧中爲  F, G+H

5)掃描 / 爲運算符, 依次彈出 F,G+H ,計算F/(G+H) 的結果入棧 ,棧中爲 F/(G+H)

6)掃描 E 爲數字,入棧,棧中爲 E,  F/(G+H)

7) 掃描 / 爲運算符, 依次彈出E, F/(G+H) ,計算 E/(F/(G+H))

8)掃描 D 爲數字,入棧 棧中爲:D, E/(F/(G+H))

9) 掃描 C 爲數字,入棧 棧中爲:C,D, E/(F/(G+H))

10) 掃描 B 爲數字,入棧 棧中爲:B,C,D, E/(F/(G+H))

11) 掃描 A 爲數字,入棧 棧中爲:A,B,C,D, E/(F/(G+H))

12) 掃描^ 爲運算符,依次彈出 A,B 計算 A^B的結果入棧, 棧中爲:A^B ,C,D, E/(F/(G+H))

13) 掃描*爲運算符,,依次彈出 A^B,C 計算 A^B*C的結果入棧, 棧中爲:A^B* C,D, E/(F/(G+H))

14) 掃描-爲運算符,,依次彈出 A^B*C,D 計算 A^B*C-D的結果入棧, 棧中爲:A^B* C-D, E/(F/(G+H))

15) 掃描+爲運算符,,依次彈出 A^B*C-D, E/(F/(G+H))   計算 A^B*C-D+  E/(F/(G+H)) 的到結果

最後得到的中綴表達式爲:  A^B* C-D+ E/(F/(G+H))

⑨廣義表理解

規定用小寫字母表示原子,用大寫字母表示廣義表的表名。例如:

    A=()
    B=(e)
    C=(a,(b,c,d))
    D=(A,B,C)=((),(e),(a,(b,c,d)))
    E=((a,(a,b),((a,b),c)))

其中A是一個空表,其長度爲0;

B是隻含有單個原子e的表,其長度爲1;

C有兩個元素,一個是原子a,另一個是子表,其長度爲2;

D有三個元素,每個元素都是一個表,其長度爲3;

E中只含有一個元素,是一個表,它的長度爲1;

任何一個非空廣義表GL均可分解爲表頭head(GL) = a1和表尾tail(GL) = ( a2,…,an) 兩部分。

⑩構造函數與成員函數,析構函數

構造函數是一種特殊的成員函數,可以根據參數的不同實現函數重載。析構函數沒有參數,對於一個類來說也是唯一的,所以是不能重載的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章