2020年华为软件精英挑战赛总结
成绩:
- 初赛成渝赛区排名第9 (共1034支队伍)
- 复赛成渝赛区排名第3 (共32支队伍),进入决赛
项目背景:通过金融风控的资金流水分析,可有效识别循环转账,辅助公安挖掘洗钱组织,帮助银行预防信用卡诈骗。基于给定的资金流水,检测并输出指定约束条件的所有循环转账。要求结果准确,用时最短。
2020年华为软件精英挑战赛面试
主要学习弄懂三个知识点 :dijkstra(基本算法流程与优化方法),计算bc算法(基本算法流程),代码优化技巧(记几个,加上原理)
向面试官介绍自己的比赛,四个方面来说:
比赛背景: 基于给定的资金流水,检测并输出指定约束条件的所有循环转账,可有效识别循环转账,帮助银行预防信用卡诈骗。要求结果准确,用时最短。分为初赛,复赛,决赛三个阶段,题目各不相同;
比赛负责内容: 主要负责三方面工作,第一负责解题算法研究,包括Dijkstra算法研究,位置关键中心性算法研究;第二参与代码优化,包括使用一些c++代码优化加速技巧;第三参与数据测试与分析工作,包括分析数据特点与服务器测试代码得分;
比赛成果: 初赛成渝赛区排名第9 (共1034支队伍);复赛成渝赛区排名第3 (共32支队伍);决赛全国总排名第9;
初赛
流程:读图预处理(去除特殊节点)->储存图(前向星)->dfs找环(正向3+反向4,bfs与dfs区别)->输出
优化:
1.使用局部变量,减少使用全局变量;
2.使用数组代替vector;
3.保持结构体字节对齐
4.将id和边尽可能的连续,提高cache的命中率
5.更改数据类型,减少计算时间
针对数据特点优化:
转账金额较小的这一点,可以使用动态的数据类型,如自动切换的uint_64,uint_32,uint_16(提升100+)
第一组:菊花图(无标度网络),存在大量入度为0,出度为1的结点
第二组:随机图,90%以上的点只有一个前驱,边权为100以内的正态分布,均匀度为20左右,且分布均匀,因此搜索四次邻接表即可完成全图搜索对任意一点,所有点均会入堆至少一次
第三组:第一组+第二组综合
决赛
流程:读图预处理->储存图->dijkstra计算最短路+优先队列->计算位置关键中心性->输出
基本思想:以每个点出发做dijstra,求出到个点的单源最短路径,并且按拓扑序反向递推计算中心性bc优化:
1.使用局部变量,减少使用全局变量;
2.使用数组代替vector;
3.保持结构体的定义 保持字节对齐
4.将id和边尽可能的连续,提高cache的命中率
5.更改数据类型,减少计算时间