文章目录
- 正在学习的算法课程:极客时间的王争老师的《数据结构与算法之美》
- 传送门: https://time.geekbang.org/column/126
- 目前学到第五讲,很良心,共56讲,推荐想学数据结构的同学
- 好的理论基础离不开代码,今天用python撸了一遍链表的操作,找回了很久没有感受到的成就感,后期可能会上传github
- 2019/09/25
一、数组
1. 定义:数组(Array)是一种线性表数据结构,用一组连续的内存空间,来存储一组具有相同类型的数据
2. 四大逻辑结构:
- 线性结构
- 非线性结构:
- 集合结构
- 图形结构
- 树形结构
- 内存地址计算
a[i]_address = base_address + i * data_type_size
data_type_size 表示数组中每个元素的大小。我们举的这个例子里,数组中存储的是 int 类型数据,所以 data_type_size 就为 4 个字节。
3. 数组和链表的区别
A:数组支持随机访问,根据下表随机访问的时间复杂度为O(1),但是插入和删除操作的最好情况是O(1),最坏情况是O(n),平均复杂度是O(n)。数组适合查找,链表适合插入、删除
作者的忠告: 在学习的时候,我部门不要死记硬背某个数据结构或者算法,而是要学习它的思想和处理技巧
4. 数组的边界及越界
上代码
int main(int argc, char* argv[]){
int i = 0;
int arr[3] = {0}; // 定义一个整形数组,长度为8,全部初始化为0
for(; i<=3; i++){
arr[i] = 0; // a[3] 超界,无限循环
printf("hello world\n");
}
return 0;
}
讲道理,这段代码我开始又没有看懂,后来看了作者的解析以及上网查的资料,有如下理解:
因为用的是python,所以在a[3]的时候python或者java中会报错,但是在c中不会,a[3]=0 就相当于 i=0,因此代码会无限循环。
5. 能力提升的灵魂问题
Q1:python的垃圾回收机制
A:1. 引用计数机制;2. 标记清除机制;3. 分代回收机制
b站传送门: python干货分享—垃圾回收机制
Q2:二位数组的内存地址计算
A2:a[i][j]
的地址是p+(i*col+j)*d