js视角的数据结构和算法(一)

什么是数据结构

在我们的认知中,整洁一定是比混乱更让人有舒适感。脏乱差的房间和干净整洁的房间,基本上都偏向后者。生活如此,编程如此。繁杂而又零散的数据访问和修改起来是灾难性的,效率极低。所谓的数据结构,就是数据的组织,管理和存储格式。让无组织的散兵游勇成为纪律严明的军队,高效精准的访问和修改数据。针对的场景不同,衍生的类别也就不同(数组,链表,树,图…),但统称数据结构。

什么是算法

所谓算法,就是一系列用于解决特定逻辑或某个问题的程序与指令的集合。程序=数据结构+算法。单纯的谈论数据结构和单纯讨论算法都太片面,二者结合才是王道。一道数学题的解决过程是算法(如1加到100),一个特定逻辑的实现是算法(如数组去重),它看起来无形,但用起来应该有意。

数据结构和算法有什么用

如果你只想停留在基础水准,复制粘贴能跑就行,就等于一辈子柴米油盐,那修炼绝世武功确实没用。数据结构和算法和SEO(搜索引擎优化),设计模式这些东西都是一样的,是可以提高生活质量的锦上添花系列功能。不至于是生与死的区别,但确实是活着和活得好的区别,下面简单罗列几个学好数据结构和算法看得见的好处。

开阔视野,丰富解决问题的思路
性能优化,更快更省
面试,提高核心竞争力

算法好坏的差异

在我们学习过程中,即便自己不够优秀,也应该清楚优秀应该是什么样的,算法也是如此。即便我们暂时写不出效率高占用内存小的算法,也应该知道真正高效的算法应该是怎样的。

  • 算法一,首屏渲染加载1个小时,耗费内存1个G
  • 算法二,首屏渲染1s,耗费内存1M
  • 同样的网站,你更愿意访问基于哪个算法的呢?差异显而易见。

算法好坏的衡量标准

不同机器配置不一样,且即便是同一台机器不同时刻内存占用也不一定相同,出于诸多考虑,算法在运行时的比较效率,结果未必符合预期。所以,算法的比较都是预估,即在程序真正运行前就给出评估结果。评估依据有两个,时间复杂度和空间复杂度。

  • 耗时最短,内存消耗最小的更快更省算法,被称之为理想算法。
  • 当然,实际问题上多是牺牲时间换空间或者牺牲空间换时间
  • 具体问题具体分析,最适合解决当前问题的算法才是最好的。

时间复杂度

时间复杂度可看成是语句总执行次数随问题规模变化而变化的一个数学函数,记作T(n)=O(f(n))。其中f(n)是关于问题规模n的某个函数。算法执行时间增长率和f(n)相同,称作算法渐进时间复杂度。常说的时间复杂度,指的也是渐进时间复杂度。这种用大O()来体现时间算法复杂度的记法,称为大O记法

问题规模是什么?

  • 可以简单理解为最大计算量,1加到100,问题规模就是100,1加到1000,问题规模就是1000

渐进时间复杂度存在意义何在?

  • 既生瑜何生亮?有时间复杂度了,渐进时间复杂度有啥用?
  • 存在即合理,假设有算法A,B.。算法A在问题规模小于100时效率高,算法B在问题规模大于100时效率高
  • 根本无法直接决定哪个算法好,需要结合具体场景,问题规模小于100,A优于B,大于100,B优于A。
  • 所以需要一个界定条件,或者说整体变化规律完成比较,这就是渐进时间复杂度存在的意义

时间复杂度的计算规则

  • 执行次数函数为常数量级,视为O(1)
    在这里插入图片描述

  • 执行次数函数多项式只保留最高项,次高项忽略
    在这里插入图片描述

  • 执行次数函数多项式最高项有常系数则忽略该系数

在这里插入图片描述

常见时间复杂度排序

在这里插入图片描述

  • 大于等于立方阶的要考虑是不是代码写错了,或考虑换一种算法
  • 优化到常数当然最理想,实际到线性阶和对数阶的居多

空间复杂度

空间复杂度是对存储空间的计算。也用大O记法,S(n)=O(f(n))

空间复杂度的计算

  • 存储空间固定不变,为O(1),如简单定义一个变量
let num=1
  • 输入数据和数组或集合大小成线性,空间复杂度为O(n)
  • 数组定义但未在循环中开辟新空间,空间复杂度也为O(n)
let arr =Array(n); //空间复杂度为O(n)


//空间复杂度为O(n)
function print(n){
    const arr=[1,2,3,4,5]
    for (let j = 0; j < n; j++) {
       console.log(arr[j])
    }
}



  • 嵌套循环且在循环中开辟新空间,空间复杂度为平方阶
function computed(){
let arr=[]
for (let i = 0; i < n; i++) {
    arr[i]=i //每次数组赋值都会申请一个空间存储变量 n 
    for (let j = 0; j < n; j++) {
        arr[i][j]=j//每次数组赋值都会申请一个空间存储变量 n
    }
}
}
  • 常见的空间复杂度只有 O(1)、O(n)、O(n2)。其他的话很少会用到,若碰到,有可能代码写错了
发布了463 篇原创文章 · 获赞 808 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_42813491/article/details/104051747