1. 堆
二叉堆是完全二叉樹或者是近似完全二叉樹。
二叉堆滿足2個特性:
1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。
由於其它幾種堆(二項式堆,斐波納契堆等)用的較少,一般將二叉堆就簡稱為堆。
堆的表示:
一般都用陣列來表示堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。
堆的插入:
每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個有序的數列,現在的任務是將這個新資料插入到這個有序資料中——這就類似於直接插入排序中將乙個資料併入到有序區間中。
堆的刪除:
按定義,堆中每次都只能刪除第0個資料。為了便於重建堆,實際的操作是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。調整時先在左右兒子結點中找最小的,如果父結點比這個最小的子結點還**明不需要調整了,反之將父結點和它交換後再考慮後面的結點。相當於從根結點將乙個資料的「下沉」過程。
2.voliate修飾符
volatile 影響編譯器編譯的結果,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,(vc++ 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。)。
例如:volatileint i=10;
int j =i;
...int k =i;volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中。
而優化做法是,由於編譯器發現兩次從i讀資料的**之間的**沒有對i進行過操作,它會自動把上次讀的資料放在k中。而不是重新從i裡面讀。這樣以來,如果i是乙個暫存器變數或者表示乙個埠資料就容易出錯,所以說volatile可以保證對特殊位址的穩定訪問,不會出錯。
乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。準確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:
1) 並行裝置的硬體暫存器(如:狀態暫存器)
2) 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)
3) 多執行緒應用中被幾個任務共享的變數
如下例:
int square(volatile int *ptr)
被翻譯成:
int square(volatile int *ptr)
3. udp為什麼快及應用場景
一定要說udp比tcp快的地方無非就是udp沒有流控,沒有握手,沒有成功確認,乙個資料報發過去就不管,從這個角度上說tcp是開銷大一點。
但udp的「快」帶來的問題是它不可靠,的確有些場景快就足夠了,比如流**,偶爾丟失錯亂幾個包不是大問題,但更多的情況下,資料的正確性是乙個必選項,此時udp就不一定適用了。
但有個場景你是絕對需要udp的,那就是廣播,tcp這種點對點有連線的協議,天生就沒法廣播,你只能建立一大堆連線然後朝每個對端把資料分別傳送一遍。
udp的應用場景:
tcp一般用於檔案傳輸(ftp http 對資料準確性要求高,速度可以相對慢),傳送或接收郵件(pop imap smtp 對資料準確性要求高,非緊急應用),遠端登入(telnetssh 對資料準確性有一定要求,有連線的概念)等等;udp一般用於即時通訊(qq聊天 對資料準確性和丟包要求比較低,但速度必須快),****(rtsp 速度一定要快,保證**連續,但是偶爾花了乙個影象幀,人們還是能接受的),網路語音**(voip 語音資料報一般比較小,需要高速傳送,偶爾斷音或串音也沒有問題)等等。
4.const與#define
1、定義常量
2.const修飾函式引數
3.修飾成員函式(只能訪問const成員變數,不能訪問非const成員變數)
const常量有資料型別, 而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只能進行字元替換,沒有型別安全檢查。而且字元替換可能會帶來料想不到的邊界效應。有些整合化工具可以對const常量進行除錯, 但不能對巨集量進行除錯。
const的常量是乙個run-time的概念,它在程式中確確實實的存在可以被呼叫、傳遞。而#define常量則是乙個compile-time概念,它的生命週期止於編譯期:在實際程式中他只是乙個常數、乙個命令中的引數,沒有實際的存在。const常量存在於程式的資料段.#define常量存在於程式的**段。
1.const定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區),而#define定義的巨集常量在記憶體中有若干個拷貝。
2.#define巨集是在預編譯階段進行替換,而const修飾的唯讀變數是在編譯的時候確定其值。
從執行效率上來說#define是乙個更好的選擇。從執行穩健性來說用const會好一些。
5.c和c++的區別
c和c++的關係:就像是win98跟winxp的關係。c++是在c的基礎上增加了新的理論,玩出了新的花樣。所以叫c加加。
1. c是乙個結構化語言,它的重點在於演算法和資料結構。c程式的設計首要考慮的是如何通過乙個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制)。
2. c++,首要考慮的是如何構造乙個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取物件的狀態資訊得到輸出或實現過程(事務)控制。 所以c與c++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說c++比c更先進,是因為「 設計這個概念已經被融入到c++之中 」。
面試總結(堆 UDP voliate)
1.堆 二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足2個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點...
mysql面試總結 MySQL面試總結
最近在面試,總結一下問的比較多的問題,持續補充哈!基礎varchar與char區別 首先你要知道的是varchar 20 這裡的20代表的是字元,而不是位元組,其次在mysql中,所有使用utf8字符集,無論是中文還是英文,都是按照3個位元組儲存 varchar與char都可以儲存字元,它們的區別是...
面試前必看 堆排序 堆插入 堆刪除
目錄 1.對乙個數組建最大堆,得到堆頂最大值 2.對乙個數組建最大堆,得到排好序 從小到大 的陣列 3.向乙個堆中插入元素 以最小堆作圖示 下面 是對最大堆的操作 4.刪除最大堆的堆頂 以最小堆作圖示 下面 是對最大堆的操作 def sink self,nums,root if 2 root 1 l...