­

前端基礎演算法

  • 2019 年 11 月 28 日
  • 筆記

對於前端初學者而言,這樣的一個功能你做出來了那就很好,慢慢的,我們的工作年限越來越長,如果我們還繼續那樣做,這樣,遲早會淘汰。這個時候,就需要對你的項目進行優化。之前講到過對於react項目的優化。這更多是針對於單頁應用的優化,避免首頁時間載入過長,打包文件載入過大,是針對於打包後文件來說的。這篇文章主要是針對於演算法相關的程式碼進行優化,從而是程式的運行速度更快,已達到程式的優化。

演算法更多的是針對於數據的增刪改查,或許你認為前端涉及不到,如果這樣想,那你就錯了。前端可能用的不多,但不會涉及不到,同時,了解演算法,那麼對於以後的職業道路也會有所幫助。

二分查找法

二分查找在進行查找有序數組中某一項數據的時候非常有用,可以加快程式的運行速度,尤其是在具有大量數據的時候。

二分查找的原理是從數組的中間開始查找,如果被查找對象剛好就是中間這一項,那直接退出查找。如果被查找對象大於中間,那麼所需要的對象是在中間-最後這一區間,所以有針對於這一區間再次進行二分。如此下去,找到所需要的即可。

/**   * 二分查找   * @param {Array} list  待查找的有序數組   * @param {Number} item 待查找的數據   */  function binarySearch(list, item){      // 如果list不是數組返回list      if (!Array.isArray(list)) return list      // 定義查找的起始位置      let low = 0;      let high = list.length - 1;        while (low <= high) {          // 定義中間的位置          let mid = Math.floor((low + high) / 2)          let midValue = list[mid]            if ( midValue == item ) return mid            if (midValue < item){              low = mid + 1          }            if (midValue > item){              high = mid - 1          }      }        return -1  }

最後來看看一個具體的效果

const arr = []  for (let i = 0; i < 10000; i++) {      arr.push(i)  }  const need = 6734  let res;    console.time("for")  for (let i = 0; i < arr.length; i++) {    const ele = arr[i];    if( ele === need ) {      res = i      break    }  }  console.log(res);  console.timeEnd("for")    console.time("binarySearch")  res = binarySearch(arr, need)  console.log(res)  console.timeEnd("binarySearch")

可以看到很明顯二分查找比普通的循環遍歷快了許多。

可視化鏈接

https://algorithm-visualizer.org/branch-and-bound/binary-search

時間複雜度 O(log n)

選擇排序

上面講到的二分查找雖然性能很好,當時有一個必要的條件就是這個list需要是一個有序數組,否則使用二分查找則是不成立的。所以,對於一個無序的數組,我們首先就是需要把它重新排序。選擇排序就是其中一種。

選擇排序的原理是從數組中選出一個最大(小)的數,放在另一個數組的開始,然後從剩餘數組中繼續選擇最大(小)的數進行操作,如此重複,直到數組重組。

// 選擇排序  function selectSort(list){    if (!Array.isArray(list)) return list      // 定義一個數組存放排序後的數組    const arr = [];      for (let i = list.length - 1; i >= 0; i--) {      const smallestIndex = findSmallest(list)      arr.push(list.splice(smallestIndex, 1)[0])    }      return arr  }    // 尋找最小的數  function findSmallest(list){    let smallest = list[0]    let smallestIndex = 0      for (let i = 0; i < list.length; i++) {      const ele = list[i];      if (ele < smallest) {        smallest = ele        smallestIndex = i      }    }    return smallestIndex  }