算法与数据结构-数组/链表/堆/栈/队列的存储

序言

之前华为来交大宣讲的时候,曾参加了一次现场交流,当时面试官给我出了一个三维数据存储的问题,然后变着法的问如果要进行数据的怎样怎样变动需要使用什么方式来存储,由于当时对各种数据结构的存储方式和特点掌握得不好没能很顺畅的回答,在这对各种数据结构的存储方式做个简单总结。


几个概念

  • 数据结构:描述对象间逻辑关系的学科

  • 数据存储:数据在计算机中的存储方式

  • 数据存储的分类:

    • 顺序存储: 物理连续。把数据存储在一块连续的存储介质上,数组即典型的顺序存储

    • 非顺序存储:逻辑连续。各个数据不一定存在连续的位置上,只要能连起来就行了,链表就是典型的非顺序存储


1. 数组

  • 顺序存储

  • 数组使用一块连续的内存空间中保存数据

  • 数组是最基本的数据结构,保存数据的个数和空间从一开始就是确定的

  • 数组操作的时间复杂度

    • 访问第n个数据的时间复杂度为O(1)

    • 查找指定数据的时间复杂度是O(N)

    • 数组中插入或删除数据的时间复杂度[与数据个数N有关]

      • 最好情况是O(1)

      • 最坏情况是O(N)


2. 链表

  • 非顺序存储

  • 链表是在非连续的内存单元中保存数据

    • 可以是连续的也可以是不连续的,一般来说是不连续的
  • 链表保存数据的个数和空间均不需要提前指定,当需要保存数据时分配一块内存并将这块内存插入链表中

  • 链表中总有一个节点指向NULL

  • 链表操作的时间复杂度

    • 访问第n个数据的时间复杂度是O(N)

    • 查找指定数据的时间复杂度是O(N)

    • 插入和删除数据的时间复杂度是O(1)

      • 只需调整指针即可
  • 链表常见分类:

    • 单向链表

    • 双向链表

    • 循环链表(循环单链表和循环双链表)


3. 堆和栈

数据结构中的堆和栈与操作系统中的堆和栈是不同的概念

操作系统中内存分类:全局区,局部变量区,常量区,堆区,栈区,程序代码区等

(3.11) 操作系统中的堆

[1] 由程序员分配释放,效率较栈低但是可分配空间大而且操作灵活

[2] 堆:由低地址向高地址扩展的数据结构,是不连续的内存区域,分配方式类似于链表

[3] 存放在二级缓存

(3.12) 数据结构中的堆

[1] 堆是树形数据结构,每个节点都有一个值。有二叉树和K叉树堆

[2] 堆的特点:分为大顶堆和小顶堆。根节点的两个子树也是堆。数据操作比较随意

[3] 顺序存储或非顺序存储,应用场景包括堆排序、优先队列

(3.21) 操作系统中的栈

[1] 栈由系统自动分配,程序员无法控制。速度快但可支配空间小

[2] 栈:由高地址向低地址扩展的数据结构,是连续的内存区域,操作方式类似于数据结构中的栈

[3] 存放在一级缓存

(3.22)数据结构中的栈

[1] 栈是一种先进后出的数据结构(LIFO),可以用数组或者链表来实现

[2] 栈有顺序栈链栈两种存储结构,所以顺序存储或者非顺序存储,即顺序存储和链式存储

[3] 数据操作:只能在栈顶进行插入和删除操作


4. 队列

  • 顺序存储或非顺序存储

  • 队列有顺序队列和链队

  • 队列是一种先进先出的数据结构(FIFO),可以用数组或者链表来实现

  • 数据操作:只允许在队尾添加数据,队头删除数据(有一种双端队列,两端都可以插入和删除)



Acknowledgements:
http://blog.csdn.net/hairetz/article/details/4141043/
http://blog.csdn.net/amork/article/details/7258216

2017.08.25

你可能感兴趣的:(算法与数据结构)