实例:python 实现有向图找环(反洗钱、资金流)
- 题目来源:2020华为软件精英挑战赛–初赛
- 题目说明:
2.1 输入信息:输入为包含资金流水的文本文件,每一行代表一次资金交易记录,包含本端账号ID, 对端账号ID, 转账金额,用逗号隔开。
本端账号ID和对端账号ID为一个32位的无符号整数
转账金额为一个32位的无符号整数
转账记录最多为28万条
每个账号平均转账记录数< 10
账号A给账号B最多转账一次
举例如下,其中第一行[1,2,100]表示ID为1的账户给ID为2的账户转账100元:
1,2,100
1,3,100
2,4,90
3,4,50
4,1,95
2,5,95
5,4,90
4,6,30
6,7,29
7,4,28
2.2 输出信息:输出信息为一个文件,包含如下信息:
第一行输出:满足限制条件下的循环转账个数。
说明:数据集经过处理,会保证满足条件的循环转账个数小于300万。
第二行开始:输出所有满足限制条件的循环转账路径详情。
输出循环转账路径要按照指定排序策略进行排序:每条循环转账中,ID(ID转为无符号整数后)最小的第一个输出;总体按照循环转账路径长度升序排序;同一级别的路径长度下循环转账账号ID序列,按照字典序(ID转为无符号整数后)升序排序。
举例如下:
4
1,2,4
1,3,4
4,6,7
1,2,5,4
2.3 限制条件:循环转账的路径长度最小为3(包含3)最大为7(包含7),例如账户A给账户B转账,账户B给账户A转账,循环转账的路径长度为2,不满足循环转账条件。 - 题目理解:
说明:2,4,1,2 是长度为 3 的环,按照升序的要求是:1,2,4
本案例是以邻接表的形式找环,利用 sort 对 graph.keys() 得到的 key 值进行从小到大的排序,为了在找环过程中出现重复找环的情况,进行了剪枝优化,即:比自己小的 key 不再去查找,本案例用的最基本的 for 循环,对于十万以内的环查找速度较快,但是不建议用python 程序参加比赛,主要是太慢了。当然自己也想过用多进程多线程进行优化,然而效果并没有多大的提升,本文可以很好的帮助小白理解操作,大佬不喜勿喷啊,毕竟作为一个妹子码代码不容易,自己一个人走了太多的弯路了,不过个人很欢迎大佬前来指导一二。
废话不多说,下面上代码。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/4/23 13:04
# @Author : xueli
# @Software: win10 Tensorflow1.13.1 python3.6.3
import timedef func(graph,s):#graph图 s指的是开始结点path =[]for x1 in graph[s]:if x1 > s:try:nodes2 = graph[x1]except KeyError as e:passelse:for x2 in nodes2:if x2 > s:try:nodes3 = graph[x2]except KeyError as e:passelse:for x3 in nodes3:if s == x3:A = [s,x1,x2]if len(set(A)) == len(A):path.append(A)elif x3 > s:try:nodes4 = graph[x3]except KeyError as e:passelse:for x4 in nodes4:if s == x4:A = [s,x1,x2,x3]if len(set(A)) == len(A):path.append(A)elif x4 > s:try:nodes5 = graph[x4]except KeyError as e:passelse:for x5 in nodes5:if s == x5:A = [s,x1,x2,x3,x4]if len(set(A)) == len(A):path.append(A)elif x5 > s:try:nodes6 = graph[x5]except KeyError as e:passelse:for x6 in nodes6:if s == x6:A = [s,x1,x2,x3,x4,x5]if len(set(A)) == len(A):path.append(A)elif x6 > s:try:nodes7 = graph[x6]except KeyError as e:passelse:for x7 in nodes7:if s == x7:A = [s,x1,x2,x3,x4,x5,x6]if len(set(A)) == len(A):path.append(A)else:breakreturn pathdef savePredict(AA2):t2 = time.time()with open(result_name, 'w') as f:f.write(str(len(dd))+'\n')for aa in AA2:ww = str(aa)q1 = ww.strip(']')qq = q1.strip('[')bb = qq.replace(" ", "")f.write(str(bb)+"\n")print('write_time', time.time() - t2)
if __name__ == '__main__':t1 = time.time()file_name = "./data/test_data.txt"result_name = "result.txt"with open(file_name) as f:a = []c = []for line in f.readlines():line = line.strip('\n') # 去掉换行符\nb = line.split(',') # 将每一行以空格为分隔符转换成列表a.append(int(b[0]))c.append(int(b[1]))print('read_time', time.time() - t1)graph = {}data_list = [a,c]for x in range(len(a)):if a[x] in graph:graph[a[x]] += [c[x]]else:graph[a[x]] = [c[x]]s = sorted(graph.keys())t4 = time.time()dd = []for i in s:d = func(graph, i)if d != []:for ii in d:dd.append(ii)dd.sort()print('func_time', time.time() - t4)AA2 = sorted(dd, key=lambda i: len(i), reverse=False)print(len(dd))savePredict(AA2)print('总时:', time.time() - t1)
运行结果:
代码和数据已经上传到GitHub,感兴趣的可以下载下来。
https://github.com/xueli-lxl/python
实例:python 实现有向图找环(反洗钱、资金流)相关推荐
- 2020华为软件精英挑战赛-有向图找环
初赛找环,复赛还是找环.初赛没有用到权重(金额),复赛对数据进行加强,同时对相邻两次转账的金额做了限制. 初赛用的单线程,最好成绩:0.2854, 进入了32强.复赛用了多线程,A榜最好成绩:6.11 ...
- codefores741A Arpa's loud Owf and Mehrdad's evil plan(图找环)
题意: 对于给定的一个数列a[n],如果现在点i,那么下一个点就在a[i],现在问给定n个点,找到一个最小的t,使得对于从任意一个点x出发,经过t次之后,到达的点y, 使得点y经过t次之后会回到点x. ...
- CodeForces - 1335F Robots on a Grid(拓扑找环+反向dfs/倍增)
题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,矩阵的每一个格子都有一个颜色,颜色非黑即白,除此之外每个格子还有一个指令,分别为: ' U ':向上一个单位 ' D ':向下一个单位 ' ...
- Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解
题目 Shuseki Kingdom is the world's leading nation for innovation and technology. There are n cities ...
- Python做风险控制|找出形成环状投资的公司
大家好,我是小小明. 今天我将带大家利用python找到关系数据的环.先说下需求和背景: 需求描述 某投资机构需要考虑各公司的投资风险,手上一份各公司投资方向的数据,主要字段是投资者和被投资者. 而有 ...
- python课堂实例,Python电子教案2 1 Python程序实例解析课堂
<Python电子教案2 1 Python程序实例解析课堂>由会员分享,可在线阅读,更多相关<Python电子教案2 1 Python程序实例解析课堂(41页珍藏版)>请在人人 ...
- pythonsuper多重继承_python多重继承实例 python多重继承下super问题
python的多重继承问题有些事,有些人,有些风景,一旦入眼入心,即便刹那,也是永恒.当生活心怀歹毒地将一切都搞成了黑色幽默,小编顺水推舟把自己变成了一个受过高等教育的流氓. 楼上的回答的很正确,简单 ...
- linux rpm找不到命令_linux环境下 python环境import找不到自定义的模块
linux环境下 python环境import找不到自定义的模块 问题现象: Linux环境中自定义的模块swport,import swport 出错.swport模块在/root/sw/目录下. ...
- 没学过python、但是还是有公司要-扎心!“我学了半年 Python,还是找不到工作”...
在编程界,Python是一种神奇的存在.有人认为,只有用Python才能优雅写代码,提高代码效率:但另一部分人恨不能把Python喷成筛子.那么,Python到底有没有用,为什么用Python找不到工 ...
- python多久学会自学-零基础自学Python多久可以找工作?
零基础自学Python多久可以找工作?零基础自学3个月很难找到工作.如果全职学习Python的话,学习6个的时间,不一定能达到找到工作的水平,掌握项目经验还需要更久,达到企业需要的岗位要求还需要多练习 ...
最新文章
- Java开源项目整理
- [python] 使用scikit-learn工具计算文本TF-IDF值
- 我的前端成长之路:中医药大学毕业的业务女前端修炼之路
- python学习中文第五版_前5个学习Python的网站
- 软通动力华为java机考题库_华为机考笔试刷题-java-1
- mysql linux64安装----转载
- oracle安全性规则,[ORACLE ]安全性
- image控件的 PostBackUrl绑定Eval
- 基于机器学习和TFIDF的情感分类算法,详解自然语言处理
- 任丽萍跟我赌200块钱的
- 基于深度学习(端到端)的OCR文字识别
- Windows 7 测试体验
- SqlAlchemy操作(一)
- Ceph Cache tier配置
- 计算机天空之城音乐谱,天谕手游天空之城乐谱代码是什么
- ipone 手机不断出现电亡事件 是抹黑 还是真的如此
- UVa 10015 - Joseph's Cousin
- java上传文件夹文件
- gateway oauth2 对称加密_深入理解Spring Cloud Security OAuth2及JWT
- android 实现微信分享
热门文章
- matlab 液压控制系统设计,基于MATLAB的液压系统的设计与仿真
- 【HEVC学习与研究】46、HEVC参考代码中SAO的实现
- jboss下载及安装
- Vim开发RubyOnRails 环境打造
- CommandName 和 CommandArgument的区别
- 在Maya和ZBrush中制作战士模型
- 记录成功通过CSP接口获取Ukey的X509数字证书过程
- Android——启动本地QQ,实现与指定的QQ号临时会话
- windows10鼠标指针_如何在Windows 10中更轻松地查看鼠标指针
- linux文本编辑器vi保存命令,linux命令vi文本编辑器的使用方法