網絡(總結)

彙總---網絡

@(彙總)[網絡, 彙總]css

HTTP

http協議

1.HTTP是計算機經過網絡進行通訊的規則
2.HTTP是一種無狀態的協議(不創建持久的鏈接,服務端不保留鏈接的相關信息,瀏覽器發出請求和服務器返回響應是一個沒有記憶的過程)html

解釋http協議的頭部的各個屬性是什麼

HTTP 請求頭裏面都有些啥/哪些字段?

Alt text

Allow:服務器支持哪些請求方法(如GET、POST等)。
Content-Encoding:文檔的編碼(Encode)方法。
Content-Length:表示內容長度。
Content-Type:表示後面的文檔屬於什麼MIME類型。
Date:當前的GMT時間。
Expires:應該在何時認爲文檔通過期,從而再也不緩存它?
Last-Modified:文檔的最後改動時間。
Location:表示客戶應當到哪裏去提取文檔。
Refresh:表示瀏覽器應該在多少時間以後刷新文檔,以秒計。
Server:客戶應該在Authorization頭中提供什麼類型的受權信息?
Set-Cookie:設置和頁面關聯的Cookie。
WWW-Authenticate:客戶應該在Authorization頭中提供什麼類型的受權信息?mysql

http請求頭,請求體,cookie在哪一個裏面?url在哪裏面

http響應頭裏面有些什麼

Alt text

響應頭與請求頭總結

請求頭:
Accept: text/html,image/*(瀏覽器能夠接收的類型)
Accept-Charset: ISO-8859-1(瀏覽器能夠接收的編碼類型)
Accept-Encoding: gzip,compress(瀏覽器能夠接收壓縮編碼類型)
Accept-Language: en-us,zh-cn(瀏覽器能夠接收的語言和國家類型)
Host: www.it315.org:80(瀏覽器請求的主機和端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT(某個頁面緩存時間)
Referer: http://www.it315.org/index.jsp(請求來自於哪一個頁面)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)(瀏覽器相關信息)
Cookie:(瀏覽器暫存服務器發送的信息)
Connection: close(1.0)/Keep-Alive(1.1)(HTTP請求的版本的特色)
Date: Tue, 11 Jul 2000 18:23:51 GMT(請求網站的時間)linux

響應頭:
Location: http://www.it315.org/index.jsp(控制瀏覽器顯示哪一個頁面)
Server:apache tomcat(服務器的類型)
Content-Encoding: gzip(服務器發送的壓縮編碼方式)
Content-Length: 80(服務器發送顯示的字節碼長度)
Content-Language: zh-cn(服務器發送內容的語言和國家名)
Content-Type: image/jpeg; charset=UTF-8(服務器發送內容的類型和編碼類型)
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT(服務器最後一次修改的時間)
Refresh: 1;url=http://www.it315.org(控制瀏覽器1秒鐘後轉發URL所指向的頁面)
Content-Disposition: attachment; filename=aaa.jpg(服務器控制瀏覽器發下載方式打開文件)
Transfer-Encoding: chunked(服務器分塊傳遞數據到客戶端)
Set-Cookie:SS=Q0=5Lb_nQ; path=/search(服務器發送Cookie相關的信息)
Expires: -1(服務器控制瀏覽器不要緩存網頁,默認是緩存)
Cache-Control: no-cache(服務器控制瀏覽器不要緩存網頁)
Pragma: no-cache(服務器控制瀏覽器不要緩存網頁)
Connection: close/Keep-Alive(HTTP請求的版本的特色)
Date: Tue, 11 Jul 2000 18:23:51 GMT(響應網站的時間)ios

http緩存控制;

HTTP頭中哪些是和緩存相關的

http1.1協議報文首部字段中與緩存相關的字段程序員

1.通用首部字段
Cache-Control:控制緩存的行爲
Pragma:值爲no-cache時禁用緩存es6

2.請求首部字段
If-Match:比較ETag是否一致
If-None-Match:比較ETag是否不一致
If-Modified-Since:比較資源最後更新的時間是否一致
If-Unmondified-Since:比較資源最後更新的時間是否不一致面試

3.響應首部字段
ETag:資源的匹配信息算法

4.實體首部字段
Expires:實體主體過時的時間
Last-Modified:資源最後一次修改的時間sql

網絡分層結構。

  • OSI分層 (7層):
    物理層、數據鏈路層、網絡層、應用層、傳輸層、會話層、表示層。

五層協議(5層):
物理層、數據鏈路層、網絡層、應用層、運輸層。

  • TCP/IP分層(4層):
    網絡接口層、 網際層、運輸層、 應用層。

  • 每一層的協議以下:
    物理層:RJ4五、CLOCK、IEEE802.3 (中繼器,集線器,網關)
    數據鏈路:PPP、FR、HDLC、VLAN、MAC (網橋,交換機)
    網絡層:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
    傳輸層:TCP、UDP、SPX
    會話層:NFS、SQL、NETBIOS、RPC
    表示層:JPEG、MPEG、ASII
    應用層:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS

  • 每一層的做用以下:
    物理層:經過媒介傳輸比特,肯定機械及電氣規範(比特Bit)
    數據鏈路層:將比特組裝成幀和點到點的傳遞(幀Frame)
    網絡層:負責數據包從源到宿的傳遞和網際互連(包PackeT)
    傳輸層:提供端到端的可靠報文傳遞和錯誤恢復(段Segment)
    會話層:創建、管理和終止會話(會話協議數據單元SPDU)
    表示層:對數據進行翻譯、加密和壓縮(表示協議數據單元PPDU)
    應用層:容許訪問OSI環境的手段(應用協議數據單元APDU)

HTTP,TCP,UDP分別在哪些層

HTTP(超文本傳輸協議):應用層
TCP(傳輸控制協議):傳輸層
UDP(用戶數據報協議):傳輸層

tcp/udp區別

TCP提供面向鏈接的、可靠的數據流傳輸;傳輸單位稱爲TCP報文段;TCP注重數據安全性

UDP提供的是非面向鏈接的、不可靠的數據流傳輸;傳輸單位稱爲用戶數據報;UDP數據傳輸快,由於不須要鏈接等待,少了許多操做,可是其安全性卻通常。

TCP對應的協議和UDP對應的協議
TCP對應的協議:
(1) FTP:定義了文件傳輸協議,使用21端口。
(2) Telnet:一種用於遠程登錄的端口,使用23端口,用戶能夠以本身的身份遠程鏈接到計算機上,可提供基於DOS模式下的通訊服務。
(3) SMTP:郵件傳送協議,用於發送郵件。服務器開放的是25號端口。
(4) POP3:它是和SMTP對應,POP3用於接收郵件。POP3協議所用的是110端口。
(5)HTTP:是從Web服務器傳輸超文本到本地瀏覽器的傳送協議。
UDP對應的協議:
(1) DNS:用於域名解析服務,將域名地址轉換爲IP地址。DNS用的是53號端口。
(2) SNMP:簡單網絡管理協議,使用161號端口,是用來管理網絡設備的。因爲網絡設備不少,無鏈接的服務就體現出其優點。
(3) TFTP(Trival File Tran敏感詞er Protocal),簡單文件傳輸協議,該協議在熟知端口69上使用UDP服務。

當你訪問一個網站時,會用到哪些協議?

在和服務器創建鏈接時,用的是 TCP 仍是 UDP?

在地址欄輸入url中間會經歷什麼

  • 首先在電腦中查找目標主機。若是本地 DNS 緩存存在,它使用該信息。不然,執行 DNS 查詢,直到 IP 地址被發現。
  • 而後,瀏覽器打開一個 TCP 鏈接到目標主機,並將根據 HTTP 1.1 的請求服務器查找所需的資源,並使用 HTTP 協議的響應,將數據發送到瀏覽器。
  • 而後瀏覽器使用 HTML 解析器來從新建立這就是後來提交給你在屏幕上的文檔結構。若是發現給外部資源,例如圖片, CSS 文件,JavaScript 文件的引用,這些被傳遞的方式做爲 HTML 文檔自己相同。
    (後面可能會設計到瀏覽器渲染問題)

瀏覽器的渲染過程

  1. 瀏覽器會將HTML解析成一個DOM樹。
  2. 將CSS解析成 CSS Rule Tree 。
  3. 根據DOM樹和CSSOM(CSS對象模型)來構造 Rendering Tree。
  4. 有了Render Tree,瀏覽器已經能知道網頁中有哪些節點、各個節點的CSS定義以及他們的從屬關係,而後計算出每一個節點在屏幕中的位置。
  5. 再下一步就是繪製,即遍歷render樹,繪製每一個節點。

PS:html頁面加載和解析的流程

  1. 用戶輸入網址,瀏覽器向服務器發出請
    求,服務器返回html文件;
  2. 瀏覽器開始載入html代碼,發現<head>標籤內有一個<link>標籤引用外部CSS文件;
  3. 瀏覽器又發出CSS文件的請求,服務器返回這個CSS文件;
  4. 瀏覽器繼續載入html中<body>部分的代碼,而且CSS文件已經拿到手了,能夠開始渲染頁面了;
  5. 瀏覽器在代碼中發現一個<img>標籤引用了一張圖片,向服務器發出請求。此時瀏覽器不會等到圖片下載完,而是繼續渲染後面的代碼;
  6. 服務器返回圖片文件,因爲圖片佔用了必定面積,影響了後面段落的排布,所以瀏覽器須要回過頭來從新渲染這部分代碼;
  7. 瀏覽器發現了一個包含一行Javascript代碼的<script>標籤,趕快運行它;
  8. Javascript腳本執行了這條語句,它命令瀏覽器隱藏掉代碼中的某個<div>(style.display=」none」)。忽然少了這麼一個元素,瀏覽器不得不從新渲染這部分代碼;
  9. 終於等到了</html>的到來,瀏覽器淚流滿面……
  10. 等等,還沒完,用戶點了一下界面中的「換膚」按鈕,Javascript讓瀏覽器換了一下<
    link>標籤的CSS路徑;
  11. 瀏覽器召集了在座的各位<div><span><ul><li>們,「大夥兒收拾收拾行李,咱
    得從新來過……」,瀏覽器向服務器請求了新的CSS文件,從新渲染頁面。

幾個重要的概念:
(1)Reflow(迴流):瀏覽器要花時間去渲染,當它發現了某個部分發生了變化影響了布
局,那就須要倒回去從新渲染。
(2)Repaint(重繪):若是隻是改變了某個元素的背景顏色,文字顏色等,不影響元素周
圍或內部佈局的屬性,將只會引發瀏覽器的repaint,重畫某一部分。 Reflow要比Repaint更
花費時間,也就更影響性能。因此在寫代碼的時候,要儘可能避免過多的Reflow。

reflow的緣由:
(1)頁面初始化的時候;
(2)操做DOM時;
(3)某些元素的尺寸變了;
(4)若是 CSS 的屬性發生變化了。

減小 reflow/repaint:
 (1)不要一條一條地修改 DOM 的樣式。與其這樣,還不如預先定義好 css 的 class,然
後修改 DOM 的 className。  
 (2)不要把 DOM 結點的屬性值放在一個循環裏當成循環裏的變量。
 (3)爲動畫的 HTML 元件使用 fixed 或 absoult 的 position,那麼修改他們的 CSS 是不
會 reflow 的。
 (4)千萬不要使用 table 佈局。由於可能很小的一個小改動會形成整個 table 的從新布
局。

http2懂多少

(真懂不了不少,由於沒有怎麼實踐過,我直接說了本身的理解)
HTTP 2.0與HTTP 1.1區別
一、什麼是HTTP 2.0
HTTP/2(超文本傳輸協議第2版,最初命名爲HTTP 2.0),是HTTP協議的的第二個主要版本,使用於萬維網。HTTP/2是HTTP協議自1999年HTTP 1.1發佈後的首個更新,主要基於SPDY協議(是Google開發的基於TCP的應用層協議,用以最小化網絡延遲,提高網絡速度,優化用戶的網絡使用體驗)。

二、與HTTP 1.1相比,主要區別包括

  1. HTTP/2採用二進制格式而非文本格式
  2. HTTP/2是徹底多路複用的,而非有序並阻塞的——只需一個鏈接便可實現並行
  3. 使用報頭壓縮,HTTP/2下降了開銷
  4. HTTP/2讓服務器能夠將響應主動「推送」到客戶端緩存中

三、HTTP/2爲何是二進制?
比起像HTTP/1.x這樣的文本協議,二進制協議解析起來更高效、「線上」更緊湊,更重要的是錯誤更少。

四、爲何 HTTP/2 須要多路傳輸?
HTTP/1.x 有個問題叫線端阻塞(head-of-line blocking), 它是指一個鏈接(connection)一次只提交一個請求的效率比較高, 多了就會變慢。 HTTP/1.1 試過用流水線(pipelining)來解決這個問題, 可是效果並不理想(數據量較大或者速度較慢的響應, 會阻礙排在他後面的請求). 此外, 因爲網絡媒介(intermediary )和服務器不能很好的支持流水線, 致使部署起來困難重重。而多路傳輸(Multiplexing)能很好的解決這些問題, 由於它能同時處理多個消息的請求和響應; 甚至能夠在傳輸過程當中將一個消息跟另一個摻雜在一塊兒。因此客戶端只須要一個鏈接就能加載一個頁面。
五、消息頭爲何須要壓縮?
假定一個頁面有80個資源須要加載(這個數量對於今天的Web而言仍是挺保守的), 而每一次請求都有1400字節的消息頭(着一樣也並很多見,由於Cookie和引用等東西的存在), 至少要7到8個來回去「在線」得到這些消息頭。這還不包括響應時間——那只是從客戶端那裏獲取到它們所花的時間而已。這全都因爲TCP的慢啓動機制,它會基於對已知有多少個包,來肯定還要來回去獲取哪些包 – 這很明顯的限制了最初的幾個來回能夠發送的數據包的數量。相比之下,即便是頭部輕微的壓縮也能夠是讓那些請求只需一個來回就能搞定——有時候甚至一個包就能夠了。這種開銷是能夠被節省下來的,特別是當你考慮移動客戶端應用的時候,即便是良好條件下,通常也會看到幾百毫秒的來回延遲。
六、服務器推送的好處是什麼?
當瀏覽器請求一個網頁時,服務器將會發回HTML,在服務器開始發送JavaScript、圖片和CSS前,服務器須要等待瀏覽器解析HTML和發送全部內嵌資源的請求。服務器推送服務經過「推送」那些它認爲客戶端將會須要的內容到客戶端的緩存中,以此來避免往返的延遲。

三次握手&四次揮手

三次握手
第一次握手:客戶端發送syn包到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,確認客戶的SYN,同時本身也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK,此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

四次揮手
與創建鏈接的「三次握手」相似,斷開一個TCP鏈接則須要「四次揮手」。

第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了。可是,此時主動關閉方還可 以接受數據。
第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號爲收到序號+1。
第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,個人數據也發送完了,不會再給你發數據了。
第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。

tcp三次握手的缺點

常見狀態碼

1XX  表示消息
2XX  表示成功
3XX  表示重定向
4XX  表示請求錯誤
5XX  表示服務器端錯誤

常見HTTP狀態碼
200 OK
表示請求成功 一切正常
301 Moved Permanently
永久重定向,客戶請求的文檔在其餘地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL
302 Found
臨時重定向,相似於301,但新的URL應該被視爲臨時性的替代,而不是永久性的。
304 Not Modified
客戶端有緩衝的文檔併發出了一個條件性的請求。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
400 Bad Request
請求出現語法錯誤。
403 Forbidden
資源不可用。
404 Not Found
沒法找到指定位置的資源。
405 Method Not Allowed
請求方法對指定的資源不適用(方法:GET、POST、HEAD、Delete、PUT、TRACE等)。
500 Internal Server Error
服務器出現錯誤,不能完成客戶的請求。
501 Not Implemented
服務器不支持實現請求所須要的功能。

全部狀態碼

2開頭 (請求成功)表示成功處理了請求的狀態代碼。
200 (成功) 服務器已成功處理了請求。 一般,這表示服務器提供了請求的網頁。
201 (已建立) 請求成功而且服務器建立了新的資源。
202 (已接受) 服務器已接受請求,但還沒有處理。
203 (非受權信息) 服務器已成功處理了請求,但返回的信息可能來自另外一來源。
204 (無內容) 服務器成功處理了請求,但沒有返回任何內容。
205 (重置內容) 服務器成功處理了請求,但沒有返回任何內容。
206 (部份內容) 服務器成功處理了部分 GET 請求。

3開頭 (請求被重定向)表示要完成請求,須要進一步操做。 一般,這些狀態代碼用來重定向。
300 (多種選擇) 針對請求,服務器可執行多種操做。 服務器可根據請求者 (user agent) 選擇一項操做,或提供操做列表供請求者選擇。
301 (永久移動) 請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302 (臨時移動) 服務器目前從不一樣位置的網頁響應請求,但請求者應繼續使用原有位置來進行之後的請求。
303 (查看其餘位置) 請求者應當對不一樣的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。
304 (未修改) 自從上次請求後,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。
305 (使用代理) 請求者只能使用代理訪問請求的網頁。 若是服務器返回此響應,還表示請求者應使用代理。
307 (臨時重定向) 服務器目前從不一樣位置的網頁響應請求,但請求者應繼續使用原有位置來進行之後的請求。

4開頭 (請求錯誤)這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。
400 (錯誤請求) 服務器不理解請求的語法。
401 (未受權) 請求要求身份驗證。 對於須要登陸的網頁,服務器可能返回此響應。
403 (禁止) 服務器拒絕請求。
404 (未找到) 服務器找不到請求的網頁。
405 (方法禁用) 禁用請求中指定的方法。
406 (不接受) 沒法使用請求的內容特性響應請求的網頁。
407 (須要代理受權) 此狀態代碼與 401(未受權)相似,但指定請求者應當受權使用代理。
408 (請求超時) 服務器等候請求時發生超時。
409 (衝突) 服務器在完成請求時發生衝突。 服務器必須在響應中包含有關衝突的信息。
410 (已刪除) 若是請求的資源已永久刪除,服務器就會返回此響應。
411 (須要有效長度) 服務器不接受不含有效內容長度標頭字段的請求。
412 (未知足前提條件) 服務器未知足請求者在請求中設置的其中一個前提條件。
413 (請求實體過大) 服務器沒法處理請求,由於請求實體過大,超出服務器的處理能力。
414 (請求的 URI 過長) 請求的 URI(一般爲網址)過長,服務器沒法處理。
415 (不支持的媒體類型) 請求的格式不受請求頁面的支持。
416 (請求範圍不符合要求) 若是頁面沒法提供請求的範圍,則服務器會返回此狀態代碼。
417 (未知足指望值) 服務器未知足"指望"請求標頭字段的要求。

5開頭(服務器錯誤)這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤多是服務器自己的錯誤,而不是請求出錯。
500 (服務器內部錯誤) 服務器遇到錯誤,沒法完成請求。
501 (還沒有實施) 服務器不具有完成請求的功能。 例如,服務器沒法識別請求方法時可能會返回此代碼。
502 (錯誤網關) 服務器做爲網關或代理,從上游服務器收到無效響應。
503 (服務不可用) 服務器目前沒法使用(因爲超載或停機維護)。 一般,這只是暫時狀態。
504 (網關超時) 服務器做爲網關或代理,可是沒有及時從上游服務器收到請求。
505 (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。

401和403區別?

401 (未受權) 請求要求身份驗證。 對於須要登陸的網頁,服務器可能返回此響應。
403 (禁止) 服務器拒絕請求。

304與200讀取緩存的區別

200 (成功) 服務器已成功處理了請求。 一般,這表示服務器提供了請求的網頁。
302 (臨時移動) 服務器目前從不一樣位置的網頁響應請求,但請求者應繼續使用原有位置來進行之後的請求。

304是什麼意思?有沒有方法不請求不通過服務器直接使用緩存。

304 Not Modified
客戶端有緩衝的文檔併發出了一個條件性的請求。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
304 (未修改) 自從上次請求後,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。
(強緩存和協商緩存的命中和管理)

304 404

• 304 Not Modified 客戶端有緩衝的文檔併發出了一個條件性的請求。服務器告訴客戶,原來緩衝的文檔還能夠繼續使用。
• 404 找不到頁面 404 Not Found沒法找到指定位置的資源。

https的原理,加密方式,怎麼加密的

排序

實現一個快排

#include <iostream>
 
using namespace std;
 
void Qsort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];/*用字表的第一個記錄做爲樞軸*/
 
    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }
 
        a[first] = a[last];/*將比第一個小的移到低端*/
 
        while(first < last && a[first] <= key)
        {
            ++first;
        }
         
        a[last] = a[first];    
/*將比第一個大的移到高端*/
    }
    a[first] = key;/*樞軸記錄到位*/
    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}
int main()
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
 
    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*這裏原文第三個參數要減1不然內存越界*/
 
    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        cout << a[i] << "";
    }
     
    return 0;
}/*參考數據結構p274(清華大學出版社,嚴蔚敏)*/

常見的排序算法

常見排序算法複雜度

說下選擇排序,冒泡排序的實現思路

快速排序

算法是一種穩定的算法嗎?
它的最壞複雜度是多少?
平均複雜度呢?
最壞:O(n2) 平均:O(n*log2n) 不穩定 空間複雜度:O(log2n)~O(n)

11.經常使用的排序算法有哪些,介紹一下選擇排序。

選擇排序:它的工做原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到所有待排序的數據元素排完。
| 排序方法 | 平均 | 最好 | 最壞 | 輔助存儲 | 穩定性 |
| :-------- | -------:| :--: |-------| -------| -------|
| 選擇排序 | O(n^2) | O(n^2) | o(n^2) | O(1) | 不穩定 |

function selectSort(arr){
   var len=arr.length;
   var temp;
   for(var i=0;i<len-1;i++){
      for(var j=i+1;j<len;j++){
         if(arr[j]<arr[i]){
            temp=arr[j];
            arr[j]=arr[i];
            arr[i]=temp;
         }
       }
      i++;
     }
    return arr;
  }

實現兩個數組的排序合併

我一開始先合併再排序,他不樂意,而後我用了相似插入排序的方法。

介紹兩種排序算法

快速排序(不穩定):
平均:O(nlog2^n)
最好:O(nlog2^n)
最壞:O(n^2)
輔助存儲:O(nlog2^n)

var quickSort = function(arr) {
      if(arr.length <= 1) {
          return arr; 
      }
      varpivotIndex = Math.floor(arr.length / 2);
      var pivot =arr.splice(pivotIndex, 1)[0];
      var left =[];
      var right =[];
      for (var i= 0; i < arr.length; i++){
        if(arr[i] < pivot) {
          left.push(arr[i]);
        } else {
          right.push(arr[i]);
        }
      }
      return quickSort(left).concat([pivot], quickSort(right));
   };

簡單選擇排序(不穩定):
平均:O(n^2)
最好:O(n^2)
最壞:O(n^2)
輔助存儲:O(1)
原理:它的工做原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。

描述下二分查找

算法

你學過算法沒,說說你都瞭解些什麼

手寫鏈表倒數第K個查找

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (pListHead == NULL || k <= 0)
            return NULL;
        ListNode *p1 = pListHead;
        ListNode *p2 = pListHead;
         
        for (int i=1; i<k; i++)
        {
            if (p1->next != NULL)
                p1 = p1->next;
            else
                return NULL;
        }
         
        while(p1->next != NULL)
        {
            p1 = p1->next;
            p2 = p2->next;
        }
        return p2;
    }
};

設計一種算法能夠求出 某個數字是否 在10億個數中出現過

一開始我就是說直接用O(n)複雜度的直接遍歷就是,可是不滿意,我就說:把這些數字分紅N組嗎,而後在每組中查找,仍是不滿意

用bfs實現前序遍歷

給千萬量級的珠子,共上百種顏色,圍成一個圈,求連續的包含全部顏色的最短子串的長度,並分析時間複雜度

實現洗牌算法

最短路算法(dijkstra),有負環怎麼辦(spfa)

1三、解釋平衡二叉樹,以及在數據結構中的應用(紅黑樹)

1四、快排的時間複雜度和空間複雜度。

關於平衡二叉樹

手寫第一次面試沒有寫出來的鏈表問題,要求用es6寫

手寫一個簡單遍歷算法

手寫歸併排序

n長的數組放入n+1個數,不能重複,找出那個缺失的數

怎麼實現兩個大整數的相乘說下思路

實現兩個大整數的相加

智力題

用4個顏色給一個六面體上色有多少種狀況

數據結構

你學過數據結構沒,說說你都瞭解些什麼

你用JS實現過一些基本的數據結構嗎?

數組和鏈表區別,分別適合什麼數據結構

單向鏈表怎麼查找有沒有環?

你對數據結構有了解吧?我想問你,1000萬個結點的徹底二叉樹高度是多少?

操做系統

你對操做系統有了解吧?關於進程的調度算法,你能講一下嗎?

你學過計算機操做系統沒,說說你都瞭解些什麼

[幾個經常使用的操做系統進程調度算法](http://blog.csdn.net/luyafei_89430/article/details/12971171

unix中經常使用的命令行

常用的linux命令

4.線程與進程的區別及相應的應用場景

進程是資源分配的最小單位,線程是CPU調度的最小單位
Alt text

C++

C++裏面,堆棧最大的不 同點是什麼?

  堆和棧的區別:  
1、堆棧空間分配區別:  
一、棧(操做系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧;  
二、堆(操做系統): 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式卻是相似於鏈表。  
2、堆棧緩存方式區別:  
一、棧使用的是一級緩存, 他們一般都是被調用時處於存儲空間中,調用完畢當即釋放;  
二、堆是存放在二級緩存中,生命週期由虛擬機的垃圾回收算法來決定(並非一旦成爲孤兒對象就能被回收)。因此調用這些對象的速度要相對來得低一些。  
3、堆棧數據結構區別:  
堆(數據結構):堆能夠被當作是一棵樹,如:堆排序;  
棧(數據結構):一種先進後出的數據結構。

數據庫

mysql與 MongoDB的區別

出了個題目讓我寫設計數據庫

相關文章
相關標籤/搜索