数据结构基础之数组、链表、栈、队列、哈希表的学习笔记

目录

时间复杂度

空间复杂度

数组 array

链表 linked list

 

栈  stack

队列  stack

哈希表  hash table


Note:本篇内容总结自《漫画算法》

时间复杂度

         把程序的相对执行时间函数 T(n) 简化为一个数量级,用大写的O表示,T(n)=O(f(n))。

时间复杂度的推导原则:

  • 如果运行时间是常数量级,则用常数1表示;
  • 只保留时间函数中的最高阶项;
  • 如果最高阶项存在,则省去最高阶项前面的系数;

常见的时间复杂度:O(1) < O(logn) < O(n) < O(n^{2})

 

空间复杂度

         对一个算法在运行过程中临时占用存储空间大小的量度,用大写的O表示,S(n)=O(f(n))。

时间复杂度的推导:

  • 常量空间:当算法的存储空间大小固定,和输入规模没有直接的关系是,空间复杂度记为 O(1) ;
  • 线性空间:算法分配的空间是一个线性的集合(如数组),并且集合大小和输入规模 n 成正比,空间复杂度记为 O(n);
  • 二维空间:算法分配的空间是一个二维数组集合,并且集合的长度和宽度都与输入规模 n 成正比,空间复杂度记为 O(n^{2}{\color{Red} }{\color{Red} });

常见的空间复杂度:O(1) < O(n) < O(n^{2})

 


数组 array

定义:有限个相同类型的变量所组成的有序集合

特点:

  • 数组中的每个元素有自己的下标,从0开始,直到数组长度-1 ;
  • 在内存中顺序存储(在内存中占用了连续完整的存储空间),可以很好的实现逻辑上的顺序表
  • 数组实际元素的数量可能小于数组的长度 ;
  • 适合读操作多,写操作少的场景 ;
  • 数组属于线性的数据结构

 

链表 linked list

定义:在物理上 非连续、非顺序 的数据结构,由若干节点组成。

单向链表:每一个节点包含两部分。一部分是存放数据的变量 data , 另一部分是指向下一个节点的指针 next ;

双向链表:除了 data 和 next 指针,还有指向前置节点的 prev 指针

特点:

  • 在内存中随机存储(每个节点分布在内存的不同位置,依靠 next 指针关联起来),可以很好的实现逻辑上的顺序表
  • 链表中的数据只能根据指针按顺序进行访问 ;
  • 适合插入删除多的场景 ;
  • 链表属于线性的数据结构

 


 

栈  stack

定义:是一种线性数据结构,栈中的元素只能先入后出。

特点:

  • 栈中的元素只能先入后出(First In Last Out,简称FILO)
  • 最早进入的元素存放的位置叫做 栈底(bottom),最后进入的元素存放的位置叫做 栈顶(top) ;
  • 栈属于线性数据结构,既可以用数组来实现,也可以用链表来实现
  • 出栈和入栈只会影响到最后一个元素
  • 栈的输出顺序和输入顺序相反,通常用于“历史”的回溯

 

栈的基本操作:

  • 入栈(push):只允许从栈顶一侧放入元素,新元素的位置将会称为新的栈顶。
  • 出栈(pop):只有栈顶中元素才允许出栈,出栈元素的前一个元素将会称为新的栈顶

举例:一段封闭,一段开口的圆筒,往圆筒里放入乒乓球。先放入的靠近圆筒底部,后放入的靠近圆筒入口。要想取出乒乓球,只能按照和放入顺序相反的顺序来取。

 

队列  stack

定义:是一种线性数据结构,队列中的元素只能先入先出。

特点:

  • 队列中的元素只能先入先出(First In First Out,简称FIFO)
  • 队列的出口端叫做 队头(front), 队列的入口端叫做 队尾(rear) ;
  • 队列属于线性数据结构,既可以用数组来实现,也可以用链表来实现
  • 在物理存储上,队尾的位置也可以在队头之前
  • 队列的输出顺序和输入顺序相同,通常用于“历史”的回放

 

队列的基本操作:

  • 入队(enqueue):只允许在队尾的位置放入元素,新元素的下一个位置将会称为新的队尾。
  • 出栈(dequeue):只允许在队头一侧移出元素,出队元素的后一个元素将会称为新的队头。

举例:公路上的一条单行隧道,所有通过隧道的车辆只允许从隧道入口驶入,从隧道出口驶出,不允许逆行。要想让车辆驶出隧道,只能按照他们驶入隧道的顺序来驶出。

 

 

哈希表  hash table

定义:也叫散列表,本质上是一个数组。提供了键(key)和值(value)的映射关系。

哈希函数:通过哈希函数,可以把字符串或其他类型的 Key,转化成数组的下标 index。

哈希冲突:不同的 Key 通过哈希函数获得的下标有可能相同

 

哈希表的基本操作:

  • 写操作(put):在表中插入新的键值对。如调用 hashMap.put("002931","旺旺"),意思是插入一组Key为002931,Value为王五的键值对。
  • 读操作(get):通过给定的 Key ,在哈希表中查找对应的 Value。

 


性能对比

 查找更新插入删除
数组       O(1)         O(1)     O(n)O(n)
链表O(n)O(1)O(1)O(1)
  O(1)O(1)
队列  O(1) (循环队列)O(1) (循环队列)
哈希表O(1)约等于O(1)约等于O(1)约等于O(1)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值