问题:如何分析时间复杂度?
Web前端开发解析:当问题规模即要处理的数据增长时,基本操作要重复执行的次数必定也会增长,那么我们关心地是这个执行次数以什么样的数量级增长。
我们用大O表示法表示下常见的时间复杂度量级:
常数阶O(1)线性阶O(n)对数阶O(logn)线性对数阶O(nlogn)平阶O(n)
当然还有指数阶和阶乘阶这种常极端的复杂度量级,我们就不讨论了。
O(1)
传说中的常数阶的复杂度,这种复杂度无论数据规模n如何增长,计算时间是不变的。
constincrement=n=n++
举个简单的例:
不管n如何增长,都不会影响到这个函数的计算时间,因此这个代码的时间复杂度都是O(1)。
O(n)
线性复杂度,随着数据规模n的增,计算时间也会随着n线性增。
典型的O(n)的例就是线性查找。
constlinearSearch=(arr,target)=
{for(leti=0;iarr.length;i++)
{
if(arr[i]===target)
{returni
}
}
return-1
}
线性查找的时间消化与输入的数组数量n成个线性例,随着n规模的增大,时间也会线性增长。
O(logn)
对数复杂度,随着问题规模n的增长,计算时间也会随着n对数级增长。
典型的例是分查找法。
functionsbinarySearch(arr,target)
{letmax=arr.length-1
letmin=0
while(min=max){
letmid=Math.floor((max+min)/2)
if(targetarr[mid]){
max=mid-1
}elseif(targetarr[mid])
{min=mid+1
}else{
returnmid
}
}
return-1
}
在分查找法的代码中,通过while循环,成2倍数的缩减搜索范围,也就是说需要经过log2^n次即可跳出循环。
事实上在实际项目中,O(logn)是个非常好的时间复杂度,比如当n=的数据规模时,分查找只需要7次,线性查找需要次,这对于计算机而言差距不,但是当有10亿的数据规模的时候,分查找依然只需要30次,而线性查找需要惊人的10亿次,O(logn)时间复杂度的算法随着数据规模的增大,它的优势就越明显。
O(nlogn)
线性对数复杂度,随着数据规模n的增长,计算时间也会随着n呈线性对数级增长。
constmergeSort=array=
{constlen=
array.lengthif(len
2){
returnlen
}
constmid=Math.floor(len/2)
constfirst=array.slice(0,mid)
constlast=array.slice(mid)
returnmerge(mergeSort(fist),mergeSort(last))
functionmerge(left,right)
{varresult=[];
while(left.lengthright.length)
这其中典型代表就是归并排序
result.push(left.shift());
}else{
result.push(right.shift());
}
}
while(left.length)
result.push(left.shift());
while(right.length)
result.push(right.shift());
returnresult;
}
}
O(n)
平方级复杂度,典型情况是当存在双重循环的时候,即把O(n)的代码再嵌套循环遍,它的时间复杂度就是O(n)了,代表应用是冒泡排序算法。
function
bubleSort(arra){var
temp;
for(var
i=0;iarra.length;i++){for(var
j=0;jarra.length-i-1;j++){
if(arra[j]arra[j+1]){temp
=arra[j];
arra[j]=arra[j+1];
arra[j+1]=temp;
}
}
};
以上就是小科今天整理提供的Web前端开发面试题,希望为Web前端同学提供了有用的面试素材,以后小科每日均会提供Python、Web及MySQL数据库相关的习题。学习没有捷径,希望大家都能少走一些弯路,顺利找到工作!