二分法查找,也稱折半查找,是一種在有序數組中查找特定元素的搜索算法。
查找過程能夠分爲如下步驟:
(1)首先,從有序數組的中間的元素開始搜索,
若是該元素正好是目標元素(即要查找的元素),則搜索過程結束,不然進行下一步。
(2)若是目標元素大於或者小於中間元素,
則在數組大於或小於中間元素的那一半區域查找,而後重複第一步的操做。
(3)若是某一步數組爲空,則表示找不到目標元素。
代碼:javascript
// 非遞歸算法 function binary_search(arr, key) { var low = 0, high = arr.length - 1; while(low <= high){ var mid = parseInt((high + low) / 2); if(key == arr[mid]){ return mid; }else if(key > arr[mid]){ low = mid + 1; }else if(key < arr[mid]){ high = mid -1; } } return -1 }; var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86]; var result = binary_search(arr,10); alert(result); // 9 返回目標元素的索引值 // 遞歸算法 function binary_search(arr,low, high, key) { if (low > high){ return -1; } var mid = parseInt((high + low) / 2); if(arr[mid] == key){ return mid; }else if (arr[mid] > key){ high = mid - 1; return binary_search(arr, low, high, key); }else if (arr[mid] < key){ low = mid + 1; return binary_search(arr, low, high, key); } }; var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86]; var result = binary_search(arr, 0, 13, 10); alert(result); // 9 返回目標元素的索引值
這個問題要倒過來看,要到達n
級樓梯,只有兩種方式,從(n-1)
級 或 (n-2)
級到達的。
因此能夠用遞推的思想去想這題,假設有一個數組s[n]
, 那麼s[1] = 1
(因爲一開始就在第一級,只有一種方法),s[2] = 1(
只能從s[1]
上去 沒有其餘方法)。
那麼就能夠推出s[3] ~ s[n]
了。
下面繼續模擬一下, s[3] = s[1] + s[2]
,
由於只能從第一級跨兩步, 或者第二級跨一步。css
function cStairs(n) { if(n === 1 || n === 2) { return 1; } else { return cStairs(n-1) + cStairs(n-2) } }
//訪問一個DOM tree,是一個經典的深度優先搜索的算法 function Traverse(DOM,callback) { callback(DOM); var list = DOM.children; Array.prototype.forEach.apply(list,(item)=>{ Traverse(item,callback); //遞歸 }) }
WebPack
是一個模塊打包工具,可使用WebPack
管理模塊依賴,並編繹輸出模塊們所需的靜態文件。
它可以很好地管理、打包Web
開發中所用到的HTML
、javaScript
、CSS
以及各類靜態文件(圖片、字體等),讓開發過程更加高效。
對於不一樣類型的資源,webpack
有對應的模塊加載器。webpack
模塊打包器會分析模塊間的依賴關係,最後 生成了優化且合併後的靜態資源。webpack
的兩大特點:
1)code splitting
(能夠自動完成)
2)loader
能夠處理各類類型的靜態文件,而且支持串聯操做webpack
是以commonJS
的形式來書寫腳本,但對 AMD/CMD
的支持也很全面,方便舊項目進行代碼遷移。webpack
具備requireJs
和browserify
的功能,但仍有不少本身的新特性:
1) 對 CommonJS
、 AMD
、ES6
的語法作了兼容
2) 對js
、css
、圖片等資源文件都支持打包
3) 串聯式模塊加載器以及插件機制,讓其具備更好的靈活性和擴展性,例如提供對CoffeeScript
、ES6
的支持
4) 有獨立的配置文件webpack.config.js
5) 能夠將代碼切割成不一樣的chunk
,實現按需加載,下降了初始化時間
6) 支持 SourceUrls
和 SourceMaps
,易於調試
7) 具備強大的Plugin
接口,大可能是內部插件,使用起來比較靈活
8)webpack
使用異步 IO
並具備多級緩存。這使得 webpack
很快且在增量編譯上更加快java
HTTP/2
引入了「服務端推(server push
)」的概念,它容許服務端在客戶端須要數據以前就主動地將數據發送到客戶端緩存中,從而提升性能。HTTP/2
提供更多的加密支持,HTTP/2
使用多路技術,容許多個消息在一個鏈接上同時交差。
它增長了頭壓縮(header compression
),所以即便很是小的請求,其請求和響應的header
都只會佔用很小比例的帶寬。node
CommonJS
是服務器端模塊的規範,nodejs
採用了這個規範。CommonJS
規範加載模塊是同步的,也就是說,只有加載完成,才能執行後面的操做。AMD
規範則是非同步加載模塊,容許指定回調函數。AMD
推薦的風格經過返回一個對象作爲模塊對象,CommonJS
的風格經過對module.exports
或exports
的
屬性賦值來達到暴露模塊對象的目的。webpack
MySQL
是傳統的關係型數據庫,MongoDB
則是非關係型數據庫mongodb
以JSON
結構(二進制)進行存儲,對海量數據存儲有着很明顯的優點。
對比傳統關係型數據庫,NoSQL
有着很是顯著的性能和擴展性優點,與關係型數據庫相比,MongoDB
的優勢有:
①弱一致性(最終一致),更能保證用戶的訪問速度:
②文檔結構的存儲方式,可以更便捷的獲取數據。web
服務器首先產生ETag
,服務器可在稍後使用它來判斷頁面是否已經被修改。
本質上,客戶端經過將該記號傳回服務器,要求服務器驗證其(客戶端)緩存。304
是HTTP
狀態碼,服務器用來標識這個文件沒修改,不返回內容,瀏覽器在接收到個狀態碼後,會使用瀏覽器已緩存的文件。
客戶端請求一個頁面A
。
服務器返回頁面A
,並在給A
加上一個ETag
。
客戶端展示該頁面,並將頁面連同ETag
一塊兒緩存。
客戶再次請求頁面A
,並將上次請求時服務器返回的ETag
一塊兒傳遞給服務器。
服務器檢查該ETag
,並判斷出該頁面自上次客戶端請求以後還未被修改,直接返回響應304
(未修改——Not Modified
)和一個空的響應體。算法
var http = require("http"); var request = http.request({ host:"localhost", port:"8080", path:"/request", method:"post" },function(res){ res.on("data",function(chunk){ console.log(chunk.toString()); }); }); request.write("user=zhang&pass=111"); request.end("請求結束");//結束本次請求
CommonJS
模塊的重要特性是加載時執行,即腳本代碼在 require
的時候,就會所有執行。
一旦出現某個模塊被」循環加載」,就只輸出已經執行的部分,還未執行的部分不會輸出。ES6
模塊是動態引用,若是使用 import
從一個模塊加載變量,那些變量不會被緩存,而是成爲一個指向被加載模塊的引用,須要開發者本身保證,真正取值的時候可以取到值。import/export
最終都是編譯爲 require/exports
來執行的。CommonJS
規範規定,每一個模塊內部,module
變量表明當前模塊。
這個變量是一個對象,它的 exports
屬性(即 module.exports
)是對外的接口。
加載某個模塊,實際上是加載該模塊的 module.exports
屬性。export
命令規定的是對外的接口,必須與模塊內部的變量創建一一對應關係。mongodb