简单软件方法/算法/思想

1.
银行家算法
详细链接
本质上是一种试探性的方法,尝试/遍历各种可能的分配方法,如果不会出现资源无法分配的情况,那么这种分配方法就是可行的。

这里面存在一对矛盾:运行一个线程(满足某个消费者),一部分资源就会被消耗,最终成为闲置/空闲/可获得的资源,这样其他的线程/消费者就能获得这些资源,从而原来某些需求过大的消费者/线程,在这个线程运行后,也能成为下一个可以运行的线程;但是,这上一个线程的运行,是必须进行的,也就是在上一个资源可能不太多的状态下,必须能够保证线程的正常运行/消费者被满足,才能释放出更多的资源,这就是一对矛盾。

解决这个矛盾,很简单的就是进行avaliable向量和need向量的减法,保证每次试探性的”运行/消费”时,available每个分量都>=0,”运行/消费” 之后,归还所持有的所有资源,available向量又能继续进行下一次试探性的减法,继续重复上面的步骤。

这种朴素的算法,根本没有考虑效率的问题,就是一种n平方复杂度的逐个遍历,但是如果是口算,不是机器计算,可以先从”整体看起来偏小的”向量开始进行这个减法。

上面某个资源分配状态下,能进行一种分配,不出现<0的分量,且最终所有消费者都”消费/运行”了一遍,就是一种成功的分配,这个状态就是安全状态,否则就是不安全状态。

2.
编译原理的文法相关:
命名空间:
文法: G[S]
G[S]的4个终结符号分别为: a , [ ]
非终结符: A
文法G[S]的内部定义: S→[L]|a 和 L→L,S|S (注意这里的逗号是终结符)
FIRST(S): 从非终结状态S进行的推导出的终结符号的集合的起始字符串
则能进行的运算:
S→[L]→[L,S]→[S,S]→[a,a]
S→a
可以看出FIRST(S)包含的就是[和a

3.
数据库的关系代数运算,离散数学相关
详细资料
连接是一种关系运算,是对关系的笛卡尔乘积做有条件的选择:
S⋈θR,其中θ表示任意条件
S和R都是一种关系/元组,笛卡尔成绩使得元组的维度增加,θ对笛卡尔乘积结果做了有条件选择
S×R是直接做笛卡尔乘积

4.
邻接矩阵,网/图的表示
邻接矩阵也是一种关系的表示方式,表示的是节点和节点之间的关系。
命名空间:
节点: 数字表示v1,v2,v3,v4,v5…
边: 关系表示,关系是两个节点之间的二元组,继续用矩阵的元素表示
邻接矩阵的行: 第i行,对应上面二元组的第一元,i等于节点的表示数字
邻接矩阵的行: 第j列,对应上面二元组的第二元,j等于节点的表示数字
矩阵的元素值: 值域空间{0,1},则表示无权图,有/无边(有向边);值域空间{N+},则表示有权图,数值是有向边的权值

5.
邻接表
邻接表的定义更为宽松,核心的描述可以是这样的:
命名空间:
节点: 数字表示v1,v2,v3,v4,v5…
边: 关系表示,可以用一个简单的结构体表示,结构体包含指向下一条边的链接,也包含边的末端节点的数值,以及权值等
节点数组:数组也是按照节点的数值作为下标,进行编排,每一个元素也可以用结构体实现,结构体包含节点的其它数值,以及指向相邻边的链表的指针。
对邻接表进行深度优先遍历时,如果每个节点不包含父节点的指针,必须使用栈,最终每个节点被访问次数是常量,每个边一次,总的时间复杂度n+e。
对邻接表进行广度优先遍历时,必须要使用队列,每个节点被访问的次数也是有常量上限的,每个边被访问一次就可以了,总的时间复杂度是n+e。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值