Spring工厂模式

前言

工厂模式是一种在工程中广泛应用的设计模式,对代码的解耦合起到了很大的作用。实际上,我们可以将Spring理解成封装了我们工程中大量重复代码的一种工具。众所周知,Spring中最重要的组件就是IOC,而IOC中非常重要的部分就是应用了工厂模式的代码。而工厂模式依赖于Java的反射机制,所以,我们从反射机制讲起,一步步了解Spring的Bean工厂。
Read more...

MVC-MVP-MVVM

复杂的软件必须有清晰合理的架构,否则难以开发与维护。MVC(Model-View-Controller)是最常见的软件架构之一,广泛应用于业界。在MVC的基础上衍生出了MVP以及MVVM架构,这些名词均是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式。

本文分别对其相关特性做了简要分析,并从图形角度简析其间区别与联系。
Read more...

抽象类versus接口

抽象导言

抽象性和具体性都是相对的,不是绝对的。简单说,概念的内涵越小,则其抽象程度就越高,其外延也越大,反之亦然。比如“人”比“男人”抽象一点,而“生物”又比“人”更抽象一点,“物质”则比“生物”更抽象。

抽象的概念是由具体概念依其“共性”而产生的,把具体概念的诸多个性排出,集中描述其共性,就会产生一个抽象性的概念。抽象思维,是人类思维达到高级阶段产生的一种能力,例如,当小孩子思维尚未成熟时,他们只能掌握具体概念,他们在学习代词“你、我、他”时往往遇到困难,因为代词具有较高的抽象性。

总之,抽象概念的外延大,内涵小,具体概念的外延小,内涵大。
Read more...

关于ios::sync_with_stdio(false)和cin.tie(nullptr)

前言

我们可以发现C++高效率解决的源码中有很多以下代码段:

1
2
3
4
5
6
7
static const auto io_sync_off = []() {
// turn off sync
std::ios::sync_with_stdio(false);
// untie in/out streams
std::cin.tie(nullptr);
return nullptr;
}();

那么ios::sync_with_stdio(false);和cin.tie(nullptr);到底咋C++效率问题上起什么作用呢?这篇文章简要说明其起源与用法。
Read more...

前向星与链式前向星

前向星

前向星是以存储边的方式来存储图,先将边读入并存储在连续的数组中,然后按照边的起点进行排序,这样数组中起点相同的边就能够在数组中进行连续访问了。
其有点在于实现简单,易于理解。缺点是在读入边后需要对所有边进行一次排序,带来了时间开销,实用性也较差。因此只适合离线算法。

链式前向星(实质为数组模拟链表)

链式前向星和邻接表类似,也是链式结构的结合,每个节点i均有一个链表,此链表内的数据均为以节点i为起点的所有边的集合(对比邻接表存的是顶点的集合),边的表示为一个四元组(to,w,next),其中to代表该条边的有向点对(w,v),w代表边上的权值,next指向下一条边。
调用的时候只要通过head[i]就能访问到由节点i出发的第一条边的编号,通过编号到edge数组进行索引可以得到边的具体信息,然后根据这条边的next域可以得到第二条边的编号,以此类推,直到next域为INF(这里的INF即head数组初始化的值,一般取-1即可)

Read more...

SPFA算法详解

SPFA算法介绍

SPFA算法全程为,Shortest Path Faster Algorithm,为Bellman-Ford算法的队列优化算分的别称,其最坏情况的复杂度与Bellman-Ford相同,为O(VE)
与BFS算法比较,复杂度相对稳定。但在稠密图中复杂度比迪杰斯特拉算法差。
对SPFA的一个很直观的理解就是由无权图的BFS转化而来。在无权图中,BFS首先到达的顶点所经历的路径一定是最短路(也就是经过的最少顶点数),所以此时利用数组记录节点访问可以使每个顶点只进队一次。但在带权图中,最先到达的顶点所计算出来的路径不一定是最短路。一个解决方法是放弃数组,此时所需时间自然就是指数级的。所以我们不能放弃数组,而是在处理一个已经在队列中且当前所得的路径比原来更好的顶点时,直接更新最优解。

Read more...
  • Copyrights © 2019-2024 鞠桥丹-QIAODAN JU
  • 访问人数: | 浏览次数:

请我喝杯蓝莓汁吧~

支付宝
微信