算法第四版 笔记

对象是能够承载数据类型的值的实体。所以对象都有三大只要特征:状态、标识和行为。对象的状态即数据类型中的值。对象的标识能够将一个对象区别于另一个对象。可以认为对象的标识就是它在内存中的位置。对象的行为就是数据类型的操作。数据类型的实现的唯一职责就是维护一个对象的身份。
引用时访问对象的一种方式。
每当用例调用new(),系统就会:为新的对象分配内存空间、调用构造函数初始化对象中的值、返回一个该对象的一个引用。
变量关联是指向对象的引用而非数据类的的值本身。原始数据类型指向值本身。

算法时间复杂度:算法输入值与执行时间的关系·。
空间复杂度:算法输入值与存储空间的关系。

排序

排序算法分为两类:函数调用所需的栈和固定数目的实例变量之外无需额外内存的原地排序算法,以及需要额外内存空间来存储另一份数组副本的其他排序算法。

优先队列

普通队列:数据先入先出。
优先队列:数据优先级高的先出,其他数据先入先出。使用场景:购物时,使用优先队列扣库存,会员用户的库存比先下单的普通用户先扣。

在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素。相应地,这些位置地元素又至少要大于等于数组中的另两个元素。
当一棵二叉树的每个节点都大于大于它的两个节点时,它被称为堆有序。相应的,在堆有序的二叉树中,每个节点都小于等于它的父节点(如果有的话)。从任意节点向上,我们都能得到一列非递减的元素;从任意节点向下,我们都能得到一列非递增的元素。
根节点是堆有序的二叉树中的最大节点。
二叉堆是一组能够用堆排序的完全二叉树排序的元素,并在数组中按照层级存储(不使用数组的第一个位置)。

二叉堆和三叉堆

hash()只使用了hashCode()返回值的低位

这个是因为 key.hashCode() & 0x7fffffff  与运算只算了 hashCode值后16为比 0x7fffffff,由于0x7fffffff 的前16为都为0,故次语句执行结果只关系后16位。故称hash()只使用了hashCode()返回值的低位。

散列表性能对比

在这里插入图片描述

图是由一组顶点和一组能够将两个顶点相连的边组成的。
特殊的图:1、自环:一天连接一个顶点和其自身的边。2、连接同一对顶点的两条边称为平行边。
数学家常常将含有平行边的图称为多重图,而将没有平行边或自环的图称为简单图。
当两个顶点通过一条边相连时,我们称这两个顶点式相邻的。并称该连接依附于这两个顶点。
某个顶点的**度数**即为依附于它的边的总数。
子图是由一副图的所有边的一个子集(以及它们所依附的所有顶点)组成的图。
在图中,**路径**是由边顺序连接的一系列顶点。简单路径是一条没有重复顶点的路径。**环**是一条至少含有一条边且起点和终点相同的路径。**简单环**是一条(除了起点和终点是必须相同之外)不含有重复顶点和边的环。路径或者环的**长度**为其中所包含的边数。
如果从任意一个顶点都存在一条路径到达另一个任意顶点,我们称这幅图是**连通图**。一副非连通的图由若干连通的部分组成,它们都是其极大连通子图。
无环图是一种不包含环的图。
对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一颗普通树,通常称为**生成树**。
树是一副无环连通图。互不相连的树组成的集合称为**森林**。连通图的生成树是它的一副子图,它含有图中的所有顶点且是一棵树。图的生成树森林是它的所有连通子图的生成树的集合。
图的**密度**是指已经连接的顶点对占所有可能被连接的顶点对的比例。一般来说,如果一副图中不同的边的数量只占顶点总数V的一小部分,那么我们就认为这幅图是稀疏的,否则就是稠密的。
二分图是一种能够将所有结点分为两部分的图,其中图的每条边所连接的两个顶点都分别属于不同的部分。
连通性:有一条路径连接v和w,则它们就是连通的。

图的邻接矩阵

图的邻接矩阵表示为:一个一维数组存放顶点;一个二维数组存放边。

无向图:一个数组表示顶点,创建顶点的二维数组。
两顶点之间有边记1,无边记0。

在这里插入图片描述

有向图:一个数组表示顶点,创建顶点的二维数组,顶点A指向顶点B的节点记1。如图:

在这里插入图片描述
在有向图的邻接矩阵中,

  1. 第i行含义:以节点Vi 为尾的弧(即出度边)。
  2. 第i列含义:以节点Vi 为头的弧(即入度边)。
  3. 有向图的邻接矩阵可能是不对称的。
  4. 顶点的出度=第i行元素之和(为1的元素之和)。
  5. 顶点的入度=第i列元素之和。
  6. 顶点的度=第i行元素之和+第i列元素之和。

有权图
即每条边都带有一个权值(数字)
在这里插入图片描述
邻接表数组
使用一个顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表(见算法 P348)。
在这里插入图片描述

深度优先算法(DFS):深度优先搜索标记与起点连通的所有顶点所需的时间和顶点的度数之和成正比。
广度优先算法(BFS):广度优先搜索所需的时间在最坏情况下和V+E(顶点数和边数)成正比。
深度强调结果,广度强调过程:深度只要一个结果,广度需要一个最适合的结果,所以深度适合。广度一般都是那种找到最大或者最小的结果。

有向图

定义:一副有方向性的图(或有向图)是由一组顶点和一组有向图的边组成的,每条有方向的边都连接着有序的一对顶点。
我们称一条有向边由第一个顶点指出并指向第二个顶点。在一副有向图中,一个顶点的出度为由该顶点指出的边的总数;一个顶点的入度为指向该顶点的边的总边。
定义:在一副有向图中。有向路径由一系列顶点组成,对于其中的每个顶点都存在一条有向边从它指向序列中的下一个顶点。有向环为一条至少含有一条边且起点和终点相同的有向路径。简单有向环是一条(除了起点和终点必须相同之外)不含有重复的顶点和边的环。路径或者环的长度即为其中所包含的边数。
有向图中,深度优先搜索标记由一个集合的顶点可达的所有顶点所需的时间与被标记的所有顶点的出度之和称正比。
一副优先图中含有的环的数量可能是图的大小的指数级别。
有向无环图就是一副不含有环的有向图。
当且仅当一副有向图是无环图时它才能进行拓扑排序。
一副有向无环图点的拓扑排序即为所有顶点的逆后序排列。
使用深度优先搜索对有向无环图进行拓扑排序所需的时间和V(顶点数)+E(边数)成正比。

有向图的强连通性:两个顶点v和w互相可达。即存在一条从v到w的有向路径,也存在一条从w到v的有向路径。如果一副图的任意两个顶点都是强连通的,则称这副有向图也是强连通的。
  1. 自反性:任意顶点v和自己都是强连通的。
  2. 对称性:如果v和w是强连通的,那么w和v也是强连通的。
  3. 传递性:如果v和w是强连通的且w和x也是强连通的,那么v和x也是强连通的。
    作为一种平等关系,强连通性将所有顶点分为了一些平等的部分,每个部分都是由相互均为强连通的顶点的最大子集组成的。我们将这些子集称为强连通分量。
    使用深度优先搜索查找给定有向图G的反向图G1,根据由此得到的所有顶点的逆后序再次用深度优先搜索处理有向图G(Kosaraju算法),其构造函数的每一次递归调用所标记的顶点都在同一个强连通分量之中。
    有向图G的传递闭包是由相同的一组顶点组成的另一幅有向图,在传递闭包中存在一条从v指向w的边当且仅当在G中w是从v可达的。

最小生成树

加权图是一种为每条边关联的一个权值或是成本的图模型。
图的生成树是它的一棵含有其所有顶点的无环连通子图。一副加权无向图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树。
最小生成树约定:
  1. 只考虑连通图
  2. 边的权重不一定表示距离
  3. 边的权重可能是0或者负数
  4. 所有边的权重各不相同
    图的一种切分是将图的所有顶点分为两个非空且不重复的两个集合。横切边是一条连接两个属于不同集合的顶点的边。
    在一副加权图中。给定任意的切分。它的横切边中的权重最小者必然属于图的最小生成树。
    切分定理是解决最小生成树问题的所有算法的基础。更确切的说,这些算法都是一种贪心算法:使用切分定理找到最小生成树的一条边,不断重复直到找到最小生成树的所有边。这些算法相互之间的不同之处在于保存切分和判定权权重最小的横切边的方式,但它们都是一下性质的特殊情况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值