拓扑排序在顶尖风控团队的业务落地

简介: 拓扑排序在顶尖风控团队的业务落地

一、引言

上一章我们讲解了关于图的搜索方法,主要是深度优先搜索和广度优先搜索,两种方法的搜索方式各有优点

不知道大家在日常工作中有没有碰到这种情况:

比如,我们只有完成工作一之后,才能去完成工作二、工作三,当工作二和工作三同时完成时,我们的工作四才开始开始

简单来说,当前工作必须依赖别的工作完成之后,才能实施工作,那么我们怎么判断哪一份工作需要提前完成呢?

这就是我们今天要讲的 拓扑排序

二、什么是拓扑排序

在图论中,拓扑排序(Topological Sorting)是一个有向无环图的所有顶点的线性序列。

且该序列必须满足下面两个条件:

  • 每个顶点出现且只出现一次。
  • 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

有向无环图才有拓扑排序,有环图没有拓扑排序一说

对于上图来说,拓扑排序可以帮我们做点什么呢?

  • 分析每一个点的前后完成的位置
  • 判断该图是否有环无环

三、拓扑排序的风控落地

在常见的风控公司,有这样一个功能:决策流

简单来说,用户通过配置规则、dubbo服务,做一个流式的计算,如图所示:

这是一个比较简单的决策流,它由三个策略集编排,并有起始和结束,是符合BPMN规范的

我们的决策流在执行时,通过拓扑排序去判断每一个策略集完成的前后顺序,进行决策的判断

而dubbo接口的作用,通过远程服务调用,获取我们需要的信息去进行决策的判断,最终获取一个分数

四、决策流的实现代码

组装成图的思路可见:给我5分钟,带你秒杀所有图算法之图的对象化描述

拓扑排序的思路:对于当前图中入度为0的点,即为当前可以执行操作的点

简单理解就是:当前的点,没有人指向他

对于上述思路,我们简单的遍历一遍所有点,可以得出第一次需要执行的点

当我们把第一个点给使用掉之后,我们需要将该点所连接的点的入度减一

我们直接看下代码:

  public static void getScore(DecisionFlowGraph graph, HashMap<String, String> map) {
        // 使用一个队列
        Queue<DecisionFlowPoint> queue = new LinkedList<>();
        // 遍历所有的点,找到入度为 0 的点
        for (DecisionFlowPoint point : graph.points.values()) {
            // 入度为0
            if (point.in == 0) {
                queue.add(point);
            }
        }
        // 当前的队列不为空
        while (!queue.isEmpty()) {
            // 弹出当前队列的头
            DecisionFlowPoint point = queue.poll();
            // 使用当前该点代表的策略集
            finalScore = finalScore + resolve(point, map);
            // 将该点所连接的点的入度减一
            for (DecisionFlowPoint next : point.points) {
                next.in--;
                if (next.in == 0) {
                    queue.add(next);
                }
            }
        }
    }

整个流程的代码由于太长的原因,在这里就不展示了,有兴趣的可以公众号回复:算法源码

不仅包括图的源码,还包括如下内容:

展示下最终的使用情况:

四、总结

简单来说,拓扑排序在我们实际业务中,用到的场景也是挺多的

比如:文中提到的决策流、工作流等

当然,看完本篇文章之后,也需要大量的场景去进行练习,不然容易生疏

相关文章
|
C++
UE4/5中DataTable数据表的使用
UE4/5中DataTable数据表的使用
1458 1
UE4/5中DataTable数据表的使用
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
1747 0
|
存储
如何理解结构体的浅拷贝与深拷贝
结构体的浅拷贝仅复制对象的引用或基本数据类型值,不创建新对象;深拷贝则会递归地复制所有对象及其引用的对象,形成完全独立的新对象。两者主要区别在于是否共享内部对象。
|
安全 网络安全 云计算
云计算与网络安全:技术融合与挑战分析
【9月更文挑战第31天】本文将深入探讨云计算和网络安全之间的关系,包括云服务、网络安全、信息安全等技术领域。我们将从云计算的基本概念和特性出发,分析其在网络安全方面的优势和挑战,并探讨如何通过技术和策略来提高云计算的安全性。同时,我们也将讨论网络安全在云计算环境下的重要性,以及如何通过有效的安全措施来保护云服务的安全。最后,我们将通过代码示例来展示如何在云计算环境中实现网络安全。
150 3
|
算法 Java 开发者
探索代码世界:我的编程之旅
在数字时代的浪潮中,编程已成为一门艺术和科学的结合体。本文将带领读者穿梭于代码的迷宫,分享个人的技术感悟,从初识编程的迷茫到深入其境的喜悦,探讨如何通过编程解决实际问题,以及编程带来的思维转变和生活影响。文章旨在为编程初学者提供一盏指路灯,同时也为资深开发者带来共鸣。
|
消息中间件 Java Kafka
你了解RabbitMQ、RocketMQ 和 Kafka吗?
【6月更文挑战第26天】比较了RabbitMQ、RocketMQ和Kafka三种消息队列:RabbitMQ灵活,支持多种协议,适合中小型应用;RocketMQ高性能,适用于大规模消息处理;Kafka则以高吞吐量和流处理见长。RabbitMQ和Kafka生态丰富,而RocketMQ运维相对复杂。选择时考虑性能、灵活性、生态系统和易用性,以及特定场景如大数据流处理或分布式系统组件通信。
404 1
|
SQL 资源调度 关系型数据库
实时计算 Flink版产品使用合集之可以使用高并发大内存的方式读取存量数据吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
206 3
|
Java
学校人员管理系统【JSP+Servlet+JavaBean】(Java课设)
学校人员管理系统【JSP+Servlet+JavaBean】(Java课设)
104 2
|
算法 区块链
DAPP算力质押分红系统开发|方案设计|需求细节
“去中心化”好像是最近一个热门的“新词汇”,相信关注区块链领域的朋友会经常听到这么一个词。
|
SpringCloudAlibaba 负载均衡 监控
十五.SpringCloudAlibaba极简入门-Gateway网关整合Nacos
这一篇文章算是补充把,之前的Spring Cloud Gateway 是以Eureka为注册中心进行整合的,见《服务网关Gateway》,现在讲一下Spring Cloud Gateway 和Nacos的整合,该文章只介绍了Gateway和Nacos整合部分,请结合《服务网关Gateway》一起看你的收获会更大