算法基础学习
数据结构的存储方式
数据结果的存储方式只有两种:数组(顺序存储)和链表(链式存储)。属于底层存储的数据结构类型,其余的数据结构多是基于这两种进行延伸实现的
分析问题要有递归思想,自顶向下,从抽象到具体
数组特点:
- 元素紧凑连续存储,可以随机访问:通过索引快速找到对应的元素,优点:相对节约存储空间
- 如果要动态扩容存储数据,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度为 O(N)
- 对数组的 API 操作,比如插入或删除,需要迁移后面的所有元素数据保持连续存储,时间复杂度 O(N)
链表特点:
- 元素不连续存储,靠指针指向下一个元素的位置,所以不存在数组中的动态扩容问题
- 因为存储空间不连续,所以无法根据索引算出对应元素的地址,不能随机访问
- 如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)
- 由于每个元素必须存储指向前后元素位置的指针,会消耗更多的存储空间
数据结构的基本操作
对于任何数据结构的基本操作都是遍历 + 访问,简单的说就是:增删改查
各种数据结构的遍历 + 访问无非两种形式:线性的和非线性的
线性的:for/while 非线性的:递归
数组遍历框架:典型的线性迭代结构
typescript
function traverse(arr: any[]) {
for(let i = 0; i < arr.length; i++) {
...// 访问arr[i]
}
}
链表遍历框架:兼具迭代和递归结构
typescript
// 待补充ing
二叉树遍历框架:典型的非线性递归遍历结构
typescript
// 待补充ing
所谓框架,就是套路。不管增删改查,这些代码都是永远无法脱离的结构