代码优化核心思路
- 时间复杂度优化
- 将代码中的无效计算、无效存储剔除,降低时间复杂度。
- 设计合理数据结构,完成时间复杂度向空间复杂度的转移。
- 空间复杂度优化
- 降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构。
- 将代码中的无效计算、无效存储剔除,空间复杂度。
常用的分析方法可以参考下面的 3 个步骤:
-
首先,这段代码对数据进行了哪些操作?
-
其次,这些操作中,哪个操作最影响效率,对时间复杂度的损耗最大?
-
最后,哪种数据结构最能帮助你提高数据操作的使用效率?
数据结构
逻辑结构(一般讨论)
- 集合结构
- 线性结构
- 树形结构
- 图形结构
物理结构
- 顺序存储结构
- 链式存储结构
线性表
线性表是使用非常广泛的一类数据结构,它对数据的顺序非常敏感,而且它对数据的增删操作非常灵活。在有序排列的数据中,可以灵活的执行增删操作,就好像是为排好队的数据增加了插队的入口。这既是灵活性也是缺陷,原因在于它的灵活性在某种程度上破坏了数据的原始顺序。在某些需要严格遵守数据处理顺序的场景下,我们就需要对线性表予以限制了。经过限制后的线性表,它们通常会被赋予一些新的名字。
-
链表
查找中间位置的元素的值,可以采用快慢指针。
是否有环也可以用快慢指针
快慢指针非常重要
-
数组
数组就不多介绍了。
一维数组数组的简单增删查非常简单。数组同时属于线性表的顺序存储。
数组更适合在数据数量确定,即较少甚至不需要使用新增数据、删除数据操作的场景下使用,这样就有效地规避了数组天然的劣势。在对位置敏感的场景下,比如需要高频根据索引位置查找数据时,数组就是个很好的选择了。
栈
-
栈----后进先出
只能在一边进行操作,都在栈顶进行操作
顺序栈
链栈
-
匹配括号
-
用户访问网页的顺序信息
维护两个栈
当用户访问了一个新的页面,则对后退栈进行压栈操作。
当用户后退了一个页面,则后退栈进行出栈,同时前进栈执行压栈。
当用户前进了一个页面,则前进栈出栈,同时后退栈压栈。
-
面对高频使用新增、删除操作,且操作针对最新元素,则可以考虑使用栈。
实际应用:
- 程序中子程序的调用
- 函数的递归调用
队列
-
队列------先进先出
先进------新增数据只能在队尾进行。
先出--