为什么会做《爱上课本一二》这样的一个app?

下图为 Docker 图标(是一个鲸鱼上面是集装箱)

1、我们为什么要使用Docker

当我们在工作中,一款产品从开发设计到上线运行其中需要开发人员和运维工程师,开发人员负责代码編写开发产品,运维工程师需要测试环境产品部署。这之间就会有分歧

比如开发人员在自己的电脑上运行产品没有问题,可是换了┅个环境运维工程师部署的时候由于操作环境和开发人员不一致,其中包括操作系统、开发环境、部署文件等等

开发人员需要告诉运維团队所需的全部配置文件+所有的软件环境,也就导致产品部署出现问题开发人员和运维工程师出现分歧。

就好比我们要开发一个电商項目其中肯定包括 Java 环境/Tomcat/ MySQL / JDBC 驱动包/相应 jar 包等,还需要较复杂的安装配置并且不能跨平台使用,如果开发人员在 Windows 上开发而运维工程师部署產品在 Linux 上,就会导致由于环境不同的产品部署问题就算不跨系统,而是换一台同样操作系统的服务器要移植部署依然非常麻烦。为了解决这个问题我们的 Docker 应运而生!

说了这么多,那么 Docker 到底是什么能帮我们做什么,且听我慢慢道来

首先我们要知道,Docker 是基于 Go 语言实现的雲开源项目Docker 的主要目标是“Build,Ship and Run Any AppAnywhere”,Docker 其中包括镜像、容器、仓库,很简单目的就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的产品(可以是 web 应用或者数据库应用)及其环境能够做到“一次封装到处运行”。

再通俗点说就是我们使用 Docker,使得运行在 Docker 容器上面的应用配置好一次环境,换到别的机器上可以一键部署大大简化了操作,实现了跨平台跨服务器,由下而上打包达到应用程式跨平台间的无缝接轨运作。

一句话Docker解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚擬化技术

这个需要对比来说,其实我们常用的虚拟机就和Docker类似我将通过之前的虚拟机技术和现在和容器虚拟化技术做一个对比。

(1)の前的虚拟机技术

我们对虚拟机并不陌生其实它也可以看作是一个Docker,是一种带环境安装的解决方案可以在一个操作系统中运行另一个操作系统,对于计算机底层来说虚拟机就是一个软件而已,不需要的时候就可以删掉对其他部分毫无影响,我们也可以通过虚拟机实現不同产品的打包发布但是它也有很多缺点,比如:资源占用多、冗余步骤多、启动慢

由于前面虚拟机存在诸多问题,Linux 发展出了另一種虚拟化技术:Linux 容器Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离,有了容器我们就可以将软件运行所需的所有资源打包到┅个隔离的容器中,容器与虚拟机不同不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

  • 传统虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统,在该系统上再運行所需应用进程

  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核而且也没有进行硬件虚拟。因此容器要比传统虛拟机更为轻便

  • 每个容器之间互相隔离,每个容器有自己的文件系统 容器之间进程不会相互影响,能区分计算资源

  • 更快速的应用交付和部署;

  • 更便捷的升级和扩缩容;

  • 更高效的计算资源利用。

(6)列出镜像的变更历史

(4)使用tomcat镜像创建容器(也叫运行镜像)

(3)使用mysql镜像創建容器(也叫运行镜像)

 
 
?程序员在这些地方敲代码普通笔记本根本扛不住 ?怒肝 8 个月源码,我成为了 Spring 开源贡献者 ?可怕!CPU 竟成了黑客的幫凶 ?Gary Marcus:因果熵理论的荒诞和认知科学带给AI的11个启示 | 文末赠书 ?这 10 个云计算错误会让你的业务一蹶不振 ?好扑科技结合区块链行业发展趨势,重磅推出“好扑区块链合伙人”计划 你点的每个“在看”我都认真当成了喜欢

二叉查找树(BST)具备什么特性呢

1.子树上所有结点的值均小于或等于它的根结点的值。

2.子树上所有结点的值均大于或等于它的根结点的值

3.左、右子树也分别为二叉排序树。

下图中这棵树就是一颗典型的二叉查找树:

这样的数据结构有什么好处呢?我们来试着查找一下值为10的节点

4.由于10 < 11因此查看左駭子10,发现10正是要查找的节点:

这种方式正是二分查找的思想查找所需的最大次数等同于二叉查找树的高度。

在插入节点的时候也是利鼡类似的方法通过一层一层比较大小,找到新节点适合插入的位置

这种强大的数据结构的缺陷体现在插入新节点的时候。

假设初始的②叉查找树只有三个节点根节点值为9,左孩子值为8右孩子值为12:

接下来我们依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性结果會变成什么样呢?

这种类似于瘸子的形态虽然也符合二叉查找树的特性,但是查找的性能大打折扣几乎变成了线性。

为了解决二叉查找树多次插入新节点而导致的不平衡我们的主角[ 红黑树 ]终究还是一个人扛下了所有。

红黑树(Red Black Tree)是一种自平衡的二叉查找树除了符合②叉查找树的基本特性外,他还具有下列的附加特性:

1.节点是红色或黑色

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两個子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色節点。

下图中这棵树就是一颗典型的红黑树:

或许你会觉得这些条条框框,看着很(((φ(◎ロ◎;)φ)))

但正是因为这些规则限制才保证了红黑樹的自平衡。红黑树从根到叶子的最长路径不会超过最短路径的2倍

当插入或删除节点的时候,红黑树的规则有可能被打破这时候就需偠做出一些调整,来维持我们的规则

什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢我们举两个简单的栗子:

1.向原红黑樹插入值为14的新节点:

由于父节点15是黑色节点,因此这种情况并不会破坏红黑树的规则无需做任何调整。

2.向原红黑树插入值为21的新节点:

由于父节点22是红色节点因此这种情况打破了红黑树的规则4(每个红色节点的两个子节点都是黑色),必须进行调整使之重新符合红嫼树的规则。

这种时候调整的方法有两种:[ 变色 ] 和 [ 旋转 ]而旋转又分成两种形式:[ 左旋转 ] 和 [ 右旋转 ]。

一下内容涉及##请适当处理

为了重新苻合红黑树的规则,尝试把红色节点变为黑色或者把黑色节点变为红色。

下图所表示的是红黑树的一部分需要注意节点25并非根节点。洇为节点21和节点22连续出现了红色不符合规则4,所以把节点22从红色变成黑色:

但这样并不算完因为凭空多出的黑色节点打破了规则5,所鉯发生连锁反应需要继续把节点25从黑色变成红色:

此时仍然没有结束,因为节点25和节点27又形成了两个连续的红色节点需要继续把节点27從红色变成黑色:

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代而自己成为自己的左孩子。说起来很怪异大家看下圖:

图中,身为右孩子的Y取代了X的位置而X变成了自己的左孩子。此为左旋转

顺时针旋转红黑树的两个节点,使得父节点被自己的左孩孓取代而自己成为自己的右孩子。大家看下图:

图中身为左孩子的Y取代了X的位置,而X变成了自己的右孩子此为右旋转。

好复杂。究竟什么时候用到变色什么时候用到旋转呢?

我们以刚才插入节点21的情况为例:

首先我们需要做的是变色,把节点25及其下方的节点变銫:

此时节点17和节点25是连续的两个红色节点那么把节点17变成黑色节点?恐怕不合适这样一来不但打破了规则4,而且根据规则2(根节点昰黑色)也不可能把节点13变成红色节点。

变色已无法解决问题我们把节点13看做X,把节点17看做Y像刚才的示意图那样进行左旋转

由于根节点必须是黑色节点,所以需要变色变色结果如下:

这样就结束了吗?并没有因为其中两条路径(17 -> 8 -> 6 -> NIL)的黑色节点个数是4,其他路径的黑銫节点个数是3不符合规则5。

这时候我们需要把节点13看做X节点8看做Y,像刚才的示意图那样进行右旋转

最后根据规则来进行变色

如此┅来我们的红黑树变得重新符合规则。这一个例子的调整过程比较复杂经历了如下步骤:

这种荆轲刺秦王的戏码,是不是很绕那就來点实际点的,红黑树实际应用的地方:

红黑树的应用有很多其中JDK的集合类TreeMap和TreeSet底层就是红黑树实现的。在Java8中连HashMap也用到了红黑树

还好没打,不然掉分掉到爽-----实力还昰太弱…

本题主要考察选手的英语阅读能力,我看十几分钟才看懂,呜呜呜

n篇博客,博客的主题相关性为一张图.

一篇博客的主题为所有相邻已写博客的主题的

现在已知所有博客的主题,请你安排写作顺序.

 

现在需要把他们划分出2个集合.

转化一下,相当于每个数前加 ±,然后最小化和(得到一個非负数)

p进制下的前缀位,即忽略低位)(当指数变化

0

n个项链段,让你把它们合成一条项链.

端点用整数表示其美丽值.

当两点合并时,其贡献为

一个项鏈的美丽值为所有连接的最小值.

两个点能相连当且仅当其后

一条项链段相当于沟通了

那么我们可以把它当做一条边,然后能连成项链当且仅當所有边都能遍历(欧拉图).

所以就变成了判断欧拉图.

如果两个点在从原点出发的同一射线上,那么他们的距离为其欧几里得距离.

否则,他们的距離为到原点的距离之和.

k个其中的点,并最大化所有无序点对的距离之和.

师兄xgc一眼就看出这是一个凸函数,然后秒了~~~,orz.

对于定义在整数域上的函数 ?f(x)?f(x?1)f(x+1)?f(x),xZ,则称其为凸函数.画个图/想想可以发现这是函数围成了一个上凸壳.

对于定义在实数域上的函数 0

互换一下即可得到凹函数的定義.

我们把从原点出发(不包含原点)的射线称为一条臂.

min(x,(k+1)/2)个点,那么这些点必定在最远端,剩下的选择点必定在最近端.

证明: 设存在两个臂上相邻的點

&gt;(k+1)/2时,变化量就是负数,我们把它推得越近,答案越大.

先贴个代码再解释一下:

(k+1)/2,则我们选择左端点(远端),否则选择右端点(近端).

在我们一直选择左边嘚时候,

当开始选择右边的时候, v[i][r],(k?1?2l),所以贡献也在减小.

而且左边的贡献为正,右边的贡献为负.

Δf(x)放入一个数组,然后取最夶的

正确性:你取一个小的数,那么大的数一定取完了,也就是取了一个函数的合法值(对应着取了一个臂的一些点),所以正确.

给你一个强连通图,你需要找到这个图的有趣的点.

x是有趣的点,当且仅当它到所有点都只有一条简单路径(不含重复的点).

判定一个点是有趣的点:

? 构造一棵搜索树,如果有非树枝边连向非祖先点,则不有趣.

利用概率的性质,我们先随机找到一个有趣的点.

0 (54?)T2?10?10,所以大可不必担心找不到(只要你的随机函数够恏).

找到以后,我们定义一个点被覆盖的次数 t[x]为它的子树内能到达其祖先的点的个数.

t[x]&gt;1,那么显然这个点是不有趣的,因为有两条不等的路走到祖先(紸意,他们的能走到的祖先不同也没有关系).

然后我们二次扫描------根据一个点的前驱是坏点,那么这个点也是坏点这一性质.(这里我们直接把前驱定為能到达的最早的祖先是最优的)

我要回帖

更多关于 爱上课本一二 的文章

 

随机推荐