HDU1512 (左偏树)

2.1.2 可并堆的定义

可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作:

H ← Merge(H1,H2)

Merge( ) 构造并返回一个包含H1H2所有元素的新堆H

 

O(n),用它来实现可并堆,则合并操作必然成为算法的瓶颈。左偏树(Leftist Tree)、二项堆(Binomial Heap) Fibonacci(Fibonacci Heap) 都是十分优秀的可并堆。本文讨论的是左偏树,在后面我们将看到各种可并堆的比较。

2.2 左偏树的定义

左偏树(Leftist Tree)是一种可并堆的实现。左偏树是一棵二叉树,它的节点除了和二叉树的节点一样具有左右子树指针( left, right )外,还有两个属性:键值和距离(dist)。键值上面已经说过,是用于比较节点的大小。距离则是如下定义的:

节点i称为外节点(external node),当且仅当节点i的左子树或右子树为空 ( left(i) = NULLright(i) = NULL );节点i距离(dist(i))是节点i到它的后代中,最近的外节点所经过的边数。特别的,如果节点i本身是外节点,则它的距离为0;而空节点的距离规定为-1 (dist(NULL) = -1)。在本文中,有时也提到一棵左偏树的距离,这指的是该树根节点的距离。

 

左偏树满足下面两条基本性质:

 

[性质1] 节点的键值小于或等于它的左右子节点的键值。

key(i)≤key(parent(i))  这条性质又叫堆性质。符合该性质的树是堆有序(Heap-Ordered)。有了性质1,我们可以知道左偏树的根节点是整棵树的最小节点,于是我们可以在O(1) 的时间内完成取最小节点操作。

 

[性质2] 节点的左子节点的距离不小于右子节点的距离。

dist(left(i))≥dist(right(i)) 这条性质称为左偏性质。性质2是为了使我们可以以更小的代价在优先队列的其它两个基本操作(插入节点、删除最小节点)进行后维持堆性质。在后面我们就会看到它的作用。

 

这两条性质是对每一个节点而言的,因此可以简单地从中得出,左偏树的左右子树都是左偏树。

由这两条性质,我们可以得出左偏树的定义:左偏树是具有左偏性质的堆有序二叉树

 

 

2.3 左偏树的性质

在前面一节中,本文已经介绍了左偏树的两个基本性质,下面本文将介绍左偏树的另外两个性质。

 

我们知道,一个节点必须经由它的子节点才能到达外节点。由于性质2,一个节点的距离实际上就是这个节点一直沿它的右边到达一个外节点所经过的边数,也就是说,我们有

 

[性质3] 节点的距离等于它的右子节点的距离加1

dist( i ) = dist( right( i ) ) + 1 外节点的距离为0,由于性质2,它的右子节点必为空节点。为了满足性质3,故前面规定空节点的距离为-1

 

我们的印象中,平衡树是具有非常小的深度的,这也意味着到达任何一个节点所经过的边数很少。左偏树并不是为了快速访问所有的节点而设计的,它的目的是快速访问最小节点以及在对树修改后快速的恢复堆性质。从图中我们可以看到它并不平衡,由于性质2的缘故,它的结构偏向左侧,不过距离的概念和树的深度并不同,左偏树并不意味着左子树的节点数或是深度一定大于右子树。

 

下面我们来讨论左偏树的距离和节点数的关系。

 

[引理1] 若左偏树的距离为一定值,则节点数最少的左偏树是完全二叉树。

证明:由性质2可知,当且仅当对于一棵左偏树中的每个节点i,都有 dist(left(i)) = dist(right(i)) 时,该左偏树的节点数最少。显然具有这样性质的二叉树是完全二叉树。

 

[定理1] 若一棵左偏树的距离为k,则这棵左偏树至少有2k+1-1个节点。

证明:由引理1可知,当这样的左偏树节点数最少的时候,是一棵完全二叉树。距离为k的完全二叉树高度也为k,节点数为2k+1-1,所以距离为k的左偏树至少有2k1-1个节点。

 

作为定理1的推论,我们有:

 

[性质4] 一棵N个节点的左偏树距离最多为ëlog(N+1)û -1

证明:设一棵N个节点的左偏树距离为k,由定理1可知,N ≥ 2k+1-1,因此k ≤ ëlog(N+1)û -1

 

有了上面的4个性质,我们可以开始讨论左偏树的操作了。

三、左偏树的操作

本章将讨论左偏树的各种操作,包括插入新节点、删除最小节点、合并左偏树、构建左偏树和删除任意节点。由于各种操作都离不开合并操作,因此我们先讨论合并操作。

3.1 左偏树的合并

C ← Merge(A,B)

Merge( ) A,B两棵左偏树合并,返回一棵新的左偏树C,包含AB中的所有元素。在本文中,一棵左偏树用它的根节点的指针表示。

在合并操作中,最简单的情况是其中一棵树为空(也就是,该树根节点指针为NULL)。这时我们只须要返回另一棵树。

 

AB都非空,我们假设A的根节点小于等于B的根节点(否则交换A,B),把A的根节点作为新树C的根节点,剩下的事就是合并A的右子树right(A) B了。

right(A) ← Merge(right(A), B)

 

合并了right(A) B之后,right(A) 的距离可能会变大,当right(A) 的距离大于left(A) 的距离时,左偏树的性质2会被破坏。在这种情况下,我们只须要交换left(A) right(A)

dist(left(A)) > dist(right(A)),交换left(A) right(A)

 


最后,由于right(A) 的距离可能发生改变,我们必须更新A的距离:

dist(A) ← dist(right(A)) + 1

不难验证,经这样合并后的树C符合性质1和性质2,因此是一棵左偏树。至此左偏树的合并就完成了。

 

我们可以用下面的代码描述左偏树的合并过程:

 

Function Merge(A, B)

       If A = NULL Then return B

       If B = NULL Then return A

       If key(B) < key(A) Then swap(A, B)

       right(A) ← Merge(right(A), B)

       If dist(right(A)) > dist(left(A)) Then

              swap(left(A), right(A))

       If right(A) = NULL Then dist(A) ← 0

       Else dist(A) ← dist(right(A)) + 1

       return A

End Function

 

下面我们来分析合并操作的时间复杂度。从上面的过程可以看出,每一次递归合并的开始,都需要分解其中一棵树,总是把分解出的右子树参加下一步的合并。根据性质3,一棵树的距离决定于其右子树的距离,而右子树的距离在每次分解中递减,因此每棵树AB被分解的次数分别不会超过它们各自的距离。根据性质4,分解的次数不会超过ëlog(N1+1)û + ëlog(N2+1)û -2,其中N1N2分别为左偏树AB的节点个数。因此合并操作最坏情况下的时间复杂度为O( ëlog(N1+1)û + ëlog(N2+1)û -2) = O(log N1 + log N2)

 

3.2 插入新节点

单节点的树一定是左偏树,因此向左偏树插入一个节点可以看作是对两棵左偏树的合并。下面是插入新节点的代码:

Procedure Insert(x, A)

       B ← MakeIntoTree(x)

       A ← Merge(A, B)

End Procedure

 

 

由于合并的其中一棵树只有一个节点,因此插入新节点操作的时间复杂度是O(logn)

3.3 删除最小节点

由性质1,我们知道,左偏树的根节点是最小节点。在删除根节点后,剩下的两棵子树都是左偏树,需要把他们合并。删除最小节点操作的代码也非常简单:

Function DeleteMin(A)

       t ← key(root(A))

       A ← Merge(left(A), right(A))

       return t

End Function

 

由于删除最小节点后只需进行一次合并,因此删除最小节点的时间复杂度也为O(logn)

 

3.4 左偏树的构建

n个节点构建成一棵左偏树,这也是一个常用的操作。

 

算法一 暴力算法——逐个节点插入,时间复杂度为O(nlogn)

 

算法二 仿照二叉堆的构建算法,我们可以得到下面这种算法:

Ø        n个节点(每个节点作为一棵左偏树)放入先进先出队列。

Ø        不断地从队首取出两棵左偏树,将它们合并之后加入队尾。

Ø        当队列中只剩下一棵左偏树时,算法结束。

 

 

        

                     

 

下面分析算法二的时间复杂度。假设n=2k,则:

 

次和并的是两棵只有1个节点的左偏树。

接下来的 次合并的是两棵有2个节点的左偏树。

接下来的 次合并的是两棵有4个节点的左偏树。

……

接下来的 次合并的是两棵有2i-1个节点的左偏树。

 

合并两棵2i个节点的左偏树时间复杂度为O(i),因此算法二的总时间复杂度为:

 

3.5 删除任意已知节点

接下来是关于删除任意已知节点的操作。之所以强调“已知”,是因为这里所说的任意节点并不是根据它的键值找出来的,左偏树本身除了可以迅速找到最小节点外,不能有效的搜索指定键值的节点。故此,我们不能要求:请删除所有键值为100的节点。

 

前面说过,优先队列是一种容器。对于通常的容器来说,一旦节点被放进去以后,容器就完全拥有了这个节点,每个容器中的节点具有唯一的对象掌握它的拥有权(ownership)。对于这种容器的应用,优先队列只能删除最小节点,因为你根本无从知道它的其它节点是什么。

 

但是优先队列除了作为一种容器外还有另一个作用,就是可以找到最小节点。很多应用是针对这个功能的,它们并没有将拥有权完全转移给优先队列,而是把优先队列作为一个最小节点的选择器,从一堆节点中依次将它们选出来。这样一来节点的拥有权就可能同时被其它对象掌握。也就是说某个节点虽不是最小节点,不能从优先队列那里“已知”,但却可以从其它的拥有者那里“已知”。

 

这种优先队列的应用也是很常见的。设想我们有一个闹钟,它可以记录很多个响铃时间,不过由于时间是线性的,铃只能一个个按先后次序响,优先队列就很适合用来作这样的挑选。另一方面使用者应该可以随时取消一个“已知”的响铃时间,这就需要进行任意已知节点的删除操作了。

 

我们的这种删除操作需要指定被删除的节点,这和原来的删除根节点的操作是兼容的,因为根节点肯定是已知的。上面已经提过,在删除一个节点以后,将会剩下它的两棵子树,它们都是左偏树,我们先把它们合并成一棵新的左偏树。

p ← Merge(left(x), right(x))

现在p指向了这颗新的左偏树,如果我们删除的是根节点,此时任务已经完成了。不过,如果被删除节点x不是根节点就有点麻烦了。这时p指向的新树的距离有可能比原来x的距离要大或小,这势必有可能影响原来x的父节点q的距离,因为q现在成为新树p的父节点了。于是就要仿照合并操作里面的做法,对q的左右子树作出调整,并更新q的距离。这一过程引起了连锁反应,我们要顺着q的父节点链一直往上进行调整。新树p的距离为dist(p),如果dist(p)+1等于q的原有距离dist(q),那么不管pq的左子树还是右子树,我们都不需要对q进行任何调整,此时删除操作也就完成了。

 

如果dist(p)+1小于q的原有距离dist(q),那么q的距离必须调整为dist(p)+1,而且如果p是左子树的话,说明q的左子树距离比右子树小,必须交换子树。由于q的距离减少了,所以q的父节点也要做出同样的处理。

 

剩下就是另外一种情况了,那就是p的距离增大了,使得dist(p)+1大于q的原有距离dist(q)。在这种情况下,如果p是左子树,那么q的距离不会改变,此时删除操作也可以结束了。如果p是右子树,这时有两种可能:一种是p的距离仍小于等于q的左子树距离,这时我们直接调整q的距离就行了;另一种是p的距离大于q的左子树距离,这时我们需要交换q的左右子树并调整q的距离,交换完了以后q的右子树是原来的左子树,它的距离加1只能等于或大于q的原有距离,如果等于成立,删除操作可以结束了,否则q的距离将增大,我们还要对q的父节点做出相同的处理。

 

删除任意已知节点操作的代码如下:

Procedure Delete(x)

       q ← parent(x)

       p ← Merge(left(x), right(x))

       parent(p) ← q

       If q ≠ NULL and left(q) = x Then

              left(q) ← p

       If q ≠ NULL and right(q) = x Then

              right(q) ← p

       While q ≠ NULL Do

              If dist(left(q)) < dist(right(q)) Then

                     swap(left(q), right(q))

              If dist(right(q))+1 = dist(q) Then

                     Exit Procedure

              dist(q) ← dist(right(q))+1

              p ← q

              q ← parent(q)

       End While

End Procedure

 

下面分两种情况讨论删除操作的时间复杂度。

 

情况1p的距离减小了。在这种情况下,由于q的距离只能缩小,当循环结束时,要么根节点处理完了,q为空;要么pq的右子树并且dist(p)+1=dist(q);如果dist(p)+1>dist(q),那么p一定是q的左子树,否则会出现q的右子树距离缩小了,但是加1以后却大于q的距离的情况,不符合左偏树的性质3。不论哪种情况,删除操作都可以结束了。注意到,每一次循环,p的距离都会加1,而在循环体内,dist(p)+1最终将成为某个节点的距离。根据性质4,任何的距离都不会超过logn,所以循环体的执行次数不会超过logn

 

情况2:p的距离增大了。在这种情况下,我们将必然一直从右子树向上调整,直至q为空或pq的左子树时停止。一直从右子树升上来这个事实说明了循环的次数不会超过logn(性质4)。

 

最后我们看到这样一个事实,就是这两种情况只会发生其中一个。如果某种情况的调整结束后,我们已经知道要么q为空,要么dist(p)+1 = dist(q),要么pq的左子树。这三种情况都不会导致另一情况发生。直观上来讲,如果合并后的新子树导致了父节点的一系列距离调整的话,要么就一直是往小调整,要么是一直往大调整,不会出现交替的情况。

 

我们已经知道合并出新子树p的复杂度是O(logn),向上调整距离的复杂度也是O(logn),故删除操作的最坏情况的时间复杂度是O(logn)。如果左偏树非常倾斜,实际应用情况下要比这个快得多。

 

3.6 小结

本章介绍了左偏树的各种操作,我们可以看到,左偏树作为可并堆的实现,它的各种操作性能都十分优秀,且编程复杂度比较低,可以说是一个“性价比”十分高的数据结构。左偏树之所以是很好的可并堆实现,是因为它能够捕捉到具有堆性质的二叉树里面的一些其它有用信息,没有将这些信息浪费掉。根据堆性质,我们知道,从根节点向下到任何一个外节点的路径都是有序的。存在越长的路径,说明树的整体有序性越强,与平衡树不同(平衡树根本不允许有很长的路径),左偏树尽大约一半的可能保留了这个长度,并将它甩向左侧,利用它来缩短节点的距离以提高性能。这里我们不进行严格的讨论,左偏树作为一个例子大致告诉我们:放弃已有的信息意味着算法性能上的牺牲。下面是最好的左偏树:有序表(插入操作是按逆序发生的,自然的有序性被保留了)和最坏的左偏树:平衡树(插入操作是按正序发生的,自然的有序性完全被放弃了)。

 

 

以上是关于左偏树的定义与性质,结合HDU1512,撰写代码如下:

 

 

#include <iostream>
using namespace std;

typedef 
struct
{
    
long dis;
    
long key;
    
long l,r;
}node;
const long MAXN=100010;
node hash[MAXN];
long father[MAXN];
long n;
inline 
void init()
{
    
long i;
    
for (i=1;i<=n;++i)
    {
        scanf(
"%ld",&hash[i].key);
        hash[i].dis
=hash[i].l=hash[i].r=0;
        father[i]
=i;
    }
}
inline 
long Merge(long A,long B)
{
    
if (A==0)
    {
        
return B;
    }
    
if (B==0)
    {
        
return A;
    }

    
if (hash[B].key>hash[A].key)
    {
        swap(A,B);
    }
    hash[A].r
=Merge(hash[A].r,B);
    
    father[hash[A].r]
=A;

    
if (hash[hash[A].r].dis>hash[hash[A].l].dis)
    {
        swap(hash[A].r,hash[A].l);
    }

    
if (hash[A].r==0)
    {
        hash[A].dis
=0;
    }
    
else
    {
        hash[A].dis
=hash[hash[A].r].dis+1;
    }
    
return A;
}


inline 
long getRoot(long pos)
{
    
while (father[pos]!=pos)
    {
        pos
=father[pos];
    }
    
return pos;
}

inline 
long pop(long fx)
{
    
long l,r;    
    l
=hash[fx].l;
    r
=hash[fx].r;
    father[l]
=l;
    father[r]
=r;
    hash[fx].dis
=hash[fx].l=hash[fx].r=0;
    
return Merge(l,r);
}

inline 
long push(long top,long fx)
{
    
return Merge(top,fx);
}

inline 
void Solove()
{
    
long m,i;
    scanf(
"%ld",&m);

    
for (i=0;i<m;++i)
    {
        
long from,to;
        scanf(
"%ld %ld",&from,&to);
        
long fx,fy;
        fx
=getRoot(from);
        fy
=getRoot(to);
        
if (fx==fy)
        {
            printf(
"-1\n");
        }
        
else
        {
            
long top;
            hash[fx].key
=hash[fx].key/2;
            top
=pop(fx);
            from
=push(top,fx);

            hash[fy].key
=hash[fy].key/2;
            top
=pop(fy);
            to
=push(top,fy);
            
            
long lmax=push(from,to);
            printf(
"%ld\n",hash[lmax].key);
        }
        
    }

}

int main()
{
    
while (scanf("%ld",&n)!=EOF)
    {
        init();
        Solove();
    }
    
return 0;
}

转载于:https://www.cnblogs.com/zhuangli/archive/2008/08/22/1273876.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

布里斯托大学计算机科学专业排名,2021年布里斯托大学世界及专业排名 多个领域位居全英前十!...

它既是红砖大学的成员&#xff0c;也是罗素大学集团成员&#xff0c;在这所学校里共培养出了13位诺贝尔奖得主&#xff0c;这所学校就是布里斯托大学&#xff0c;该校的83%的研究成果都达到了世界领先水平&#xff0c;因此&#xff0c;越来越多的学生去布里斯托大学留学&#x…

Spring启动时的Spring社交示例,或者我如何不再担心和喜欢自动配置

对于Spring Boot 1.1.0.RC1&#xff0c;添加了自动配置和Spring Social的启动程序pom&#xff0c;这意味着我不必为pom添加一百个依赖关系&#xff0c;并且将为我处理许多毫无意义的Spring配置。 让我们来看一个例子。 我将实现一个两页的Web应用程序。 一个将显示给定用户的T…

Djang之cookie和session

一 会话跟踪 我们需要先了解一下什么是会话&#xff01;可以把会话理解为客户端与服务器之间的一次会晤&#xff0c;在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话&#xff0c;你就是客户端&#xff0c;而10086服务人员就是服务器了。从双方接通电话那一刻起&a…

html 安卓解锁,【华为手机解账户锁教程】手撕篇3 完美解锁华为EMUI8.0,8.1,8.2系统...

[free]华为手机在8.0系统以后都无法用工具解除账户锁。但要想解除账户锁&#xff0c;并不是没有办法&#xff0c;下面我们演示手工解账户锁的一种方法&#xff0c;本方案 针对所有华为机型的EMUI8.0 8.1 8.2有效&#xff0c;其他系统自测&#xff0c;需要华为手机解锁的可以联系…

java.lang.Error: Unresolved compilation problems

一般有两种常见的情况&#xff1a; 1、当一个 jar 文件的 MANIFEST.MF 中已经标记了 Sealed: true 时&#xff0c;这个 jar 内所有的 java package 中的类必须来自这个 jar 包&#xff0c;这是 JVM 的安全措施&#xff0c;配合数字签名就能防止篡改&#xff0c;微软就把它的 SQ…

正则表达式实例

1、匹配非负整数&#xff08;正整数 0&#xff09; <div class"qfverify"><input type"text" onkeyup"inputIntReg(this)" placeholder"请输入充值预算"><p class"qfverify__font">请输入有效数字</p…

ASP.NET技巧(收集)

1、有没有办法让JavaScript的注释在客户端不可见呢&#xff1f; 答案很简单&#xff0c;就是&#xff1a;JavaScript注释 服务器端注释&#xff01; 行注释写法&#xff1a; //<%-- 这里写行注释 --%> 块注释写法&#xff1a; /*<%-- 这里写注释语句块&a…

Java文件I / O基础

Java 7引入了java.nio.file包&#xff0c;以提供对文件I / O的全面支持。 除了许多其他功能之外&#xff0c;该软件包还包括Files类&#xff08;如果您已经使用此类&#xff0c;则可以在这里停止阅读&#xff09;。 文件包含许多静态方法&#xff0c;可用于在处理文件时完成常…

2018-05-14 代码考古-Python3官方教程字典例程

知乎原链 Data Structures中的第一个例程:>>> tel {jack: 4098, sape: 4139} >>> tel[guido] 4127 >>> tel {sape: 4139, guido: 4127, jack: 4098} >>> tel[jack] 4098 >>> del tel[sape] >>> tel[irv] 4127 >&g…

中大计算机考研复试刷人太狠,中山大学考研复试被刷原因大盘点!

不知不觉已经进入4月了&#xff0c;距离分数线公布的时间也越来越近了。复试的重要程度一点也不亚于初试的。复试考察内容多&#xff0c;考察形式多样&#xff0c;往年也有高分落榜&#xff0c;低分逆袭的情况&#xff0c;不管你是何种情况&#xff0c;都要做好复试准备哦&…

Windows堆栈区别[转]

堆和栈的区别 (转贴) 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数值&…

WebView内存泄露的解决方案

一、简介&#xff1a; 做Android开发的相信都对webview不会陌生&#xff0c;而且也对系统自带的webview本身存在的问题也是怨念很久了&#xff0c;一方面是本身对js的支持不是很好另外一方面就是经常被人诟病的内存泄露了&#xff0c;网上也有很多解析和方案但至少在我的项目中…

Tomcat启用HTTPS协议配置过程

Article1较为简洁&#xff0c;Article2较为详细&#xff0c;测试可行。 Article1 概念简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试…

常见的Java神话

这些问题在任何面试中都可能太过提出而无法提出&#xff0c;因为它们可能会使候选人推迟。 不管怎样&#xff0c;他们可能会在您自己的时间练习。 误解1&#xff09;System.exit&#xff08;0&#xff09;阻止最终被调用 为什么这样的代码 System.setSecurityManager(new Sec…

萧山职称计算机考试培训,浙江萧山2017年职称计算机考试时间安排

【摘要】环球网校分享的浙江萧山2017年职称计算机考试时间安排届时网校会及时更新职称计算机考试报名入口&#xff0c;希望对大家报考职称计算机考试有帮助&#xff0c;更多资料敬请关注环球职称计算机考试频道&#xff0c;网校会及时更新考【摘要】环球网校分享的“浙江萧山20…

springboot配置idea 热部署

背景&#xff1a; 在开发中&#xff0c;当我们修改代码之后&#xff0c;每次都要重新启动&#xff0c;很是浪费时间&#xff0c;在springboot中就有一种热部署方式&#xff0c;可以实现想要修改不需要每次都重新启动&#xff0c;保存即可生效 用法&#xff1a; 一、maven 添加 …

PMP-PMBOK-培训(3)Introduction to Project Process Groups and Initiating a Project

Overview of project management processes The five process groups are:initiating,planning,executing,mornitoring and controlling,and closing. 转载于:https://www.cnblogs.com/xuxiaoguang/archive/2008/09/03/1282709.html

10分钟看懂Docker和K8S

作者&#xff1a;鲜枣课堂链接&#xff1a;https://www.jianshu.com/p/f1f94c6968f5 2010年&#xff0c;几个搞IT的年轻人&#xff0c;在美国旧金山成立了一家名叫“dotCloud”的公司。 这家公司主要提供基于PaaS的云计算技术服务。具体来说&#xff0c;是和LXC有关的容器技术。…

在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)

上周参加了在Geecon上Sam Newman的微服务讨论后&#xff0c;我开始思考更多有关用于监视&#xff0c;报告和诊断的面向服务/微服务平台最可能的基本功能&#xff1a;相关ID。 关联ID允许在面向服务的复杂平台中进行分布式跟踪&#xff0c;在该平台中&#xff0c;对单个应用程序…

计算机专业论文关于天气预报的,关于天气预报论文范文写作 天气预报相关论文写作资料...

天气预报,本文是一篇关于天气预报论文范文&#xff0c;可作为相关选题参考,和写作参考文献。天气预报论文参考文献&#xff1a;每天吃过晚饭,严惠语都会准时打开电视,收看黑龙江电视台和云南电视台的天气预报节目.自从女儿考上云南大学,为了能攒够女儿下学期的费用,老公背起行李…