本笔记是对《王道数据结构》中各章节涉及的基础知识进行整理。本笔记主要用以应对夏令营面试中可能会问到的数据结构方面的问题,比较泛泛而谈,如果您对这些内容感兴趣,建议参考原书。大佬可自行绕路
更多章节内容请参见:保研复习——数据结构篇-CSDN博客
目录
知识框架:
线性表、顺序表、链表的关系:
线性表的顺序表示:
顺序表基本概念:
可以认为顺序表就是数组
静态分配与动态分配:
为啥需要动态分配呢?
静态分配往往需要分配较大的内存空间,会造成内存资源的浪费;为了解决上述问题,就需要动态分配内存,所谓动态分配内存,通俗理解是需要多大的内存,就分配多大的内存。
顺序表的动态分配并非链式存储:
两种分配方式的区别:
1. 内存位置
- 静态分配:数组是在**栈(stack)**上分配的。栈内存是由操作系统自动管理的,分配和释放速度快,但栈的大小是有限的,通常只有几MB。
- 动态分配:数组是在**堆(heap)**上分配的。堆内存的大小远大于栈,可以用来分配较大的内存块,适合处理较大的数据或需要灵活管理的内存。
2. 内存管理
- 静态分配:由编译器自动管理,分配的内存会在函数返回或作用域结束时自动释放。程序员不需要手动管理内存的释放。
- 动态分配:需要程序员手动管理内存的分配和释放。如果使用
new
分配了内存,需要使用delete[]
释放,否则会导致内存泄漏。3. 大小确定时间
- 静态分配:数组的大小在编译时确定,必须是一个常量表达式。这意味着数组的大小在程序运行期间是固定的,不能改变。
- 动态分配:数组的大小在运行时确定,可以根据需要动态调整。适合在程序运行时根据实际需求分配不同大小的内存。
4. 生命周期和作用域
- 静态分配:数组的生命周期受限于其作用域。当程序离开作用域时,内存会自动释放。
- 动态分配:数组的生命周期由程序员控制,可以超出其分配的作用域,只要在适当的时候释放内存即可。
动态分配语句:
优缺点:
通过首地址和元素序号可以在O(1)时间查询,但是增加、删除、按值查找的时间复杂度都是O(n)
线性表的链式表示:
单链表的基本概念:
单链表的建立:
可以采用头插法和尾插法两种方式
双链表:
循环链表:
静态链表:
静态链表是使用数组实现的链表,与传统链表不同,静态链表的内存空间是预先分配好的。每个节点使用数组的一个元素来表示,而不是像传统链表那样使用动态分配的内存。