<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
yocto-queue
是一個微型佇列的資料結構,根據作者的介紹,如果在你一個資料量很大的陣列上,大量的操作Array.push
和Array.shift
,那麼你可以考慮使用yocto-queue
來替代Array
。
因為Array.shift
的時間複雜度是O(n)
,而Queue.dequeue
的時間複雜度是O(1)
,這對於大量的資料來說,效能上的提升是非常明顯的。
學習演演算法和資料結構的時候,我們經常會聽到時間複雜度和空間複雜度,這兩個概念是什麼呢?
時間複雜度是指一個演演算法執行所耗費的時間,它是一個函數,這個函數的變數是問題規模的函數;
通常會使用大O
符號來表示時間複雜度,比如O(n)
,O(n^2)
,O(logn)
等等,這就是大 O 表示法(Big O notation)。
O
代表的是演演算法的漸進時間複雜度(asymptotic time complexity),也就是說,隨著問題規模的增大,演演算法的執行時間的增長率和O
中的函數相同,稱作漸進時間複雜度。
O(1)
表示演演算法的執行時間與問題規模無關,也就是說,不管問題規模有多大,演演算法執行所耗費的時間都是一樣的,這種演演算法稱為時間複雜度為常數階的演演算法。
O(n)
表示演演算法的執行時間與問題規模成正比,也就是說,隨著問題規模的增大,演演算法執行所耗費的時間也隨之增大,這種演演算法稱為時間複雜度為線性階的演演算法。
O(n^2)
表示演演算法的執行時間與問題規模成平方比,也就是說,隨著問題規模的增大,演演算法執行所耗費的時間呈二次方增長,這種演演算法稱為時間複雜度為平方階的演演算法。
通過上面的介紹,我們可以將O
比喻成函數,O(1)
就是一個常數函數,O(n)
就是一個線性函數,O(n^2)
就是一個平方函數,O(logn)
就是一個對數函數。
說了這麼多概念性的問題,不如直接來看看程式碼;
例如,我們有一個陣列,我們要遍歷這個陣列,然後將陣列中的每個元素都乘以2,那麼我們可以這麼寫:
function multiplyBy2(arr) { const result = []; for (let i = 0; i < arr.length; i++) { result.push(arr[i] * 2); } return result; }
這段程式碼的時間複雜度是O(n)
,因為我們遍歷了陣列,所以時間複雜度就是O(n)
,O
代表這個函數,n
代表問題規模,也就是陣列的長度,組合起來就是O(n)
。
再直觀一點,我們可以這麼理解,當陣列的長度為n
時,我們需要執行n
次迴圈,所以時間複雜度就是O(n)
,用程式碼錶示就是:
function O(n) { for (let i = 0; i < n; i++) { // do something } } O(1); // O(1) O(2); // O(2) O(3); // O(3) O(n); // O(n)
空間複雜度是指一個演演算法執行所耗費的記憶體空間,它是一個函數,這個函數的變數是問題規模的函數;
和時間複雜度一樣,空間複雜度也有O(1)
、O(n)
、O(n^2)
、O(logn)
等等,它們的含義和時間複雜度一樣,只不過它們是表示演演算法執行所耗費的記憶體空間的增長率。
當然空間複雜度計算的不是記憶體消耗,而是變數的個數,例如氣泡排序的空間複雜度是O(1)
,因為它只需要一個變數temp
:
function bubbleSort(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { const temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; }
而快速排序的空間複雜度是O(logn)
,因為它需要一個變數pivot
,而且它是遞迴的,所以空間複雜度是O(logn)
:
function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivotIndex = Math.floor(arr.length / 2); const pivot = arr.splice(pivotIndex, 1)[0]; const left = []; const right = []; for (let 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)); }
上面瞭解了時間複雜度和空間複雜度的概念,那麼我們開始正式分析yocto-queue
的原始碼;
程式碼不多,可以直接通過github1s
線上閱讀,然後使用瀏覽器控制檯來檢視效果;
先來看一下yocto-queue
的使用方式:
npm install yocto-queue
import Queue from 'yocto-queue'; const queue = new Queue(); queue.enqueue('
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45