《我的第一本算法书》随手记(1)

!!!看了几本图灵系列的漫画书,随手记些要点,方便回忆!!!

第一章 数据结构

1. 什么是数据结构

数据存储于内存中,决定了数据顺序和位置关系的便是“数据结构”。

 

2. 链表

  • 结构

链表由若干各节点组成,每个节点包含两部分:数据和指针,如下Blue、Yellow、Red代表节点的数据,指针指向下一个节点的内存地址(单向链表)。

 

链表中节点一般都是分散存储于内存中的,无须存储在连续空间中。

  

  • 操作

因为节点分散的存储在内存中,所以如果想要访问节点数据,需要从链表头节点开始,顺着指针一一往下访问。如访问Red节点。

向链表中添加节点,只需修改添加位置前后节点的指针指向即可。如添加Green节点。

 

删除节点也一样,只需修改前后指针的指向即可。如删除Yellow节点。

 

  • 常用链表

  上面说的是单向链表,除了单向链表还有循环链表、双向链表等链表结构。

  循环链表也叫环形链表,让链表尾部的节点指针指向头节点。想要保存数量固定的最新数据时通常使用这种链表。

    

  双向链表的分割节点有两个指针,分别指向下一个节点和上一个节点,这种链表不仅可以从前往后,也可以从后往前遍历数据。

    

  双向链表相对于单向链表有两个缺点:一是指针数的增加会导致存储空间的增加,二是添加和删除数据时需要改变更多的指针。

  • 时间复杂度

  查找:O(n), 添加删除:O(1)。

在链表中添加删除数据比较方便,查找数据比较耗时。

3. 数组

  • 结构

 数组有若干和数据组成,如下。a可认为为数组起始地址。

 

数组中的数据按顺序存在在内存的连续空间内。

  • 操作

由于数据在内存中是连续的,所以每个元素的地址可以通过数组起始地址和数据下标算出,即可直接访问目标数据(随机访问)。

    向数组中添加数据,要把已有数据一个一个移开,如把Green加到第二个位置,需要将Red、Yellow向后移一个。(确保尾部有足够的存储空间)

     

  从数组中删除数据,首先移除目标数据,然后将后面的数据一个一个向前移。

  • 时间复杂度

访问:O(1), 添加删除:O(n)

数组访问目标数据比较方便,添加删除数据比较耗时。

  • 数组与链表比较

4. 栈

  • 结构

栈也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。

  • 操作

向栈中添加数据,数据放在最上面。

从栈中取出数据时,从最上面,也就是最新的数据开始取出。

  • 说明

栈是一种后进先出的结构,称为LIFO。

应用:括号匹配

 

posted @ 2019-01-02 22:40  谦虚一点  阅读(478)  评论(0)    收藏  举报