Web前端最全学习前端算法前你需要了解的‘大O表示法’(1),作为一名web前端面试者你应该知道的知识

最后

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端资料图.PNG

定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。

我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。

此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。

“大O记法”:在这种描述中使用的基本参数是 n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法 O ( f(n) )表示当 n增大时,运行时间至多将以正比于 f(n)的速度增长。

这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。例如,一个低附加代价的O(n2)算法在n较小的情况下可能比一个高附加代价的 O(nlogn)算法运行得更快。当然,随着n足够大以后,具有较慢上升函数的算法必然工作得更快。

常见的大 O 运行时间

以下由快到慢排序。

  • O(log n),也叫对数时间,这样的算法包括二分查找

  • O(n),线性时间,包括简单查找

  • O(n*log n),包括快速排序(业界俗称快排),一种速度较快的快速排序

  • O(n^ x),包括平方时间、立方时间

  • O(2n) 指数时间

  • O(n!),包括旅行商问题的解决方案,一种非常慢的算法

O(log n)

O(log2n)表示每次循环运行之后,需要处理的数据减去一半。比如100、50、25、13。。。

对数

了解对数时间,就要先了解什么是对数,尽管对数在高一就学过,但是想必不少人都忘记了它吧(小声逼逼)。如果你清楚什么是对数,请直接跳过这个环节。

指数是幂运算aⁿ(a≠0)中的一个参数,a为底数,n为指数,指数位于底数的右上角。

1、当指数 n=0时,

2、当指数 n>0时,,且n为整数时,

3、当指数 n<0时,

4、当指数n=2时,称为平方。

5、当指数 n=3时,称为立方。

如果

,即a的x次方等于N(a>0,且a≠1),那么数x叫做以a为底N的对数(logarithm),记作

。其中,a叫做对数的底数,N叫做真数,x叫做“以a为底N的对数”。

二分查找法

二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回 null

一般而言,对于包含 n 个元素的列表,用二分查找最多需要 log2 n 步,而简单查找最多需要 n 步。

我们通过 JS 来实现一下思路:

const binarySearch = (arr, val) => {

let start = 0;

let end = arr.length - 1;

let guess;

while (start <= end) {

let mid = Math.ceil((start + end) / 2);

guess = arr[mid];

if (guess === val) return mid;

if (guess > val) {

end = mid - 1;

} else {

start = mid + 1;

}

}

return -1;

}

binarySearch([1, 3, 5, 7, 9], 3);

如果我们输入一个包含100个元素的有序数组,那么我们利用二分查找,最快找到元素的步骤设为n 那么

这就是O(logn)表示法。

线性时间O(n)

o(n)表示 随着输入量的增加,时间复杂度呈线性增长。

这里以简单查找的方法举例:

function test (array,num){

for(let i =0;i<array.length;i++){

if(array[i] === num){

return i

}

}

}

平方时间

表示的是算法的时间复杂度随着输入量的变化发生平方变化。

在js中,典型的就是双层循环

function test(arr1,arr2,){

arr1.map(item=>{

arr2.map(item2=>{

if(item2 === item1){

return item

}

})

})

}

立方时间同理,算法的时间复杂度随着输入量的变化发生立方变化,常见的算法有三层循环。随着循环层k的增加,算法复杂度为

指数时间

指数时间表示的算法的时间复杂度随着输入量的增加呈两倍数增加。常见算法:选择排序

function selectionSort(arr) {

const length = arr.length;

for (let i = 0; i < length - 1; i++) {

let minIndex = i;

for (let j = i + 1 ; j < length ; j++) {

if (arr[j] < arr[minIndex]) {

minIndex = j;

}

}

if (minIndex !== i) {

const temp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = temp;

}

}

}

「常用排序算法的时间复杂度」

| 排序法 | 最差时间分析 | 平均时间复杂度 | 稳定度 |

| — | — | — | — |

| 冒泡排序 | O(n2) | O(n2) | 稳定 |

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端视频资料:

、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-CsIzGc6w-1715889685200)]

前端视频资料:
[外链图片转存中…(img-hRpBWARH-1715889685201)]

  • 20
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值