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

原文链接: https://me.csdn.net/bjweimengshu

目录

时间复杂度

空间复杂度

数组 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)

 

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