騰訊研發(fā)類C++(轉(zhuǎn))

1、C和C++的特點與區(qū)別缰猴?

答:(1)C語言特點:
1.作為一種面向過程的結(jié)構(gòu)化語言氛琢,易于調(diào)試和維護喊递;

2.表現(xiàn)能力和處理能力極強,可以直接訪問內(nèi)存的物理地址艺沼;

3.C語言實現(xiàn)了對硬件的編程操作册舞,也適合于應用軟件的開發(fā);

4.C語言還具有效率高障般,可移植性強等特點调鲸。

(2)C++語言特點:

1.在C語言的基礎(chǔ)上進行擴充和完善,使C++兼容了C語言的面向過程特點挽荡,又成為了一種面向?qū)ο蟮某绦蛟O(shè)計語言藐石;

2.可以使用抽象數(shù)據(jù)類型進行基于對象的編程;

3.可以使用多繼承定拟、多態(tài)進行面向?qū)ο蟮木幊蹋?/p>

4.可以擔負起以模版為特征的泛型化編程于微。

C++與C語言的本質(zhì)差別:在于C++是面向?qū)ο蟮模鳦語言是面向過程的青自≈暌溃或者說C++是在C語言的基礎(chǔ)上增加了面向?qū)ο蟪绦蛟O(shè)

計的新內(nèi)容,是對C語言的一次更重要的改革延窜,使得C++成為軟件開發(fā)的重要工具恋腕。

2、C++的多態(tài)

答:C++的多態(tài)性用一句話概括:在基類的函數(shù)前加上virtual關(guān)鍵字逆瑞,在派生類中重寫該函數(shù)荠藤,運行時將會根據(jù)對象的實際類型來

調(diào)用相應的函數(shù)。如果對象類型是派生類获高,就調(diào)用派生類的函數(shù)哈肖;如果對象類型是基類,就調(diào)用基類的函數(shù)念秧。

1):用virtual關(guān)鍵字申明的函數(shù)叫做虛函數(shù)淤井,虛函數(shù)肯定是類的成員函數(shù);

2):存在虛函數(shù)的類都有一個一維的虛函數(shù)表叫做虛表,類的對象有一個指向虛表開始的虛指針庄吼。虛表是和類對應的缎除,虛表指針是

和對象對應的;

3):多態(tài)性是一個接口多種實現(xiàn)总寻,是面向?qū)ο蟮暮诵陌啵譃轭惖亩鄳B(tài)性和函數(shù)的多態(tài)性败许。;

4):多態(tài)用虛函數(shù)來實現(xiàn),結(jié)合動態(tài)綁定.甸饱;

5):純虛函數(shù)是虛函數(shù)再加上 = 0窟感;

6):抽象類是指包括至少一個純虛函數(shù)的類温学;

純虛函數(shù):virtual void fun()=0;即抽象類宙枷,必須在子類實現(xiàn)這個函數(shù),即先有名稱蕴忆,沒有內(nèi)容颤芬,在派生類實現(xiàn)內(nèi)容。

3套鹅、虛函數(shù)實現(xiàn)

答:簡單地說站蝠,每一個含有虛函數(shù)(無論是其本身的,還是繼承而來的)的類都至少有一個與之對應的虛函數(shù)表卓鹿,其中存放著該類

所有的虛函數(shù)對應的函數(shù)指針菱魔。例:

image

其中:

B的虛函數(shù)表中存放著B::foo和B::bar兩個函數(shù)指針。

D的虛函數(shù)表中存放的既有繼承自B的虛函數(shù)B::foo吟孙,又有重寫(override)了基類虛函數(shù)B::bar的D::bar澜倦,還有新增的虛函數(shù)D::quz。

虛函數(shù)表構(gòu)造過程:

從編譯器的角度來說杰妓,B的虛函數(shù)表很好構(gòu)造藻治,D的虛函數(shù)表構(gòu)造過程相對復雜。下面給出了構(gòu)造D的虛函數(shù)表的一種方式(僅供參考):

image

虛函數(shù)調(diào)用過程

以下面的程序為例:

image

4巷挥、C和C++內(nèi)存分配問題

答:(1)C語言編程中的內(nèi)存基本構(gòu)成

C的內(nèi)存基本上分為4部分:靜態(tài)存儲區(qū)桩卵、堆區(qū)、棧區(qū)以及常量區(qū)句各。他們的功能不同,對他們使用方式也就不同晴叨。

1.棧 ——由編譯器自動分配釋放凿宾;

2.堆 ——一般由程序員分配釋放,若程序員不釋放兼蕊,程序結(jié)束時可能由OS回收初厚;

3.全局區(qū)(靜態(tài)區(qū))——全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量

和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域(C++中已經(jīng)不再這樣劃分)产禾,程序結(jié)束釋放排作;

4.另外還有一個專門放常量的地方,程序結(jié)束釋放亚情;

(a)函數(shù)體中定義的變量通常是在棧上妄痪;

(b)用malloc, calloc, realloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上;

(c)在所有函數(shù)體外定義的是全局量楞件;

(d)加了static修飾符后不管在哪里都存放在全局區(qū)(靜態(tài)區(qū))衫生;

(e)在所有函數(shù)體外定義的static變量表示在該文件中有效,不能extern到別的文件用土浸;

(f)在函數(shù)體內(nèi)定義的static表示只在該函數(shù)體內(nèi)有效罪针;

(g)另外,函數(shù)中的"adgfdf"這樣的字符串存放在常量區(qū)黄伊。

(2)C++編程中的內(nèi)存基本構(gòu)造

在C++中內(nèi)存分成5個區(qū)泪酱,分別是堆、棧还最、全局/靜態(tài)存儲區(qū)墓阀、常量存儲區(qū)和代碼區(qū);

1憋活、棧岂津,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變量的存儲區(qū)悦即,里面的變量通常是局部變量吮成、函數(shù)參數(shù)等。

2辜梳、堆粱甫,就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管作瞄,由我們的應用程序去控制茶宵,一般一個new就要對應一個delete。如

果程序員沒有釋放掉宗挥,那么在程序結(jié)束后乌庶,操作系統(tǒng)會自動回收。

3契耿、全局/靜態(tài)存儲區(qū)瞒大,全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語言中搪桂,全局變量又分為初始化的和未初始化的透敌,在

C++里面沒有這個區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。

4酗电、常量存儲區(qū)魄藕,這是一塊比較特殊的存儲區(qū),他們里面存放的是常量撵术,不允許修改(當然背率,你要通過非正當手段也可以修改)。

5荷荤、代碼區(qū) (.text段)退渗,存放代碼(如函數(shù)),不允許修改(類似常量存儲區(qū))蕴纳,但可以執(zhí)行(不同于常量存儲區(qū))会油。

內(nèi)存模型組成部分:自由存儲區(qū),動態(tài)區(qū)古毛、靜態(tài)區(qū)翻翩;

根據(jù)c/c++對象生命周期不同,c/c++的內(nèi)存模型有三種不同的內(nèi)存區(qū)域稻薇,即:自由存儲區(qū)嫂冻,動態(tài)區(qū)、靜態(tài)區(qū)塞椎。

自由存儲區(qū):局部非靜態(tài)變量的存儲區(qū)域桨仿,即平常所說的棧;

動態(tài)區(qū): 用new 案狠,malloc分配的內(nèi)存服傍,即平常所說的堆;

靜態(tài)區(qū):全局變量骂铁,靜態(tài)變量吹零,字符串常量存在的位置;

注:代碼雖然占內(nèi)存拉庵,但不屬于c/c++內(nèi)存模型的一部分灿椅;

一個正在運行著的C編譯程序占用的內(nèi)存分為5個部分:代碼區(qū)、初始化數(shù)據(jù)區(qū)钞支、未初始化數(shù)據(jù)區(qū)茫蛹、堆區(qū) 和棧區(qū);

(1)代碼區(qū)(text segment):代碼區(qū)指令根據(jù)程序設(shè)計流程依次執(zhí)行烁挟,對于順序指令婴洼,則只會執(zhí)行一次(每個進程),如果反復信夫,則需要使用跳轉(zhuǎn)指令窃蹋,如果進行遞歸,則需要借助棧來實現(xiàn)静稻。注意:代碼區(qū)的指令中包括操作碼和要操作的對象(或?qū)ο蟮刂芬茫┚弧H绻橇⒓磾?shù)(即具體的數(shù)值,如5)振湾,將直接包含在代碼中杀迹;

(2)全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(Data Segment):只初始化一次。

(3)未初始化數(shù)據(jù)區(qū)(BSS):在運行時改變其值押搪。

(4)棧區(qū)(stack):由編譯器自動分配釋放树酪,存放函數(shù)的參數(shù)值、局部變量的值等大州,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧续语。

(5)堆區(qū)(heap):用于動態(tài)內(nèi)存分配。

為什么分成這么多個區(qū)域厦画?

主要基于以下考慮:

代碼是根據(jù)流程依次執(zhí)行的疮茄,一般只需要訪問一次,而數(shù)據(jù)一般都需要訪問多次根暑,因此單獨開辟空間以方便訪問和節(jié)約空間力试。

未初始化數(shù)據(jù)區(qū)在運行時放入棧區(qū)中,生命周期短排嫌。

全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)有可能在整個程序執(zhí)行過程中都需要訪問畸裳,因此單獨存儲管理。

堆區(qū)由用戶自由分配淳地,以便管理怖糊。

更多內(nèi)容見:http://www.cnblogs.com/Stultz-Lee/p/6751522.html

5、協(xié)程

答:定義:協(xié)程是一種用戶態(tài)的輕量級線程薇芝。

協(xié)程擁有自己的寄存器上下文和棧蓬抄。協(xié)程調(diào)度切換時,將寄存器上下文和棧保存到其他地方夯到,在切回來的時候嚷缭,恢復先前保存的寄存器上下文和棧。因此:協(xié)程能保留上一次調(diào)用時的狀態(tài)(即所有局部狀態(tài)的一個特定組合)耍贾,每次過程重入時阅爽,就相當于進入上一次調(diào)用的狀態(tài),換種說法:進入上一次離開時所處邏輯流的位置荐开;

線程是搶占式付翁,而協(xié)程是協(xié)作式;

協(xié)程的優(yōu)點:

跨平臺
跨體系架構(gòu)
無需線程上下文切換的開銷
無需原子操作鎖定及同步的開銷
方便切換控制流晃听,簡化編程模型
高并發(fā)+高擴展性+低成本:一個CPU支持上萬的協(xié)程都不是問題百侧。所以很適合用于高并發(fā)處理砰识。

協(xié)程的缺點:

無法利用多核資源:協(xié)程的本質(zhì)是個單線程,它不能同時將 單個CPU 的多個核用上,協(xié)程需要和進程配合才能運行在多CPU;
進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序:這一點和事件驅(qū)動一樣佣渴,可以使用異步IO操作來解決辫狼。

6、CGI的了解

答:CGI:通用網(wǎng)關(guān)接口(Common Gateway Interface)是一個Web服務(wù)器主機提供信息服務(wù)的標準接口辛润。通過CGI接口膨处,Web服務(wù)

器就能夠獲取客戶端提交的信息,轉(zhuǎn)交給服務(wù)器端的CGI程序進行處理砂竖,最后返回結(jié)果給客戶端真椿。

CGI通信系統(tǒng)的組成是兩部分:一部分是html頁面,就是在用戶端瀏覽器上顯示的頁面乎澄。另一部分則是運行在服務(wù)器上的Cgi程序突硝。

7、進程間通信方式和線程間通信方式

答:(1)進程間通信方式:

管道( pipe ):管道是一種半雙工的通信方式置济,數(shù)據(jù)只能單向流動狞换,而且只能在具有親緣關(guān)系的進程間使用。進程的親緣關(guān)系通常是指父子進程關(guān)系舟肉。

信號量( semophore ) : 信號量是一個計數(shù)器修噪,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制路媚,防止某進程正在訪問共享資源時黄琼,其他進程也訪問該資源。因此整慎,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段脏款。

消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標識符標識裤园。消息隊列克服了信號傳遞信息少撤师、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。

共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存拧揽,這段共享內(nèi)存由一個進程創(chuàng)建剃盾,但多個進程都可以訪問。共享內(nèi)存是最快的 IPC 方式淤袜,它是針對其他進程間通信方式運行效率低而專門設(shè)計的痒谴。它往往與其他通信機制,如信號兩铡羡,配合使用积蔚,來實現(xiàn)進程間的同步和通信。

套接字( socket ) : 套解口也是一種進程間通信機制烦周,與其他通信機制不同的是尽爆,它可用于不同及其間的進程通信怎顾。

(2)線程間通信方式:

全局變量;

Messages消息機制漱贱;

CEvent對象(MFC中的一種線程通信對象杆勇,通過其觸發(fā)狀態(tài)的改變實現(xiàn)同步與通信)。

8饱亿、TCP握手與釋放

答:(1)握手

第一次握手:主機A發(fā)送握手信號syn=1和seq=x(隨機產(chǎn)生的序列號)的數(shù)據(jù)包到服務(wù)器,主機B由SYN=1知道闰靴,A要求建立聯(lián)機彪笼;

第二次握手:主機B收到請求后要確認聯(lián)機信息,向A發(fā)送syn=1蚂且,ack=x(x是主機A的Seq)+1配猫,以及隨機產(chǎn)生的確認端序列號

seq=y的包;

第三次握手:主機A收到后檢查ack是否正確(ack=x+1)杏死,即第一次發(fā)送的seq+1泵肄,若正確,主機A會再發(fā)送ack=y+1淑翼,以及隨機序

列號seq=z腐巢,主機B收到后確認ack值則連接建立成功;

完成三次握手玄括,主機A與主機B開始傳送數(shù)據(jù)冯丙。

注:上述步驟中,第二和第三次確認包中都還包含一個標志位未予以說明遭京,該標志位為1表示正常應答胃惜;

具體可見圖片:

image

為什么需要“三次握手”?

“三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務(wù)端哪雕,因而產(chǎn)生錯誤”船殉。具體例如:client發(fā)出的第一個連接請求報文段并沒有丟失,而是在某個網(wǎng)絡(luò)結(jié)點長時間的滯留了斯嚎,以致延誤到連接釋放以后的某個時間才到達server利虫。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段后堡僻,就誤認為是client再次發(fā)出的一個新的連接請求列吼。于是就向client發(fā)出確認報文段,同意建立連接苦始。假設(shè)不采用“三次握手”寞钥,那么只要server發(fā)出確認,新的連接就建立了陌选。由于現(xiàn)在client并沒有發(fā)出建立連接的請求理郑,因此不會理睬server的確認蹄溉,也不會向server發(fā)送數(shù)據(jù)。但server卻以為新的運輸連接已經(jīng)建立您炉,并一直等待client發(fā)來數(shù)據(jù)柒爵。這樣,server的很多資源就白白浪費掉了赚爵。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生棉胀。例如剛才那種情況,client不會向server的確認發(fā)出確認冀膝。server由于收不到確認唁奢,就知道client并沒有要求建立連接。主要目的防止server端一直等待窝剖,浪費資源麻掸。

(2)揮手

由于TCP連接是全雙工的,因此每個方向都必須單獨進行關(guān)閉赐纱。這原則是當一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個FIN來終止這個方向的連接脊奋。收到一個 FIN只意味著這一方向上沒有數(shù)據(jù)流動,一個TCP連接在收到一個FIN后仍能發(fā)送數(shù)據(jù)疙描。首先進行關(guān)閉的一方將執(zhí)行主動關(guān)閉诚隙,而另一方執(zhí)行被動關(guān)閉。
  (1) TCP客戶端發(fā)送一個FIN起胰,用來關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報文段4)最楷;
  (2) 服務(wù)器收到這個FIN,發(fā)回一個ACK待错,確認序號為收到的序號加1(報文段5)籽孙。和SYN一樣,一個FIN將占用一個序號火俄;
  (3) 服務(wù)器關(guān)閉客戶端的連接后犯建,再發(fā)送一個FIN給客戶端(報文段6);
  (4) 客戶段收到服務(wù)端的FIN后瓜客,發(fā)回ACK報文確認适瓦,并將確認序號設(shè)置為收到序號加1(報文段7);

注意:TCP連接的任何一方都可以發(fā)起揮手操作谱仪,上述步驟只是兩種之一玻熙;

具體過程見圖:

image

為什么是“四次揮手”?
因為當收到對方的FIN報文通知時疯攒,它僅僅表示對方?jīng)]有數(shù)據(jù)發(fā)送給你了嗦随;但未必你所有的數(shù)據(jù)都全部發(fā)送給對方了,所以你可能還需要發(fā)送一些數(shù)據(jù)給對方敬尺,再發(fā)送FIN報文給對方來表示你同意現(xiàn)在可以關(guān)閉連接了枚尼,故這里的ACK報文和FIN報文多數(shù)情況下都是分開發(fā)送的贴浙,也就造成了4次揮手。

握手署恍,揮手過程中各狀態(tài)介紹:
(1)3次握手過程狀態(tài):
  #LISTEN: 這個也是非常容易理解的一個狀態(tài)崎溃,表示服務(wù)器端的某個SOCKET處于監(jiān)聽狀態(tài),可以接受連接了。

SYN_SENT: 當客戶端SOCKET執(zhí)行CONNECT連接時,它首先發(fā)送SYN報文鸠真,因此也隨即它會進入到了SYN_SENT狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個報文囱修。SYN_SENT狀態(tài)表示客戶端已發(fā)送SYN報文。(發(fā)送端)

#SYN_RCVD: 這個狀態(tài)與SYN_SENT遙想呼應這個狀態(tài)表示接受到了SYN報文朵逝,在正常情況下,這個狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態(tài)乡范,很短暫配名,基本上用netstat你是很難看到這種狀態(tài)的,除非你特意寫了一個客戶端測試程序晋辆,故意將三次TCP握手過程中最后一個ACK報文不予發(fā)送渠脉。因此這種狀態(tài)時,當收到客戶端的ACK報文后瓶佳,它會進入到ESTABLISHED狀態(tài)芋膘。(服務(wù)器端)

ESTABLISHED:這個容易理解了,表示連接已經(jīng)建立了霸饲。

(2)4次揮手過程狀態(tài):
  #FIN_WAIT_1: 這個狀態(tài)要好好解釋一下为朋,其實FIN_WAIT_1和FIN_WAIT_2狀態(tài)的真正含義都是表示等待對方的FIN報文。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實際上是當SOCKET在ESTABLISHED狀態(tài)時厚脉,它想主動關(guān)閉連接习寸,向?qū)Ψ桨l(fā)送了FIN報文,此時該SOCKET即進入到FIN_WAIT_1狀態(tài)傻工。而當對方回應ACK報文后霞溪,則進入到FIN_WAIT_2狀態(tài),當然在實際的正常情況下中捆,無論對方何種情況下鸯匹,都應該馬上回應ACK報文,所以FIN_WAIT_1狀態(tài)一般是比較難見到的泄伪,而FIN_WAIT_2狀態(tài)還有時常撑古睿可以用netstat看到。(主動方)

#FIN_WAIT_2:上面已經(jīng)詳細解釋了這種狀態(tài)蟋滴,實際上FIN_WAIT_2狀態(tài)下的SOCKET科雳,表示半連接根蟹,也即有一方要求close連接,但另外還告訴對方糟秘,我暫時還有點數(shù)據(jù)需要傳送給你(ACK信息)简逮,稍后再關(guān)閉連接。(主動方)

#TIME_WAIT: 表示收到了對方的FIN報文尿赚,并發(fā)送出了ACK報文散庶,就等2MSL后即可回到CLOSED可用狀態(tài)了。如果FIN_WAIT_1狀態(tài)下凌净,收到了對方同時帶FIN標志和ACK標志的報文時悲龟,可以直接進入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)冰寻。(主動方)

CLOSING(比較少見): 這種狀態(tài)比較特殊须教,實際情況中應該是很少見,屬于一種比較罕見的例外狀態(tài)斩芭。正常情況下轻腺,當你發(fā)送FIN報文后,按理來說是應該先收到(或同時收到)對方的ACK報文划乖,再收到對方的FIN報文贬养。但是CLOSING狀態(tài)表示你發(fā)送FIN報文后,并沒有收到對方的ACK報文琴庵,反而卻也收到了對方的FIN報文误算。什么情況下會出現(xiàn)此種情況呢?其實細想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時close一個SOCKET的話迷殿,那么就出現(xiàn)了雙方同時發(fā)送FIN報文的情況儿礼,也即會出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接庆寺。

#CLOSE_WAIT: 這種狀態(tài)的含義其實是表示在等待關(guān)閉蜘犁。怎么理解呢?當對方close一個SOCKET后發(fā)送FIN報文給自己,你系統(tǒng)毫無疑問地會回應一個ACK報文給對方止邮,此時則進入到CLOSE_WAIT狀態(tài)这橙。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對方导披,如果沒有的話屈扎,那么你也就可以close這個SOCKET,發(fā)送FIN報文給對方撩匕,也即關(guān)閉連接鹰晨。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。(被動方)

LAST_ACK: 這個狀態(tài)還是比較容易好理解的模蜡,它是被動關(guān)閉一方在發(fā)送FIN報文后漠趁,最后等待對方的ACK報文。當收到ACK報文后忍疾,也即可以進入到CLOSED可用狀態(tài)了闯传。(被動方)

9、http和https的區(qū)別卤妒?

答:HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進行加密傳輸甥绿、身份認證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全则披。

HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協(xié)議共缕,與http主要區(qū)別在于:

http是超文本傳輸協(xié)議,信息是明文傳輸士复,https 則是具有安全性的ssl加密傳輸協(xié)議图谷;

http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,后者是443;

下面具體介紹一下HTTP和HTTPS協(xié)議:

首先說明一下:HTTP和HTTPS協(xié)議是應用層協(xié)議阱洪;

image

上圖充分表明:HTTP是應用層協(xié)議便贵,并且HTTPS是在HTTP協(xié)議基礎(chǔ)上添加SSL等加密策略后的協(xié)議;

TLS/SSL中使用了非對稱加密澄峰,對稱加密以及HASH算法嫉沽。

(1)Http協(xié)議

1)HTTP協(xié)議和TCP協(xié)議之間的區(qū)別聯(lián)系

①TPC/IP協(xié)議是傳輸層協(xié)議辟犀,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸俏竞,而HTTP是應用層協(xié)議,主要解決如何包裝數(shù)據(jù)堂竟;

②HTTP的默認端口號是80魂毁,TCP/IP協(xié)議通信編程時端口號需要自己指定(例如socket編程);

③HTTP協(xié)議是在TCP/IP協(xié)議基礎(chǔ)上實現(xiàn)的出嘹,即HTTP數(shù)據(jù)包是經(jīng)過TCP/IP協(xié)議實現(xiàn)傳輸?shù)模?/p>

④HTTP是無狀態(tài)的短連接協(xié)議席楚,TCP是有狀態(tài)的長連接協(xié)議;

HTTP是在有狀態(tài)長連接TCP/IP協(xié)議的基礎(chǔ)上實現(xiàn)的税稼,為什么卻是無狀態(tài)短連接協(xié)議烦秩?

答:因為HTTP協(xié)議每次請求結(jié)束就會自動關(guān)閉連接,這樣就變成了短連接郎仆;

短連接又導致了該次請求相關(guān)信息的丟失只祠,也就造成了HTTP協(xié)議對于前期事務(wù)處理沒有記憶能力,故為無狀態(tài)協(xié)議扰肌。

2)HTTP協(xié)議其完整的工作過程可分為四步:

①連接:首先客戶機與服務(wù)器需要建立連接(由TCP/IP握手連接實現(xiàn))抛寝。只要單擊某個超級鏈接,HTTP的工作開始;

②請求:建立連接后盗舰,客戶機發(fā)送一個請求給服務(wù)器晶府,請求方式的格式為:統(tǒng)一資源標識符(URL)、協(xié)議版本號钻趋,后邊是MIME信息包括請求修飾符川陆、客戶機信息和可能的內(nèi)容;

③應答:服務(wù)器接到請求后爷绘,給予相應的響應信息书劝,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號土至、一個成功或錯誤的代碼购对,后邊是MIME信息包括服務(wù)器信息、實體信息和可能的內(nèi)容陶因÷獍客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上;

④關(guān)閉:當應答結(jié)束后楷扬,瀏覽器和服務(wù)器關(guān)閉連接解幽,以保證其他瀏覽器可以與服務(wù)器進行連接。

更完整的過程可能如下

域名解析 --> 發(fā)起TCP的3次握手 --> 建立TCP連接后發(fā)起http請求 --> 服務(wù)器響應http請求烘苹,瀏覽器得到html代碼 --> 瀏覽器解析html代碼躲株,并請求html代碼中的資源(如js、css镣衡、圖片等) --> 瀏覽器對頁面進行渲染呈現(xiàn)給用戶霜定。

   如果在以上過程中的某一步出現(xiàn)錯誤,那么產(chǎn)生錯誤的信息將返回到客戶端廊鸥,有顯示屏輸出望浩。對于用戶來說,這些過程是由HTTP自己完成的惰说,用戶只要用鼠標點擊磨德,等待信息顯示就可以了。

(2)Https協(xié)議

HTTPS握手過程包括五步:

1)瀏覽器請求連接吆视;

2)服務(wù)器返回證書:證書里面包含了網(wǎng)站地址典挑,加密公鑰,以及證書的頒發(fā)機構(gòu)等信息啦吧。

3)瀏覽器收到證書后作以下工作:

a) 驗證證書的合法性您觉;

b) 生成隨機(對稱)密碼,取出證書中提供的**公鑰**對隨機密碼加密丰滑;

c) 將之前生成的加密隨機密碼等信息發(fā)送給網(wǎng)站顾犹;

4)服務(wù)器收到消息后作以下的操作:

a) 使用自己的**私鑰**解密瀏覽器用公鑰加密后的消息倒庵,并驗證HASH是否與瀏覽器發(fā)來的一致;

b) 使用加密的隨機對稱密碼加密一段消息炫刷,發(fā)送給瀏覽器擎宝;

5)瀏覽器解密并計算握手消息的HASH:如果與服務(wù)端發(fā)來的HASH一致,此時握手過程結(jié)束浑玛,之后所有的通信數(shù)據(jù)將由之前瀏覽

器生成的隨機密碼并利用對稱加密算法進行加密绍申。

注意:服務(wù)器有兩個密鑰,一個公鑰顾彰、一個私鑰极阅,只有私鑰才可以解密公鑰加密的消息;

如圖:

image

或者如下圖:

image

HTTPS協(xié)議涨享、SSL筋搏、和數(shù)字證書的關(guān)系介紹:

概述:對于HTTPS協(xié)議,所有的消息都是經(jīng)過SSL協(xié)議方式加密厕隧,而支持加密的文件正是數(shù)字證書奔脐;

(1)SSL

SSL常用的加密算法:對稱密碼算法、非對稱密碼算法吁讨、散列算法髓迎;

SSL的加密過程:需要注意的是非對稱加解密算法的效率要比對稱加解密要低的多。所以SSL在握手過程中使用非對稱密碼算法來

協(xié)商密鑰建丧,實際使用對稱加解密的方法對http內(nèi)容加密傳輸排龄;

(2)數(shù)字證書

數(shù)字證書是用于在INTERNET上標識個人或者機構(gòu)身份的一種技術(shù)手段,它通過由一些公認的權(quán)威機構(gòu)所認證翎朱,從而可以保證其

安全地被應用在各種場合橄维。證書里面包含了網(wǎng)站地址,加密公鑰闭翩,以及證書的頒發(fā)機構(gòu)等信息挣郭。

10迄埃、虛擬內(nèi)存的概念與介紹

答:虛擬內(nèi)存中疗韵,允許將一個作業(yè)分多次調(diào)入內(nèi)存,需要時就調(diào)入侄非,不需要的就先放在外存蕉汪。因此,虛擬內(nèi)存的實需要建立在離散

分配的內(nèi)存管理方式的基礎(chǔ)上逞怨。虛擬內(nèi)存的實現(xiàn)有以下三種方式:

請求分頁存儲管理

請求分段存儲管理

請求段頁式存儲管理

虛擬內(nèi)存的意義:

一者疤,虛擬內(nèi)存可以使得物理內(nèi)存更加高效。虛擬內(nèi)存使用置換方式叠赦,需要的頁就置換進來驹马,不需要的置換出去革砸,使得內(nèi)存中只保存了需要的頁,提高了利用率糯累,也避免了不必要的寫入與擦除算利;

二,使用虛擬地址可以使內(nèi)存的管理更加便捷泳姐。在程序編譯的時候就會生成虛擬地址效拭,該虛擬地址并不是對應一個物理地址,使得也就極大地減少了地址被占用的沖突胖秒,減少管理難度缎患;

三,為了安全性的考慮阎肝。在使用虛擬地址的時候挤渔,暴露給程序員永遠都是虛擬地址,而具體的物理地址在哪里风题,這個只有系統(tǒng)才了解蚂蕴。這樣就提

高了系統(tǒng)的封裝性。

11俯邓、單鏈表的反轉(zhuǎn)算法

答:思想:創(chuàng)建3個指針骡楼,分別指向上一個節(jié)點、當前節(jié)點稽鞭、下一個節(jié)點鸟整,遍歷整個鏈表的同時,將正在訪問的節(jié)點指向上一個節(jié)點朦蕴,當遍歷結(jié)束后篮条,就同時完成了鏈表的反轉(zhuǎn)。

實現(xiàn)代碼:

[cpp] view plain copy

<embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_1" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. ListNode* ReverseList(ListNode* pHead) {
  2. ListNode p,q,*r;
  3. if(pHead==NULL || pHead->next==NULL){
  4. return pHead;
  5. }else{
  6. p=pHead;
  7. q=p->next;
  8. pHead->next=NULL;
  9. while(q!=NULL){
  10. r=q->next;
  11. q->next=p;
  12. p=q;
  13. q=r;
  14. }
  15. return p;
  16. }
  17. }

12吩抓、紅黑樹以及其查找復雜度

答:(1)紅黑樹來源于二叉搜索樹涉茧,其在關(guān)聯(lián)容器如map中應用廣泛,主要優(yōu)勢在于其查找疹娶、刪除伴栓、插入時間復雜度小,但其也有缺點雨饺,就是容易偏向一邊而變成一個鏈表钳垮。

紅黑樹是一種二叉查找樹,但在每個結(jié)點上增加一個存儲位表示結(jié)點的顏色额港,可以是Red或Black饺窿。也就是說,紅黑樹是在二叉

查找樹基礎(chǔ)上進一步實現(xiàn)的移斩;

紅黑樹的五個性質(zhì):

性質(zhì)1. 節(jié)點是紅色或黑色肚医;

性質(zhì)2. 根節(jié)點是黑色绢馍;

性質(zhì)3 每個葉節(jié)點(指樹的末端的NIL指針節(jié)點或者空節(jié)點)是黑色的;

性質(zhì)4 每個紅色節(jié)點的兩個子節(jié)點都是黑色肠套。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色節(jié)點)痕貌;

性質(zhì)5. 從任一節(jié)點到其每個尾端NIL節(jié)點或者NULL節(jié)點的所有路徑都包含相同數(shù)目的黑色節(jié)點。

(注:上述第3糠排、5點性質(zhì)中所說的NIL或者NULL結(jié)點舵稠,并不包含數(shù)據(jù),只充當樹的路徑結(jié)束的標志入宦,即此葉結(jié)點非常見的葉子結(jié)點)哺徊。

image

因為一棵由n個結(jié)點隨機構(gòu)造的二叉查找樹的高度為lgn,所以順理成章乾闰,二叉查找樹的一般操作的執(zhí)行時間為O(lgn)落追。但二叉查

找樹若退化成了一棵具有n個結(jié)點的線性鏈后,則這些操作最壞情況運行時間為O(n)涯肩;

紅黑樹雖然本質(zhì)上是一棵二叉查找樹轿钠,但它在二叉查找樹的基礎(chǔ)上增加以上五個性質(zhì)使得紅黑樹相對平衡,從而保證了

紅黑樹的查找病苗、插入疗垛、刪除的時間復雜度最壞為O(log n)

(2)左旋右旋

紅黑樹插入或刪除后硫朦,一般就會改變紅黑樹的特性贷腕,要恢復紅黑樹上述5個性質(zhì),一般都要那就要做2方面的工作:

1咬展、部分結(jié)點顏色泽裳,重新著色

2、調(diào)整部分指針的指向破婆,即左旋涮总、右旋。

左選右旋如圖所示:

image

左旋祷舀,如圖所示(左->右)瀑梗,以x->y之間的鏈為“支軸”進行,使y成為該新子樹的根蔑鹦,x成為y的左孩子夺克,而y的左孩子則成為x的右孩

子箕宙。算法很簡單嚎朽,旋轉(zhuǎn)后各個結(jié)點從左往右,仍然都是從小到大柬帕。

左旋代碼實現(xiàn)哟忍,分三步:
(1) 開始變化狡门,y的左孩子成為x的右孩子;
(2) y成為x的父結(jié)點锅很;
(3) x成為y的左孩子其馏;

右旋類似,不再累述爆安;

13叛复、KPM字符串匹配

(1)KMP匹配算法代碼實現(xiàn):

[cpp] view plain copy

<embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_2" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. int KmpSearch(char* s, char* p)
  2. {
  3. int i = 0;
  4. int j = 0;
  5. int sLen = strlen(s);
  6. int pLen = strlen(p);
  7. while (i < sLen && j < pLen)
  8. {
  9. //①如果j = -1,或者當前字符匹配成功(即S[i] == P[j])扔仓,都令i++褐奥,j++
  10. if (j == -1 || s[i] == p[j])
  11. {
  12. i++;
  13. j++;
  14. }
  15. else
  16. {
  17. //②如果j != -1,且當前字符匹配失斍檀亍(即S[i] != P[j])撬码,則令 i 不變,j = next[j]
  18. //next[j]即為j所對應的next值
  19. j = next[j];
  20. }
  21. }
  22. if (j == pLen)
  23. return i - j;
  24. else
  25. return -1;
  26. }

(2)next數(shù)組求取
上述(1)中最重要的就是:一旦不匹配版保,模式串不是向后移動一位呜笑,而是根據(jù)前面匹配信息移動多位。而這個多位獲得就是根據(jù)next數(shù)組彻犁,下面有next數(shù)組的求取方式:
Next數(shù)組是根據(jù)模式串的前綴后綴獲取的叫胁,如下:
①尋找前綴后綴最長公共元素長度
舉個例子,如果給定的模式串為“abab”汞幢,那么它的各個子串的前綴后綴的公共元素的最大長度如下表格所示:

image

比如對于字符串a(chǎn)ba來說曹抬,它有長度為1的相同前綴后綴a;而對于字符串a(chǎn)bab來說急鳄,它有長度為2的相同前綴后綴ab(相同前綴后綴的長度為k + 1谤民,k + 1 = 2)。

②求next數(shù)組
next 數(shù)組考慮的是除當前字符外的最長相同前綴后綴疾宏,所以通過第①步驟求得各個前綴后綴的公共元素的最大長度后张足,只要稍作變形即可:將第①步驟中求得的數(shù)組整體右移一位,然后第一個元素賦為-1即可(注意:字符串下標需要從0開始)坎藐,如下表格所示:

image

比如對于aba來說为牍,第3個字符a之前的字符串a(chǎn)b中有長度為0的相同前綴后綴,所以第3個字符a對應的next值為0岩馍;而對于abab來說碉咆,第4個字符b之前的字符串a(chǎn)ba中有長度為1的相同前綴后綴a,所以第4個字符b對應的next值為1(相同前綴后綴的長度為k蛀恩,k = 1)疫铜。

KMP的next 數(shù)組相當于告訴我們:當模式串中的某個字符跟文本串中的某個字符匹配失配時,模式串下一步應該跳到哪個位置(具體:保持測試串的下標i不變双谆,使得匹配串的下標j=next[j])。

前綴后綴長度求取以及next數(shù)組獲取:

如果給定的模式串是:“ABCDABD”注祖,從左至右遍歷整個模式串,其各個子串的前綴后綴分別如下表格所示:

image

也就是說幌羞,原模式串子串對應的各個前綴后綴的公共元素的最大長度表為:

0 0 0 0 1 2 0;

故對應的next數(shù)組為:-1 0 0 0 0 1 2竟稳;

(注意:這里的字符串下標是從0開始的属桦,若從1開始,next數(shù)組所有元素都對應要加1他爸。)

求取next的實現(xiàn)代碼:

[cpp] view plain copy

<embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" name="ZeroClipboardMovie_3" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent" width="16" height="16" align="middle">

  1. string T; //T為模式串

  2. cin>>T;

  3. int len=T.size();

  4. queue<int> MaxLen;

  5. vector<int> next;

  6. MaxLen.push(0); //第一個元素都設(shè)為0

  7. for(int i=1;i<len;i++)

  8. {

  9. int k=1,maxLen=0;

  10. while(k<=i)

  11. {

  12. if(T.substr(0,k)==T.substr(i-k+1,k))

  13. {

  14. maxLen=k;

  15. }

  16. k++;

  17. }

  18. MaxLen.push(maxLen);

  19. }

  20. cout<<endl;

  21. next.push_back(-1); //第一個元素都設(shè)為-1

  22. while(MaxLen.size()>1)

  23. {

  24. int temp=MaxLen.front();

  25. next.push_back(temp);

  26. MaxLen.pop();

  27. cout<<temp<<' ';

  28. }

14地啰、TCP超時等待、重傳以及流量控制

答:TCP等待時間需要設(shè)定讲逛,超過了就認為丟包亏吝,需要重傳;

為了防止擁塞情況盏混,一般會采用流量控制蔚鸥,其實現(xiàn)手段是用滑動窗口限制客戶端發(fā)送分組數(shù)量;

15许赃、數(shù)據(jù)庫引擎

答:數(shù)據(jù)庫引擎是用于存儲止喷、處理和保護數(shù)據(jù)的核心服務(wù)。利用數(shù)據(jù)庫引擎可控制訪問權(quán)限并快速處理事務(wù)混聊,從而滿足企業(yè)內(nèi)大多

數(shù)需要處理大量數(shù)據(jù)的應用程序的要求弹谁。

簡言之,數(shù)據(jù)庫引擎就是一段用于支撐所有數(shù)據(jù)庫操作的核心程序句喜,就如名稱一樣预愤,是一個車的引擎功能;

常見的數(shù)據(jù)庫引擎有:

(1)Microsoft JET (Joint Engineering Technologe) 用于Access和VB的內(nèi)嵌數(shù)據(jù)庫功能的核心元素咳胃;

(2)ODBC(Open DataBase Connectivity植康,開放數(shù)據(jù)庫互連)是由Microsoft定義的一種數(shù)據(jù)庫訪問標準,它提供一種標準的數(shù)據(jù)

庫訪問方法以訪問不同平臺的數(shù)據(jù)庫展懈。一個ODBC應用程序既可以訪問在本地PC機上的數(shù)據(jù)庫销睁,也可以訪問多種異構(gòu)平臺上的數(shù)據(jù)

庫,例如SQL Server存崖、Oracle或者DB2冻记;

(3)OLE DB是Microsoft開發(fā)的最新數(shù)據(jù)庫訪問接口,Microsoft將其定義為ODBC接班人来惧;

(4)MYSQL支持三個引擎:ISAM冗栗、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB)也常常可以使用贞瞒;

①ISAM執(zhí)行讀取操作的速度很快偶房,而且不占用大量的內(nèi)存和存儲資源趁曼。ISAM的兩個主要不足之處在于军浆,它不 支持事務(wù)處理,也不能夠容錯挡闰;

②MyISAM是MySQL的ISAM擴展格式和缺省的數(shù)據(jù)庫引擎MYISAM乒融。除了提供ISAM里所沒有的索引和字段管理的大量功能,

MyISAM還使用一種表格鎖定的機制摄悯,來優(yōu)化多個并發(fā)的讀寫操作赞季,其代價是你需要經(jīng)常運行OPTIMIZE TABLE命令,來恢復被更新

機制所浪費的空間奢驯;

③HEAP允許只駐留在內(nèi)存里的臨時表格申钩。駐留在內(nèi)存里讓HEAP要比ISAM和MYISAM都快,但是它所管理的數(shù)據(jù)是不穩(wěn)定的瘪阁,

而且如果在關(guān)機之前沒有進行保存撒遣,那么所有的數(shù)據(jù)都會丟失。

16管跺、數(shù)據(jù)庫索引

答:定義:數(shù)據(jù)庫索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu)义黎,使用索引可快速訪問數(shù)據(jù)庫表中的特定信息;

舉例:employee 表的人員編號列(id)就是數(shù)據(jù)庫索引豁跑,select * from employee where id=10000即可查找編號10000的人員信息廉涕。如果沒有索引,必須遍歷整個表直到id=10000艇拍;

數(shù)據(jù)庫索引作用:

一狐蜕,大大加快 數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因卸夕;
二馏鹤,保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性;
三娇哆,可以加速表和表之間的連接湃累,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義;
四碍讨,在使用分組和排序子句進行數(shù)據(jù)檢索時治力,同樣可以顯著減少查詢中分組和排序的時間;
五勃黍,通過使用索引宵统,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能马澈。

數(shù)據(jù)庫索引缺陷:

一瓢省,表的增刪改查、創(chuàng)建索引和維護索引要耗費時間痊班;
二勤婚,索引需要占物理空間;

數(shù)據(jù)庫索引的兩個特征:索引有兩個特征涤伐,即唯一性索引和復合索引馒胆;

①唯一 性索引保證在索引列中的全部數(shù)據(jù)是唯一的,不會包含冗余數(shù)據(jù)凝果;

②復合索引就是一個索引創(chuàng)建在兩個列或者多個列上祝迂,搜索時需要兩個或者多個索引列作為一個關(guān)鍵值;

數(shù)據(jù)庫索引好比是一本書前面的目錄器净,索引分為聚簇索引和非聚簇索引兩類:

1)聚簇索引是按照數(shù)據(jù)存放的物理位置為順序的型雳,其多個連續(xù)行的訪問速度更快;

2)非聚簇索引是按照數(shù)據(jù)存放的邏輯位置為順序的山害,其單行訪問速度更快纠俭;

局部性原理與磁盤預讀

局部性原理:當一個數(shù)據(jù)被用到時,其附近的數(shù)據(jù)也通常會馬上被使用粗恢。程序運行期間所需要的數(shù)據(jù)通常比較集中柑晒;

磁盤預讀:正是由于局部性原理以及數(shù)據(jù)存儲磁盤的讀寫速度慢的原因,每次對數(shù)據(jù)庫進行讀取都不是按需讀取眷射,而是讀取多

于需求數(shù)據(jù)區(qū)域內(nèi)的數(shù)據(jù)到內(nèi)存匙赞,用于后續(xù)使用,提高寫讀取數(shù)據(jù)速度妖碉;

注:磁盤預讀一般都是每次讀取邏輯上的一頁涌庭,或物理上的一塊,不管實際需求是多少欧宜;

數(shù)據(jù)庫索引的實現(xiàn)通常使用B樹及其變種B+樹坐榆,下面進行B-/+Tree結(jié)構(gòu)的數(shù)據(jù)庫索引的性能分析

(1)B樹索引結(jié)構(gòu):

數(shù)據(jù)庫系統(tǒng)的設(shè)計者巧妙利用了磁盤預讀原理,將B樹的一個節(jié)點的大小設(shè)為等于一個頁冗茸,這樣每個節(jié)點只需要一次I/O就可以

完全載入席镀。為了達到這個目的,在實際實現(xiàn)B-Tree還需要使用如下技巧:

——每次新建節(jié)點時夏漱,直接申請一個頁的空間豪诲,這樣就保證一個節(jié)點物理上也存儲在一個頁;

B-Tree中一次檢索最多需要h-1次I/O(磁盤IO不包括根節(jié)點挂绰,因為根節(jié)點常駐內(nèi)存)屎篱,漸進復雜度為O(h)=O(logdN)。

般實際應用中,出度d是非常大的數(shù)字交播,通常超過100重虑,因此h非常小(通常不超過3)秦士。

而紅黑樹這種結(jié)構(gòu)缺厉,h明顯要深的多。由于邏輯上很近的節(jié)點(父子)物理上可能很遠伍宦,無法利用局部性芽死,所以紅黑樹的I/O漸進

復雜度也為O(h)乏梁,效率明顯比B-Tree差很多次洼。

所以,B樹結(jié)構(gòu)的數(shù)據(jù)庫索引遇骑,在元素查找上效率很高卖毁;

(2)B+樹的索引結(jié)構(gòu):

B+樹則適當犧牲檢索的時間復雜度(都必須檢索到葉子結(jié)點),但改善了節(jié)點插入和刪除的時間復雜度(類似用鏈表改善數(shù)組的效

果)落萎,所以B+樹屬于一種折中選擇亥啦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市练链,隨后出現(xiàn)的幾起案子翔脱,更是在濱河造成了極大的恐慌,老刑警劉巖媒鼓,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届吁,死亡現(xiàn)場離奇詭異,居然都是意外死亡绿鸣,警方通過查閱死者的電腦和手機疚沐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潮模,“玉大人亮蛔,你說我怎么就攤上這事∏嫦幔” “怎么了究流?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長动遭。 經(jīng)常有香客問我芬探,道長,這世上最難降的妖魔是什么沽损? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任灯节,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炎疆。我一直安慰自己卡骂,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布形入。 她就那樣靜靜地躺著全跨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亿遂。 梳的紋絲不亂的頭發(fā)上浓若,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音蛇数,去河邊找鬼挪钓。 笑死,一個胖子當著我的面吹牛耳舅,可吹牛的內(nèi)容都是我干的碌上。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼浦徊,長吁一口氣:“原來是場噩夢啊……” “哼馏予!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盔性,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤霞丧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冕香,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛹尝,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年暂筝,在試婚紗的時候發(fā)現(xiàn)自己被綠了箩言。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡焕襟,死狀恐怖陨收,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸵赖,我是刑警寧澤务漩,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站它褪,受9級特大地震影響饵骨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茫打,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一居触、第九天 我趴在偏房一處隱蔽的房頂上張望妖混。 院中可真熱鬧,春花似錦轮洋、人聲如沸制市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祥楣。三九已至,卻和暖如春汉柒,著一層夾襖步出監(jiān)牢的瞬間误褪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工碾褂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兽间,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓斋扰,卻偏偏與公主長得像渡八,于是被迫代替她去往敵國和親啃洋。 傳聞我的和親對象是個殘疾皇子传货,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習到現(xiàn)在,面了一些公司宏娄,掛了不少问裕,但最終還是拿到小米、百度孵坚、阿里粮宛、京東、新浪卖宠、CVTE巍杈、樂視家的研發(fā)崗...
    時芥藍閱讀 42,209評論 11 349
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,821評論 24 176
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)扛伍、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)筷畦、lso...
    北辰青閱讀 9,410評論 0 11
  • 經(jīng)常會出去參加一些學習和培訓,因為都是自己主動花錢出去的刺洒,所以每次培訓其實都很享受鳖宾,并沒有覺得很痛苦。這次...
    燕妮老師說閱讀 1,168評論 0 1
  • 晚上醒來睡不著逆航,就會漫無目的地看地圖軟件鼎文。并非找路或找飯館,而是觀摩我身處其中的世界因俐,這巨大拇惋、細密周偎、無法被撼動的現(xiàn)...
    ve_故食閱讀 633評論 0 2