2020华为软挑总结

2023-05-16

文章目录

    • 一、热身赛
        • 编程闯关:
        • 评价标准:
        • 问题分析
    • 二、初赛
        • 问题描述
        • 评价标准:
        • 问题分析
            • 思路一:
            • 思路二:
            • 思路三:
            • 针对思路三的提速:
        • 最终结果:
    • 三、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

五、民间数据集

民间数据集
知乎评价

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020华为软挑总结 的相关文章

  • C语言实现socket网络编程及多线程编程

    文章目录 一 概述二 TCP socket网络编程1 server端程序实现 xff08 tcp server cpp xff09 2 client端程序实现 xff08 tcp client cpp xff09 3 编译与执行 三 UDP
  • 基于openssl实现https双向身份认证及安全通信

    文章目录 一 概述二 代码设计2 1 ssl server c程序设计2 2 ssl client c程序设计 三 测试 一 概述 https基于SSL TLS提供安全的通信信道 xff0c 基于证书认证技术实现服务器和客户端之间的身份认证
  • ubuntu的不同版本

    ubuntu是现在最流行的Linux安装包 xff0c 本文介绍了ubuntu的各种版本 一 Ubuntu 每个ubuntu的版本都包含一个版本号 xff08 version number xff09 和一个代码名 xff08 code n
  • Linux下通过service服务管理用户进程

    文章目录 一 service配置介绍1 1 service配置文件1 2 配置文件的区块1 3 修改配置文件后重启1 4 服务管理 二 设计一个可执行程序三 设计一个service管理 home ubuntu test servicetes
  • c++中多态调用场景下基类析构函数的virtual声明

    文章目录 一 基类析构函数未加virtual声明的情况1 1 基础示例演示1 2 进阶示例演示 二 基类析构函数添加virtual声明的情况三 总结 一 基类析构函数未加virtual声明的情况 在多态场景中 xff0c 可通过基类的指针指
  • protobuf协议原理及实现,基于c++

    文章目录 一 protobuf协议简介1 1 protobuf协议简介1 2 数据交互xml json protobuf格式比较1 3 关于 ProtoBuf 的一些思考 二 protobuf库安装三 protobuf库使用第一步 xff0
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • ROS2学习笔记(1)ROS2+docker的配置方法

    ROS2学习笔记 xff08 1 xff09 ros2 43 docker的配置方法 1 前言2 安装docker2 1 docker的发展史2 2 什么是docker2 3 docker的思想2 3 1 集装箱2 3 2 标准化1 运输方
  • ubuntu之更改ubuntu和windows双系统启动顺序

    ubuntu之更改ubuntu和windows双系统启动顺序 背景方法 背景 安装好ubuntu和windows双系统后 xff0c 一般grub引导默认选择第一个为启动项 xff0c 在公司打工还好 xff0c 毕竟要进ubuntu挣钱
  • 【lightDM】组件理解

    前言 LightDM xff08 Light Display Manager xff09 是轻量级 Linux 桌面显示管理器 其目的是成为 X org 的 X Server 的标准显示管理器 LightDM 负责启动 X servers
  • 【机器人学中的状态估计】第一讲

    1 什么是状态估计 xff1f 通过获得传感器的观测值 xff0c 建立观测值到状态量的模型 xff0c 估计出状态量 2 概率密度函数 后验概率 p x y
  • VScode环境下使用git与github远程操作要点记录

    部分内容来源于网络 xff0c 外加了自己的实践 xff0c 记录了一下 文章目录 一 windows上使用git1 官网下载git https git scm com download win 2 创建本地仓库 二 git远程连接gith
  • 【千律】C++基础:TXT文件的创建、写入和读取

    include lt fstream gt include lt iostream gt using namespace std int main 初始化 ifstream iread txt 初始化输入流 ofstream write t
  • Matlab计算福利彩票的中奖概率

    Quez1 计算福彩双色球一等奖的中奖概率 福彩双色球的玩法如下 从编号1 33的红球里任选6个 另外在编号1 16的蓝球里再任选1个 如果选择的红球和蓝球和当期的开奖结果完全一致 顺序可不同 则中一等奖 Analysis 这是一个组合问题
  • 【千律】OpenCV基础:基于梯度的模板匹配

    环境 xff1a Python3 8 和 OpenCV 内容 xff1a 基于梯度的模板匹配 主要关注边缘信息 xff0c 能够较好的识别不同颜色的目标 实现步骤 xff1a 1 给定原图像I和模板T 2 指定差异度 xff08 相似度 x
  • golang使用SM2(SM2withSM3)签名、验签数据

    golang使用SM2签名 验签数据 场景标准密钥签名算法 Start依赖公钥转base64私钥转hex私钥生成公钥生成密钥对Hex私钥转私钥对象base64公钥转公钥对象签名验签 测试 场景 对接招行支付 标准 密钥 私钥 xff1a H
  • 树莓派与pixhawk串口通信

    一 Pixhawk部分 1 读取数据测试 步骤 xff1a 在Firmware src modules中添加一个新的文件夹 xff0c 命名为rw uart在rw uart文件夹中创建CMakeLists txt文件 xff0c 并输入以下
  • 关于pixhawk波特率修改的两种方法

    一 QGC地面站修改 将pixhawk与地面站相连接进入参数设置界面 xff0c 搜索SYS COMPANION参数设置需要的波特率保存设置 二 终端 xff08 Terminal xff09 修改 打开终端 xff0c 进入源码所在Fir
  • gazebo仿真环境搭建

    主要内容 xff1a 安装gazebo配置gazebo运行gazebomavros控制飞机 1安装gazebo 如果已经安装MAVROS可以直接在终端上输入gazebo查看是否已经拥有gazebo xff0c 因为MAVROS中含有gaze
  • Intel Realsense D435i标定详细步骤

    主要介绍Inter D435i深度相机的IMU 相机和IMU与相机外参数标定的过程 其中 IMU使用的是realsense官方文档的教程 相机和外参数使用的是Kalibr的标定方法 本文所介绍过程的所有代码和生成文件资源放在Kalibr工具

随机推荐

  • 在Ubuntu、NVIDIA_TX2下查看CPU/GPU/内存使用率

    一 Ubuntu 1 cpu 内存 1 使用top命令 top 2 更直观的工具htop sudo apt get install htop htop 2 gpu 用nivida smi命令 xff0c nvidia smi 这个命令只能显
  • 基于RT-Thread OS的 迷你时钟项目

    基于RT Thread OS的 迷你时钟项目 近期在自学RT Thread OS 这是一个国内团队开发的实时物联网操作系统 xff0c 具有组件完整丰富 高度可伸缩 简易开发等优点 RTOS官网 参考学习文档 作品演示 基于RT Threa
  • C++_namespace命名空间

    catalog 内嵌enum class namespace命名冲突多个同名namespace的原理开头 变量 函数前命名空间前 规范写法作用域Base定义顺序 内嵌 c 43 43 17后 支持 namespace A B C 写法 en
  • c++_exception异常,try和catch,noexcept,throw

    catalog noexcept 函数base自定义异常类noexcept 和 throw noexcept 函数 bool f 61 noexcept func 判断 func 函数 是否有标记noexcept base throw 是
  • SQL4种匹配规则

    SQL提供了四种匹配模式 xff1a 1 表示任意0个或多个 字符 如下语句 xff1a Select FROM user Where name LIKE 39 三 39 将会把name为 张三 xff0c 三脚猫 xff0c 唐三藏 等等
  • SDN的HUB实验

    SDN的hub实验 首先需要搭建ryu控制器环境和mininet环境 使用winscp将hub的py代码上传到服务器啊贝云 使用命令搭建拓扑环境 mn topo 61 single xff0c 3 controller 61 remote
  • CSDN上代码块背景颜色的设置

    CSDN上代码块背景颜色的设置 今天发博客的时候发现代码块背景的颜色是白色的 xff0c 我想要改成黑色的 xff0c 于是就研究了一下怎么修改代码块背景的颜色 xff0c 修改代码块的背景颜色只要4步 1 点击个人头像打开管理博客 2 在
  • 模拟电路和数字电路PCB设计的区别

    本文就旁路电容 电源 地线设计 电压误差和由PCB布线引起的电磁干扰 EMI 等几个方面 xff0c 讨论模拟和数字布线的基本相似之处及差别 工程领域中的数字设计人员和数字电路板设计专家在不断增加 xff0c 这反映了行业的发展趋势 尽管对
  • k8s部署资源服务的注意事项

    前言 为了k8s的资源服务能够高效 稳定 健康的运转 xff0c 需要对其进行相应的设置 资源类别 声明每个Pod的resource 在使用k8s集群时 xff0c 经常会遇到 xff1a 在一个节点上调度了太多的Pod xff0c 导致节
  • OCR中有见解的评论

    一 关于人脑与计算机识别的区别 电脑识别最主要是依赖简单的线性分类问题 把20 20个像素直接展成400维向量 xff0c 分类之 虽然现在的算法越来越常见地引入了非线性 xff0c 但是这种非线性的复杂度还是远没法和人脑相比 人脑则是多层
  • 梯度响应图——针对无纹理目标的检测

    题目 xff1a Gradient response maps for real time detection of textureless objects amp emsp xff1b gt amp ensp xff1b gt amp n
  • 深度学习技术在语义分割中的应用综述

    论文题目 xff1a A Review on Deep Learning Techniques Applied to Semantic Segmentation 博客园上的翻译 知乎上的提取 CSDN上的总结1 CSDN上的总结2
  • A Survey on Optical Character Recognition System 光学字符识别系统综述

    论文题目 xff1a 2017 A Survey on Optical Character Recognition System 摘要 光学字符识别 xff08 OCR xff09 是近年来研究的热点 它被定义为将文档图像数字化为其组成字符
  • 数据结构算法与解析(STL版含源码)

    文章目录 第1章 线性表1 1 顺序存储结构1 1 1 顺序表1 1 2 vector线性表 STL的顺序存储结构 1 2 链式存储结构1 2 1 单链表1 2 2 双向循环链表1 2 3 list线性表 STL的链式存储结构 1 3 静态
  • C++后台开发面试题集绵

    文章目录 一 C 43 43 语言1 引用和指针的区别 xff1f 3 C 43 43 中指针参数传递与引用参数传递 xff1f 4 形参与实参的区别 xff1f 5 static的用法和作用 xff1f 6 静态变量什么时候初始化 xff
  • 计算机网络

    文章目录 第一章 概述小结局域网 广域网 Internet网络通信 xff08 OSI模型 xff09 xff1a 计算机网络的性能指标 xff1a 第二章 物理层小结物理层的基本概念数据通信的基础知识基带与带通 xff1a 常用编码 xf
  • mysql使用和优化

    取当天0点0分 xff0c 下一天0点0分 UNIX TIMESTAMP获取时间戳 timestamp获取时间 select UNIX TIMESTAMP date sysdate timestamp adddate date sysdat
  • 数据库系统

    文章目录 第1章 概论第2章 基本知识与关系模型1 数据库 数据库管理系统 数据库系统什么是数据库什么是数据库系统什么是数据库管理系统DBMS小结 2 数据库系统的结构抽象与演变数据库系统的标准结构3 数据模型4 数据库系统的演变与发展5
  • 操作系统(学习笔记)

    文章目录 1 什么是操作系统2 操作系统的启动3 操作系统的接口4 系统调用的实现5 操作系统的历史6 我们的任务8 CPU管理9 多进程图像1 读写PCB xff0c OS中最重要的结构 xff0c 贯穿始终 2 要操作寄存器完成切换 x
  • 2020华为软挑总结

    文章目录 一 热身赛编程闯关 xff1a 评价标准 xff1a 问题分析 二 初赛问题描述评价标准 xff1a 问题分析思路一 xff1a 思路二 xff1a 思路三 xff1a 针对思路三的提速 xff1a 最终结果 xff1a 三 co