TypeScript数据结构与算法(8)通俗易懂的算法时间复杂度
上几篇文章中,对于队列,链表的优化,都是出于数据结构的算法事件复杂度的优化考虑的,那什么是算法时间复杂度?通俗一点,就是你写的代码执行效率怎么样,如果执行效率很low,那你写的代码算法时间复杂度就很高,在计算算法时间复杂度时,有以下几种:
O(1):比如直接输出console.log这种概念
O(n):比如循环n次
O(n^2):比如循环里面再套一个循环
O(logn):数量的规模如果是n,但是在执行过程中存在循环减半,就是logn
等,另外还需记住,所谓的算法的时间复杂度,只是一个估计值。
常见的时间复杂度排序:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2*logn)<O(n^3)
在了解上面时什么东西之前,可以先看下下面四组代码,判断哪一组运行的时间最短(效率最高),哪一组运行的时间最长(效率最低)
start() { //第一组 console.log("hello world"); //第二组 let nlen = 18; for (let i = 0; i < nlen; i++) { console.log("helloworld"); } //第三组 let ilen = 18; let jlen = 18; for (let i = 0; i < ilen; i++) { for (let j = 0; i < jlen; j++) { console.log("helloworld"); } } //第四组 let alen = 18; let blen = 18; let clen = 18; for (let a = 0; a < alen; a++) { for (let b = 0; b < blen; b++) { for (let c = 0; c < clen; c++) { console.log("helloworld"); } } } }
毫无疑问,即使不了解算法时间复杂度的人,应该也能判断出第一组效率最高,第四组效率最低,记住,得出这样的结论是这四段代码都是在同样的编译环境,运行环境下进行比对的。那么如何快速简单的判断代码的算法时间复杂度呢?可以通过以下的方式:
快速判断算法时间复杂度(适用于绝大多数简单的情况)
1.确定问题规模n
2.循环减半过程logn
3.k层关于n的循环n^k次方
其他复杂情况,根据算法执行过程判断,目前空间复杂度已经讨论的比较少了,简言之,“空间换时间”,以提高用户的体验。所以,现在我们可以很轻松的判断出上面四段代码的时间复杂度了,第一段代码是O(1),第二段代码是O(n),第三段代码是O(n^2),第四段代码是O(n^3)。

浙公网安备 33010602011771号