批量同步Gerrit Change的先后逻辑算法

简介:

做某个项目,会将开发提供的一堆gerrit change同步下来后,自动编译。
但一组gerrit change可能由于dependOn的问题,合理同步顺序不一定是开发的提交顺序。比如,存在提交 1 和提交 2,提交1依赖于提交2,那么,合理的下载顺序是,先下载提交2,再下载提交1。

那如果开发需要编译的提交有十几个,怎么计算?
一开始的想法,这就是一个有向图,每个提交就是一个节点,而提交之前的依赖关系就是连接。当然,有可能这几个提交互相都没有关系,那就可以虚拟一个root。然后通过深度优先遍历得到正确的顺序。

感觉以上想法,代码量有点多,同时,需求上其实并不在意同级的提交谁先谁后,只在意dependOn的提交先被同步,于是,通过类似动态规划的想法,设计出如下算法:
思路:对于一组开发的提交,可以分成两组,一组A是可以认为是不安全的,另一组B认为是安全的,即同步的顺序是确定。只要不断地确定B的集合,就能得出相应的队列。

举例:开发有提交1,2, 3, 4
其中,1依赖于2和3,2依赖于4, 3依赖于4, 4不依赖任何提交

1. 初始集合 setA = {1,2,3,4}
2. 得出初始数组的依赖集合 setB = {2,3,4}
3. setA – setB,得出 {1},入列表[1]
4. setA & setB = {2,3,4},将其设为新的setA
5. 得到新的setB = {4}
6. setA – setB,得出 {2,3},入列表得到[2,3,1] (注,新的需要放在头上,当然,放成[3,2,1]也可以,因为认为2与3是等价的)
7. setA & setB = {4},将其设为新的setA
8. setB为空
9. setA – setB,得出 {4},入列表得到[4,2,3,1]

  1. 由于setB为空,跳出循环

实际使用中,这个算法能处理循环依赖问题,也就是如果存在setA为空的时候,就说明出现了循环依赖。同时,也能处理依赖的提交并不在用户提交的提交列表的情况,如,提交4依赖于提交5。由于采用了集合的运算,能很快将这些噪音过滤掉。

附上Python代码,其中self.getDependsOnArray(list(setGerrit))是获取提交的依赖提交集合,另,一开始设计的时候,想用stack来处理得到的safe提交,实现的时候,觉得用list比较方便,就用list来处理了。

代码是以前写的,存在大量对pep8规范的违反,请主动忽略

    def resortGerritNumberForDependency(self, gerritInfo_arr):
        #Sort the gerrit changes here to make sure the depeneded gerritchange is got at first. 
        #  Algorithm is as following:
        #    1. Initial set of gerrit changes topSet, as setGerrit
        #    2. Get its depends on gerrit changes, as setDependsGerrit, set(gerritB) = set(gerritB) and set(gerritA)
        #    3. DiffGerrit = setGerrit - setDependsGerrits. 
        #    4. push DiffGerrit into stack
        #    5. if setDependsGerrit & setGerrit is not empty, set it as topSet and go to step 1, else break
        #    6. Pop gerrit stack. The sequence will be the one to get gerrit changes without dependency conflicts
        newOrderGerrit = []
        topSet = gerritInfo_arr
        while True:
            setGerrit = set(topSet)
            setDependsGerrits = self.getDependsOnArray(list(setGerrit))
            diffSet = setGerrit - setDependsGerrits
            if not len(diffSet):
                logging.error("There is recursive dependency!")
                newOrderGerrit = []
                break
            else:
                #the new found one will be at the head of list which iterated at first
                newOrderGerrit = list(diffSet)+(newOrderGerrit)
            
            topSet = setDependsGerrits & setGerrit
            if not len(topSet):
                #break only this is empty. Because diffSet make sure in each loop, the number will be decreased,
                # there will not be any endless loop under this logic. 
                break
            
        return newOrderGerrit
目录
相关文章
|
1月前
|
算法
条件运算符与条件if的姻缘,打擂台算法和大小写字母转换,if逻辑避坑
条件运算符与条件if的姻缘,打擂台算法和大小写字母转换,if逻辑避坑
21 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
47 9
|
3月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【8月更文挑战第2天】决策树算法以其直观性和解释性在机器学习领域中独具魅力,尤其擅长处理非线性关系。相较于复杂模型,决策树通过简单的分支逻辑实现数据分类,易于理解和应用。本示例通过Python的scikit-learn库演示了使用决策树对鸢尾花数据集进行分类的过程,并计算了预测准确性。虽然决策树优势明显,但也存在过拟合等问题。即便如此,无论是初学者还是专家都能借助决策树的力量提升数据分析能力。
42 4
|
4月前
|
算法 搜索推荐 测试技术
python中算法逻辑错误(Logic Errors)
【7月更文挑战第18天】
156 2
|
4月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
32 1
|
4月前
|
人工智能 算法
代码库经过神经算法提纯可以做人工智能的逻辑工具
代码库经过神经算法提纯可以做人工智能的逻辑工具
|
6月前
|
并行计算 算法 调度
【操作系统】同步和互斥详细讲解(算法+源码)
【操作系统】同步和互斥详细讲解(算法+源码)
|
6月前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
86 0
|
6月前
|
人工智能 算法
【算法】深入理解 Prolog:逻辑编程的奇妙世界
【算法】深入理解 Prolog:逻辑编程的奇妙世界
149 0
|
存储 算法 C语言
《信任的进化》游戏简易版逻辑算法的实现(C语言)
《信任的进化》游戏简易版逻辑算法的实现(C语言)
下一篇
无影云桌面