组件化项目自动打Tag算法分析

组件化项目自动打Tag算法分析

一、问题背景:

组件化开发项目的过程中,会产生很多子库嵌入到壳工程,子库之间依赖关系复杂度也越来越大,每一次发版改动的子库需要打Tag,子库打完Tag后,壳工程打打Tag,项目越来越大时,手动打Tag愈发繁琐,要做到脚本自动化完成打tag,必须先分析子库之间的依赖关系,确定打Tag的先后顺序。

二、抽象模型

壳工程为依赖关系的起点,子库之间也有复杂的依赖关系,使用图状结构再来表示最为合适,下图描述了一个组件化项目壳工程与子库,子库与子库之间的依赖关系。

图一:依赖关系图

【图一:依赖关系图】

三、依赖关系图的存储结构

1、 数组表示法(二维数组,一个表示顶点信息,一个表示依赖关系)


图二:图的邻接矩阵

注:例如存在A->B的依赖关系,则矩阵位置(2,1)为1,否则为0,纵向看是每个结点的被依赖关系,横向是依赖关系。

2、邻接表表示法

图三:邻接表 结点后的链表表示出度
图四:逆邻接表 结点后的链表表示入度

简单的具体实现:
typedef Node{ intput[], output[]}//定义结点,两个数组分别表示入度和出度
Set(Node
,Node*......)//集合包含所有的结点

3、十字链表表示

图五:十字链表

四、依赖关系图的遍历

通过遍历图,找到出度为0的结点,出度为0即说明此仓库没有依赖项,是需要先打Tag的库。处理完后在图中标记此结点,这个结点关联的弧即全部失效,再从剩余的结点找到出度为0的点,依此类推,直到最后一个结点。

1、邻接矩阵的递归遍历以及非递归遍历:

核心代码:

邻接矩阵的创建(C语言实现)

typedef struct /*图的邻接矩阵*/
{
    int vexnum, arcnum; //顶点数量,边数量
    char vexs[N];       //顶点数组
    int arcs[N][N];     ///邻接矩阵
} graph;

void createGraph(graph *g) /*建立一个有向图的邻接矩阵*/
{
    int i = 0; int j = 0; char v; g->vexnum = 0; g->arcnum = 0;
    printf("输入顶点序列(char字符表示,例如一共有顶点A,顶点B,顶点C,输入ABC#,)(以#结束):\n");
    while ((v = getchar()) != '#') {
        g->vexs[i] = v; /*写入顶点信息*/
        i++;
    }
    g->vexnum = i; /*顶点数目*/
    initgraph();/*邻接矩阵初始化*/
    printf("\n输入边的信息(例如:顶点AB的边,从A到B,输入AB回车):\n");
    char m; char n;
    scanf("\n%c%c", &m, &n);
    while (m != '#' && n != '#')  {
        int indexI = indexOfVex(m, g); int indexj = indexOfVex(n, g);
        if (indexI != -1 && indexj != -1) {
            g->arcs[indexI][indexj] = 1;
        }
        scanf("\n%c%c", &m, &n);
    }
}

邻接矩阵的递归遍历,时间复杂度为O(n^2),实现较为简单

从任意顶点开始,即从第几行开始遍历,遍历到第i列不为0,递归第i行。

void dfs(int i, graph *g) /*从第i个顶点出发深度优先搜索*/
{
    int j;
    visited[i] = 1;
    for (j = 0; j < g->vexnum; j++)
    {
        if (visited[j] == 0 && g->arcs[i][j] == 1)
        {
            dfs(j, g);
        }
    }
    printf("\n打tag:%c", g->vexs[i]);
}

邻接矩阵的非递归遍历

借助栈来实现,如从第0个顶点开始遍历,第0个顶点入栈

取栈顶元素,遍历此顶点的出度,找到一个,入栈,再取栈顶元素循环

栈的变化:
l A
l AB
l ABC
l AB //C结点没有出度(没有依赖项),出栈,出栈即打Tag时机
l ABE //B的第二个出度E结点入栈(第二个依赖)
l ABED // E的出度D入栈
l ABE // D没有出度,出栈
l ABF //B的第三个出度F入栈
l ABFG
l ABF
l AB
l A
l 栈空,结束循环

邻接矩阵打Tag示例代码:https://gitlab.com/360fengdai/tagorder.git

2、邻接表的递归遍历

邻接表的创建(C语言实现,数组代替邻接链接):

数据结构:

typedef struct /*顶点*/
{
    char info; //顶点
    int visit;
    int outCount;      //出度数量
    int inCount;       //入度数量
    char outdegree[N]; //出度数组
    char indegree[N];  //入度数组
} vex;
typedef struct
{
    int count;// 顶点数量
    vex data[N];// 顶点数组
} graph;

邻接表递归遍历示例代码:https://gitlab.com/360fengdai/tagorder.git

3、十字链表的遍历

数据结构定义:

typedef struct EdgeNode  //弧结点的定义
{
    int tailvex;               //弧尾结点的下标
    int headvex;               //弧头结点的下标
    struct EdgeNode *headlink; //指向弧头相同的下一条弧的链域
    struct EdgeNode *taillink; //指向弧尾相同的下一条弧的链域
    EdgeType info;             //弧中所含有的信息  可以是权值等
} EdgeNode;
typedef struct VertexNode //顶点结点的定义
{
    int index;          //下标值
    VertexType data;    //顶点内容
    EdgeNode *firstout; //顶点的第一条出弧
    EdgeNode *firstin;  //顶点的第一条入弧
} VertexNode;
typedef struct OLGraph //十字链表存储结构的有向图定义
{
    VertexNode vertices[MaxVex];
    int vexnum; //顶点数
    int arcnum; //边数
} OLGraph;

非递归深度优先遍历核心代码,实现稀疏矩阵遍历最优时间复杂度O(n+e):

代码示例:https://gitlab.com/360fengdai/tagorder.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342