数据结构与算法_渡劫4

  • 正在学习的算法课程:极客时间的王争老师的《数据结构与算法之美》
  • 传送门: 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

传送门:二维数组中数组元素存储地址的计算一问

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章