2020华为软挑总结

article/2025/9/15 16:19:28

文章目录

    • 一、热身赛
        • 编程闯关:
        • 评价标准:
        • 问题分析
    • 二、初赛
        • 问题描述
        • 评价标准:
        • 问题分析
            • 思路一:
            • 思路二:
            • 思路三:
            • 针对思路三的提速:
        • 最终结果:
    • 三、code记录
    • 初赛两篇不错的总结
    • 三、复活赛
        • 线上结果:
        • 算法思路:
    • 四、复活赛其他组共享代码
    • 五、民间数据集

一、热身赛

编程闯关:

用户贷款风险预测。要求参赛者建立准确的风控模型,预测用户是否会逾期还款。

评价标准:

速度为王,只要速度够快,准确率可以忽略不计。
在这里插入图片描述

问题分析

二分类问题:采用logistic回归算法对用户类型进行分类。
在此分类算法上依次采用L2正则化、影子滑动平均、学习衰减率、随机梯度下降、自适应梯度下降等优化策略。以提高收敛速度,保证泛化能力。
最终结果:不堪入目。
在这里插入图片描述

二、初赛

问题描述

通过金融风控的资金流水分析,可有效识别循环转账,辅助公安挖掘洗钱组织,帮助银行预防信用卡诈骗。基于给定的资金流水,检测并输出指定约束条件的所有循环转账。

评价标准:

在保证准确率的基础之上,速度为王!
结果一定要100%正确,否则无法参与评分。

问题分析

在有向图结构中找出所有长度在[3,7]的简单环,并按规则输出。详细规则 gitee链接-coding记录 中有记录。

思路一:

采用vector储存所有顶点信息,list存储所有边结构信息。采用 深度优先搜索+破环边结构 的方法搜索所有简单环。在官方给的56环数据中,该思路能正确运行;但在线上运行失败。故此路不通。

思路二:

先采用tarjan算法找出图中所有强连通子图;其后在各强连通子图采用johnson算法中寻找所有简单环。
此算法适用于强连通子图比较多的图结构。大赛线上表现一般。
推荐一位小哥的视频,该视频很好地讲诉了该算法的思路。
johnson找环算法视频

思路三:

暴力找环法。依次针对每个节点递归7层结构,只找以此节点为开头的环。该法能确保结果正确,但存在大量重复查找的过程。

针对思路三的提速:

提速一:改变图的存储结构,使用二维数组储存邻接表结构的图,提高访问速度。针对文件的输入,有两种方式。
一种是有序的图结构(按id大小排序):采用set记录所有顶点,并按顶点id大小排序。采用unordered_multimap储存所有边结构。采用unordered_map绑定顶点id与索引号。最终使得图结构按 ID升序排列。顶点ID+边顶点索引号
一种是无序结构:采用unordered_map绑定顶点与其索引号,将边结构顶点的索引号(按查找的方式,从unordered_map对象中获得。 顶点ID顺序与其添加顺序有关。顶点ID+边顶点索引号
提速二:每个起始结点只找比自己id号大的环结构,这样可保证输出的排序规则。
提速三:采用四线程,将数据分成4部分分别查找,最终将所有结果综合排序。

//定义一个计时器类
class Timer
{
public:Timer() : beg_(clock_::now()) {}void reset() { beg_ = clock_::now(); }double elapsed() const {return std::chrono::duration_cast<second_>(clock_::now() - beg_).count();}void out(std::string message = "") {double t = elapsed();std::cout << message << " elasped time:" << t << "s" << std::endl;reset();}
private:typedef std::chrono::high_resolution_clock clock_;typedef std::chrono::duration<double, std::ratio<1> > second_;std::chrono::time_point<clock_> beg_;
};Timer t;
t.out("Tatal");//开启线程的两种方式
#include <thread>
#include<future>
//#include<atomic>
#include<mutex>//多线程找环//std::future <void> m1 = std::async(FFCC1, std::ref(g)); //线程一//std::thread t1(FFCC1, std::ref(g)); //线程一//std::thread t2(FFCC2, std::ref(g)); //线程二//std::thread t3(FFCC3, std::ref(g)); //线程三std::future <void> m1 = std::async(FFCC1, std::ref(g)); //线程一std::future <void> m2 = std::async(FFCC2, std::ref(g)); //线程一std::future <void> m3 = std::async(FFCC3, std::ref(g)); //线程一g.FC();  //主线程m1.wait();//线程一m2.wait();//线程一m3.wait();//线程一//t1.join(); //线程一//t2.join(); //线程二//t3.join(); //线程三

提速四:一个剪枝的方法。递归消除所有出度为0的结点。

最终结果:

效果一般、牛人太多
团队最优成绩:4.9s
个人最好成绩:5.1s
在这里插入图片描述

三、code记录

gitee链接-coding记录

//编译命令
g++ -O3 baseline.cpp -o test -lpthread
//执行命令、并分析用时
perf stat ./test

推荐操纵服务器的两款不错的工具:
往服务器传送文件:WinSCP、Xftp6
命令行操纵服务器:Xshell6、putty
分享一个能找出所有环的baseline.cpp代码(待优化)。比赛结束了我才发现。。。。。
baseline.cpp

初赛两篇不错的总结

知乎大佬:图中所有简单环查找算法研究总结
知乎大佬删除了好多内容,可惜了。
CSDN大佬:深度遍历暴力求解所有简单环

三、复活赛

与初赛的差异:

转账记录 28W -> 200W
环个数 2914186 -> 2000W
转账金额比例约束 :如[A,B,X],[B,C,Y],要满足0.2 <= Y/X <= 3

算法策略:负三步标记剪枝, 正七步找环,其中后三步只在有标记的结点中寻找。
优化策略:mmap读入,写出; 双vector存图改为动态二维数组存图; 四线程交替分配数据。递归改七层迭代循环。

线上结果:

在这里插入图片描述

算法思路:

建图部分:(1936万环,1s)
1、mmap映射读入,将数据暂存在一个xxxx*3的二维数组中,同时vector记录所有第一个顶点。
2、使用sort为vector排序;使用unique去除重复元素。
3、unordered_map绑定顶点id值与其序号,按顺序依次加入各顶点信息。
4、借组unordered_map和xxxx*3二维数组绑定各边与顶点。建立子图与父图(正向图与反向图)。
5、正向图需对各边顶点序号排序。




找环部分:(1936万环,14s)(直接用动态二维数组可达8s,但对菊花图易造成空间不够。)
a、针对所有顶点均运行一遍找环程序。顶点分配原则为四线程交替分配。有更好的分配方法,(不要预先给各个线程分配任务,这样可能导致任务分配不均匀。使用动态分配策略:维护一个队列,如果一个线程完成了一个任务,那么就去队列里去取下一个任务。),碍于时间有限,未能实现。
b、每次找环,均只找以该顶点为起点的环。

1、反向迭代三层,标记该顶点的负三邻域。迭代时只遍历结点号比自己大的结点。
2、正向迭代前四层正常逻辑,后三层只遍历有标记的结点。
3、找到环时将环变成字符串类型。且3、4、5、6、7各环存在不同的容器中,以保证环有序。



文件写入部分:(1936万环,0.8s)
1、建立mmap映射。
2、各环容器,各线程交替输出。可保证输出有序。



代码可维护性差,仅供参考。
方案一code

方案二code

其中方案一和二,算法思路一样。但实现方式略有不同。

四、复活赛其他组共享代码

1、ddd2020大佬
2、京津东北赛区 A 榜 rank1
3、粤港澳复赛A榜第2
4、2020华为软挑初赛上合赛区第一,复赛A榜总榜第一,B榜GG
5、2020华为软挑初赛武长赛区第一,复赛武长赛区A榜第二解决方案
6、最终成绩杭厦赛区第6

五、民间数据集

民间数据集
知乎评价


http://chatgpt.dhexx.cn/article/ZFI8dm7M.shtml

相关文章

2022华为软挑比赛(初赛笔记)

文章目录 2022华为软挑&#xff08;初赛笔记&#xff09;1. 赛题要求2. 解决方案2.1 挑选适合的边缘节点2.2 第一轮&#xff1a;最大分配2.3 第二轮&#xff1a;均值分配 总结 本文仓库地址&#xff1a; Github-CodeCraft-2022 2022华为软挑&#xff08;初赛笔记&#xff09; …

2023华为软件精英挑战赛笔记心得(Python实现)

第一次参加华为软挑&#xff0c;问了周围一圈人没人组队&#xff0c;看了眼题目&#xff0c;感觉挺有意思的&#xff0c;就打算自己写来跑一下&#xff0c;不求分数&#xff0c;主要是想学点东西&#xff0c;顺便记录一下。&#xff08;最后跑了195w&#xff0c;自己的能力也就…

2021华为软件精英挑战总结

2021华为软挑32强总结 今年的软挑最终止步于粤港澳赛区第16名&#xff0c;总成本为16亿3979万6349&#xff0c;赛区第一名总成本为15亿3903万4817。 虽然没进入决赛&#xff0c;但是拿到了华为面试直通卡&#xff0c;也喜提广州一日游&#xff0c;算不虚此行了。决赛虽然还在继…

Spring认证中国教育管理中心-Spring Data Neo4j教程一

原标题&#xff1a;Spring认证中国教育管理中心-Spring Data Neo4j教程一&#xff08;Spring中国教育管理中心&#xff09; 5. 开始 我们为 SDN 提供了 Spring Boot 启动器。请通过您的依赖管理包含启动模块并配置要使用的螺栓 URL&#xff0c;例如org.neo4j.driver.uribolt:/…

SpringBoot 整合 Neo4j

1、创建测试类2、集成 SpringBoot 阅读此文之前&#xff0c;必须对 Neo4j 有个初步的了解&#xff0c;如果要实际操作的话&#xff0c;需要自备一个 Neo4j 数据库 本文所涉及代码已开源至 Gitee https://gitee.com/Array_Xiang/spring-boot-neo4j 创建一个 SpringBoot 项目&…

【Neo4j教程之CQL函数基本使用】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

Neo4j资料 Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址&#xff1a; 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明&#xff0c;《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱&#xff1a;pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

Neo4J超详细专题教程,快来收藏起来吧

Neo4J超详细教程 Lecture&#xff1a;波哥 一、Neo4J相关介绍 1.为什么需要图数据库 随着社交、电商、金融、零售、物联网等行业的快速发展&#xff0c;现实社会织起了了一张庞大而复杂的关系 网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随…

Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址&#xff1a; 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明&#xff0c;《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱&#xff1a;pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

neo4j教程-安装部署

neo4j教程-安装部署 Neo4j的关键概念和特点 •Neo4j是一个开源的NoSQL图形存储数据库&#xff0c;可为应用程序提供支持ACID的后端。Neo4j的开发始于2003年&#xff0c;自2007年转变为开源图形数据库模型。程序员使用的是路由器和关系的灵活网络结构&#xff0c;而不是静态表…

Neo4j安装教程

1.下载社区版本&#xff0c;java8推荐安装3.*的版本 Neo4j Download Center - Neo4j Graph Data Platformhttps://neo4j.com/download-center/#community 点击下载即可。 2.配置 启动 将提取的文件放在服务器上的永久主页中&#xff0c;例如 D:\neo4j\. 顶级目录称为 NEO4J_…

Neo4j详细介绍及使用教程

文章目录 一、Neo4j介绍1.Neo4j简介2.图数据库简介3.Neo4j的优缺点4.Neo4j的常见应用场景二、使用教程1.下载安装2.数据插入和查询(1)基本概念(2)基本语法Ⅰ.CREATE操作——创建Ⅱ.MERGE——创建或更新Ⅲ.Match操作——查找指定的图数据Ⅳ.DELETE操作——删除节点3.JAVA实战 一…

Neo4j语法教程

neo4j简版教程 create (<node-name:<label-name2>:<label-name2>......>) return <node-name> 可以给一个节点创建多label的node eg: CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" }) Neo4j CQL创…

【数据库】linux安装neo4j教程(neo4j 4.x)

一.配置jdk neo4j 4.x版本依赖jdk11&#xff0c;需要安装jdk11才能正常启动&#xff08;安装高版本或低版本jdk都不行&#xff09; 1&#xff09;执行uname -a看下系统架构 2&#xff09;根据系统架构下载对应安装包 https://www.oracle.com/java/technologies/javase/jdk11…

linux neo4j 教程,Neo4j 入门教程 - 安装

本篇来简单介绍下如何下载并安装 Neo4j&#xff0c;篇目很短&#xff0c;因为真的很简单。 下载 Neo4j 首先在 https://neo4j.com/download/ 下载 Neo4j。你可以选择企业体验版或者免费的社区版&#xff0c;这里我是用的社区版。点击 Download 按钮即可开始下载。 网站会自动下…

使用Docker安装neo4j教程

拉取镜像源 docker pull neo4j(:版本号) //缺省 “:版本号” 时默认安装latest版本的查看本地镜像 docker images启动容器 docker run -d --name container_name -p 7474:7474 -p 7687:7687 -v /home/neo4j/data:/data -v /home/neo4j/logs:/logs -v /home/neo4j/conf:/var…

neo4j教程 java_neo4j 教程

Neo4j是一个世界领先的开源图形数据库。 它是由Neo技术使用Java语言完全开发的。本教程将教你Neo4j的基础知识&#xff0c;Java与Neo4j和Spring DATA与Neo4j。 本教程分为Neo4j简介&#xff0c;Neo4j CQL&#xff0c;Neo4j CQL函数&#xff0c;Neo4j管理员&#xff0c;Neo4j与J…

最详细的Neo4J解读(附安装教程)

文章目录 一、Neo4j简介二、Neo4j - 特点和优势1.Neo4j的特点2.Neo4j的优点3.Neo4j的缺点或限制 三、Neo4j - 数据模型四、Neo4j安装及配置1.安装Java JDK2.下载安装Neo4j3.创建系统环境变量4.Neo4j的启动和停止5.切换数据库 五、Neo4j的CQL操作 一、Neo4j简介 Neo4j是一种流行…

图数据库Neo4j实战(全网最详细教程)

1.图数据库Neo4j介绍 1.1 什么是图数据库&#xff08;graph database&#xff09; 随着社交、电商、金融、零售、物联网等行业的快速发展&#xff0c;现实社会织起了了一张庞大而复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数…

neo4j入门

目录 一、安装 二、CQL使用 三、Springboot(2.4以上版本)整合neo4j 四、使用过程中的问题 1、自定义查询&#xff0c;cql无法接收变量 2、使用依赖去操作neo4j只有return才会执行 3、neo4j和mysql事务冲突 补充 一、安装 1、首先要配置jdk&#xff0c;默认电脑中有jdk…