数据结构与算法-基础整理

一、两种复杂度

1.时间复杂度

常用数据结构复杂度
在这里插入图片描述

  多个复杂度同时存在时,只看最高的复杂度


时间复杂度曲线:
在这里插入图片描述

感慨: 到 2^n以及n!简直逆天
常用时间复杂度
二分查找:o(logn)
二叉树遍历-前序、中序、后序:o(n)
二叉搜索树遍历-前序、中序、后序:o(logn)
图的时间复杂度:o(n)
DFS、BFS搜索算法:o(n)


2.空间复杂度

  如果是数组,一维数组的长度就是空间复杂度o(n)。二维数组的空间复杂度o(n^2)。
  如果是递归,递归的最大深度就是空间复杂度。
  如果是递归里面开了数组,那就取两者最大值。


二、两种底层实现

1.数组

数组末尾添加

在这里插入图片描述
指定位置添加

在这里插入图片描述
在这里插入图片描述

2.链表

时间复杂度:
插入、添加、删除:o(n)
查询:o(1)
链表添加节点
在这里插入图片描述
链表删除节点
在这里插入图片描述
双链表

在这里插入图片描述

三、基础数据结构

1.栈

特点:后进先出,添加、删除皆为 O(1)
Java中利用集合操作栈,可以采用LinkedList和Stack
LinkedList是双端队列,采用双链表实现。它同时支持push和pop操作。
**在这里插入图片描述

2.队列

特点:先进先出,添加、删除皆为 O(1)
在这里插入图片描述

Queue源码
区别:
add,remove,element这组抛出异常
offer,poll,peek这组返回值

public interface Queue<E> extends Collection<E> {
    boolean add(E e);//添加
    boolean offer(E e);//添加
    E remove();//移除
    E poll();///移除
    E element();//查看
    E peek();//查看
}

3.双端队列

两端都可以进出的队列,特点:插入和删除都是 O(1) 操作
java集合里面是LinkedList实现
在这里插入图片描述

4.跳表

跳表特点:

  • 只能用于元素有序 跳表对标的是平衡树和二分查找
  • 跳表的插入、删除、搜索的时间复杂度为o(logn)
  • 跳表空间复杂度o(n)
  • 优势是原理简单、容易实现、方便扩展、效率更高。
  • 在热门的项目里面用来替代平衡树,如Redis、LevelDB等。

在这里插入图片描述
跳表时间复杂度
假如要寻找8
寻找路径:4->6->7
寻找次数3
㏒2 8=3
时间复杂度为㏒2,即为o(longn)

跳跃表详情


5.哈希表

  哈希表(Hashtable),也叫散列表,是根据关键码值(Keyvalue)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作散列函数(HashFunction),存放记录的数组叫作哈希表(或散列表)。
  常用于缓存、键值对存储

  • 在java中的集合中为map和set
  • Map:key-value对,key不重复
  • Set:不重复元素的集合

HashSet底层用的HashMap
在这里插入图片描述
HashSet的add操作底层就是HashMap的put操作
在这里插入图片描述
HashMap底层实现和原理
Java集合容器面试题

TreeMap和TreeSet都是采用红黑树实现
时间复杂度

  如果哈希表的size太小或者经常发生哈希碰撞,哈希表就会退化成链表,时间复杂度就变为o(n)了。


6.树

为啥会有树?
  单链表的查询时间复杂度为o(n).如果想要加速,那么得进行升维,从一维升维二维。可以变为跳表,时间复杂度为o(logn)。也可以变为树。树就是单链表有多个子节点。

在这里插入图片描述

树的遍历
前序:根左右
中序:左根右
后序:左右根
树的遍历代码实现:递归和迭代

二叉搜索树
查询和插入都是o(logn)
在这里插入图片描述
二叉搜索树的遍历
  类似二分查找,每次遍历都会筛掉一半的节点,所以时间复杂度
为o(logn)

二叉搜索树的遍历
在这里插入图片描述

  最坏情况,二叉搜索树都是单分支,退化成链表,时间复杂度就变为o(n)了。


7.图

区别树和图就是看是否有环
  图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。

无向无权图
在这里插入图片描述
有向无权图
在这里插入图片描述

拓扑排序

12篇学通csharp网络编程——第四篇 TCP应用编程 12篇学通csharp网络编程——第三篇 HTTP应用编程(下) 12篇学通csharp网络编程——第二篇 HTTP应用编程(上) 12篇学通csharp网络编程——第一篇 基础之进程线程 Lucene(1)lucene,你也会(7篇)——第一篇 快速入门 MongoDB(8)8天学通MongoDB——第八天 驱动实践 8天学通MongoDB——第七天 运维技术 8天学通MongoDB——第六天 分片技术 8天学通MongoDB——第五天 主从复制 8天学通MongoDB——第四天 索引操作 8天学通MongoDB——第三天 细说高级操作 8天学通MongoDB——第二天 细说增删查改 8天学通MongoDB——第一天 基础入门 UML系列(4)团队沟通利器之UML——类图 团队沟通利器之UML—— 序列图 团队沟通利器之UML——用例图 团队沟通利器之UML——活动图 wcf系列(5)wcf系列学习5天速成——第五天 服务托管 wcf系列学习5天速成——第四天 wcf之分布式架构 wcf系列学习5天速成——第三天 事务的使用 wcf系列5天速成——第二天 binding的使用(2) wcf系列5天速成——第一天 binding的使用(1) wpf系列(8)8天入门wpf—— 第八天 最后的补充 8天入门wpf—— 第七天 画刷 8天入门wpf—— 第六天 细说控件 8天入门wpf—— 第五天 数据绑定 8天入门wpf—— 第四天 模板 8天入门wpf—— 第三天 样式 8天入门wpf—— 第二天 xaml详解 8天入门wpf—— 第一天 基础概念介绍 并行开发(8)8天玩转并行开发——第八天 用VS性能向导解剖你的程序 8天玩转并行开发——第七天 简要分析任务与线程池 8天玩转并行开发——第六天 异步编程模型 8天玩转并行开发——第五天 同步机制(下) 8天玩转并行开发——第四天 同步机制(上) 8天玩转并行开发——第三天 plinq的使用 8天玩转并行开发——第二天 Task的使用 8天玩转并行开发——第一天 Parallel的使用 多线程系列(5)5天不再惧怕多线程——第五天 线程池 5天不再惧怕多线程——第四天 信号量 5天不再惧怕多线程——第三天 互斥体 5天不再惧怕多线程——第二天 锁机制 5天不再惧怕多线程——第一天 尝试Thread 经典算法专题(21)经典算法题每日演练——第二十一题 十字链表 经典算法题每日演练——第二十题 三元组 经典算法题每日演练——第十九题 双端队列 经典算法题每日演练——第十八题 外排序 经典算法题每日演练——第十七题 Dijkstra算法 经典算法题每日演练——第十六题 Kruskal算法 经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 经典算法题每日演练——第十题 树状数组 经典算法题每日演练——第九题 优先队列 经典算法题每日演练——第八题 AC自动机 经典算法题每日演练——第七题 KMP算法 经典算法题每日演练——第六题 协同推荐SlopeOne 算法 经典算法题每日演练——第五题 字符串相似度 经典算法题每日演练——第四题 最长公共子序列 经典算法题每日演练——第三题 猴子吃桃 经典算法题每日演练——第二题 五家共井 经典算法题每日演练——第一题 百钱买百鸡 开发利器系列(1)介绍一个小工具 Linqer 那点所谓的分布式(2)那点所谓的分布式——memcache 那点所谓的分布式——redis 树结构专题(5)6天通吃树结构—— 第五天 Trie树 6天通吃树结构—— 第四天 伸展树 6天通吃树结构—— 第三天 Treap树 6天通吃树结构—— 第二天 平衡二叉树 6天通吃树结构—— 第一天 二叉查找树 算法速成系列(15)算法系列15天速成——第十五天 图【下】(大结局) 算法系列15天速成——第十四天 图【上】 算法系列15天速成——第十三天 树操作【下】 算法系列15天速成——第十二天 树操作【中】 算法系列15天速成——第十一天 树操作(上) 算法系列15天速成——第十天 栈 算法系列15天速成——第九天 队列 算法系列15天速成——第八天 线性表【下】 算法系列15天速成——第七天 线性表【上】 算法系列15天速成——第六天 五大经典查找【下】 算法系列15天速成——第五天 五大经典查找【中】 算法系列15天速成——第四天 五大经典查找【上】 算法系列15天速成——第三天 七大经典排序【下】 算法系列15天速成——第二天 七大经典排序【中】 算法系列15天速成——第一天 七大经典排序【上】 算法洗脑系列(8)算法洗脑系列(8篇)——第八篇 概率思想 算法洗脑系列(8篇)——第七篇 动态规划 算法洗脑系列(8篇)——第六篇 回溯思想 算法洗脑系列(8篇)——第五篇 分治思想 算法洗脑系列(8篇)——第四篇 枚举思想 算法洗脑系列(8篇)——第三篇 贪心思想 算法洗脑系列(8篇)——第二篇 递归思想 算法洗脑系列(8篇)——第一篇 递推思想 天籁数学(3)天籁数学——数列篇(3) 天籁数学——数列篇(2) 天籁数学——数列篇(1) 图形图像(1)玩玩图形图像——第一篇:图片灰度化 小爬虫系列(4)玩玩小爬虫——抓取时的几个小细节 玩玩小爬虫——抓取动态页面 玩玩小爬虫——试搭小架构 玩玩小爬虫——入门
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值