自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 资源 (2)
  • 问答 (1)
  • 收藏
  • 关注

原创 通俗易懂的图解二叉搜索树、AVL树和红黑树

搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。但是数组并不便于插入和删除,链表便成为了最好的选择。既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。二叉搜索树的性质为:若左子树不为空,则左子树上所有节点值都小于根结点值;

2022-07-06 21:21:02 424 1

原创 C++智能指针

由于使用malloc、new在堆上申请空间后,容易忘记释放对应空间,C++提出了智能指针管理申请的内存,避免内存泄露。RAII(Resource Acquisition Is Initialization),是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。.........

2022-06-07 16:28:03 299

原创 webserver介绍与实现(利用各模块的封装实现)

前言此博客记录对于TinyWebServer项目的学习,并根据自己的理解做出些许更改。原项目地址:https://github.com/qinguoyi/TinyWebServer服务器基本规范服务器框架服务器程序虽然种类繁多,但是基本框架都是一样的。I/O处理单元是服务器管理客户连接的模块。它通常要完成以下工作: 等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。但是,数据的收发不一定在I/О处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式(rea

2021-11-19 16:30:10 12489 2

原创 webserver之定时器

前言此博客记录对于TinyWebServer项目的学习,并根据自己的理解做出些许更改。原项目地址:https://github.com/qinguoyi/TinyWebServer定时器网络程序通常需要处理定时事件,例如定期检测客户连接的活动状态,因为非活跃连接占用了连接资源,需要定期检测释放非活跃连接。通常将定时事件封装为定时器类,然后使用排序链表、时间轮等数据结构管理定时器。linux提供了三种定时方法,1.socket选项SO_RCVTIMEO和SO_SNDTIMEO2.SIGALRM信

2021-11-12 17:02:50 1967

原创 排序算法——十大排序算法的图示与实现

十大排序算法概览比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。前七种为比较类排序,后三种为非比较类排序。稳定性:如果a=b,且a在b前面,排序之后仍能保证a在b前面,则为稳定的。插入排序逻辑将左端第一个元素视为有序,然后遍历后面的元素,逐步插入到有序序列中。代码实现//插入排序void

2021-11-12 16:59:52 1301

原创 webserver之mysql模块

前言此博客记录对于TinyWebServer项目的学习,并根据自己的理解做出些许更改。原项目地址:https://github.com/qinguoyi/TinyWebServermysql模块逻辑:单例模式,RAII机制使用以空间换时间的思想,使用连接池的模式初始化多个mysql连接,采用单例懒汉模式创建连接池,使用信号量表示空闲连接数,管理连接出池入池,并且在入池出池操作前加锁,避免操作冲突。使用RAII机制,将外部获取连接封装到类connectionRAII中,在该类的构造函数中获取连接池中

2021-10-25 20:44:04 567

原创 webserver之处理HTTP请求

前言此博客记录对于TinyWebServer项目的学习,并根据自己的理解做出些许更改。原项目地址:https://github.com/qinguoyi/TinyWebServer测试效果先放一波效果图HTTP请求HTTP GET请求行内容。第一行为请求行,分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。后面都是头部字段。在所有头部字段之后,HTTP请求必须包含一个空行,以标识头部字段的结束。请求行和每个头部字段都必须以结束(回车符和换行符)﹔而空行则必须

2021-10-14 15:36:07 1204

原创 webserver之日志系统

前言此博客记录对于TinyWebServer项目的学习,并根据自己的理解做出些许更改。原项目地址:https://github.com/qinguoyi/TinyWebServerLog日志系统是用来存储程序运行中的通知信息、warning、error等。首要任务就是格式化输出字符串到一个文件,还应当记录消息产生的时间,此系统选择使用按天作为文件名。以消费者-生产者模式,使用阻塞队列实现线程异步处理Log消息。还实现了主线程同步处理Log消息。Log.h从头文件可以清楚看出Log类具有的功

2021-09-29 15:45:41 1420 1

原创 webserver之使用数组实现阻塞队列

阻塞队列阻塞队列特性,当队列中没有元素时,对这个队列的弹出操作将会被阻塞,直到有元素被插入时才会被唤醒;当队列已满时,对这个队列的插入操作就会被阻塞,直到有元素被弹出后才会被唤醒。queue容器在程序结束时才会释放内存,deque可以动态释放,也可使用new分配容器再使用delete释放,vector* vec_ptr = new vector;delete vec_ptr;使用数组实现可以预留出固定大小的内存,个人理解使用数组的优势所在。代码实现#ifndef BLOCK_QUEUE_

2021-09-28 09:52:39 210

原创 线程同步的三种机制

线程同步线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。即是避免同时操作变量,产生冲突。POSIX信号量信号量大于0时,等待信号量的线程被唤醒sem_init(sem_t* sem, int pshared, unsigned int value)初始化信号量,默认为进程共享的,pshared = 0指定为局部信号量,value为初始值sem_wait(sem_t* sem)阻塞

2021-09-24 19:35:17 1362

原创 剑指Offer14-剪绳子1&2

题目描述–剪绳子1思路分析首先要分析出怎么切分是最优方案,显然和一定时,分成相等的数的乘积最大。用简单的数学归纳的思想可以发现,4对应2*2,5对应2x3,6对应3x3,7对应3x2x2,8对应3x3x2,显然分为3是最优选,然后是2。由不等式也可解出极值点是e约为2.7,距离3最近。动态规划首先最直接会想到用动态规划的思想解题,先考虑切3,判断切3后的值是否大于dp中对应的值,依此向前填充dp矩阵,然后考虑切2int cuttingRope(int n) { if(n &l

2021-08-24 12:38:02 86

原创 深度优先搜索(解题剑指Offer12、13)

剑指Offer12-矩阵中的路径 题目描述思路分析显然这是一个深度优先搜索的题,遍历整个矩阵寻找word的首字母,然后对首字母位置的上下左右四个方向进行延展,判断第二个字母是否存在,依此方法直到找到整个word字符串,即为true。为了避免重复遍历某个位置,在一条分支走过该位置时将其置为数字等不影响的字符作为标记,由于不同分支互不影响,所以在该分支结束时需要将标记恢复。代码bool exist(vector<vector<char>>& board, string

2021-08-21 16:30:46 66

原创 使用VGG16网络结构训练自己的图像分类模型

配置tensorflow2.4.0python3.6猫狗大战数据集代码VGG16网络很著名,这里不再介绍。keras里有预训练好的VGG16,tensorflow2.0以后的版本中已经集成了keras。解释在代码中。import tensorflow as tfimport tensorflow.keras as kerasfrom tensorflow.keras.models import Sequential, Modelfrom tensorflow.keras import

2021-07-21 16:20:50 1168

原创 Select网络模型下的简单CS实例

Select网络模型Select模型属于IO多路复用模型的一种,select使用一个socket数组来存放连接的socket。select会监视数组中所有的socket,可以知道哪些socket可读或者可写,从而避免无效操作(例如去读取不可读的socket,而在select中可以先查询该socket是否可读)。这样多个socket的IO操作能在一个线程内并发交替完成,这就是IO多路复用(复用同一个线程)。使用select模型实现的简单服务端与客户端服务端代码#define WIN32_LEAN_A

2021-07-19 20:41:31 167

原创 快速幂算法

快速幂算法假设求pow(2, 20),一次一次的累乘非常耗时间,需要进行20次运算。将指数20使用二进制表示为10100。则2^20 = 216*24可以看出每当二进制位为1时将对应2的幂指数乘到结果上即可。从最低位开始迭代,在迭代时将底数进行自乘,可得到对应的幂。而计算机存储数据时正是以二进制存储的,使用二进制不需要进行转换,对于指数需要判断它的最低位是否为1,然后将其右移一位继续判断,直到指数为0。代码实现double quick(double x, long long n) { dou

2021-07-06 19:37:13 106

原创 windows简单TCP通信 C++

尝试使用自定义struct和char发送信息。服务器根据客户端发送的不同消息进行回应。在发送struct时先发送一个“Who”以便客户端确认。服务器#define WIN32_LEAN_AND_MEAN//#define _WINSOCK_DEPRECATED_NO_WARNINGS#include<windows.h>#include<WinSock2.h>#include<stdio.h>#include <WS2tcpip.h>

2021-07-04 20:30:51 647

原创 百度飞浆ocr配置

本次配置基于Windows10平台anaconda3进行配置。1 建立虚拟环境可以在Navigator里新建,也可以在Prompt命令窗口内创建conda create --name ocractivate ocr2 安装 paddlepaddle-gpu 2.0.0版python -m pip install paddlepaddle-gpu==2.0.0b0 -i https://mirror.baidu.com/pypi/simple安装时如果有报错ValueError: chec

2021-06-25 15:38:43 1436

原创 剑指offer38题

问题描述剑指offer38题问题分析最直观的想法就是使用深度搜索遍历每一个分支,找出所有组合,但是此问题要求结果中的字符串不重复,这就需要我们在使用DFS时进行剪枝,即是在每一层将重复的字符去除。以abc和aab为例,红色表示被去除的分支。代码实现dfs剪枝vector<string> result;void perm(unsigned start, string str) { if (start == str.size() - 1) { result.push_ba

2021-06-23 12:15:28 196

原创 01背包问题详解

问题描述有一堆物品,具有各自的重量、价值,有一个一定容量的背包装取物品,得到最大的价值。由于每个物品都有装或不装两个状态,即01状态,所以称为01背包问题。暴力破解最直接的思路是利用深度优先的思想,遍历所有的方案,每个物品有两种状态,共有2^n种可能方案。动态规划采用动态规划更加节约空间和时间。实例分析最后一块石头的重量 IIclass Solution {public: int sum = 0; int lastStoneWeightII(vector<int&

2021-06-13 16:12:13 8943

原创 Pandas+Pyecharts 数据分析与可视化 3D地图+柱状图

数据格式手机信令数据,可依据sid判断用户,lon和lat对应位置的经纬度信息,还有时间和地区街道等信息数据预处理首先读取数据,按列选取需要用到的数据,并清洗数据。data = pd.read_csv('./mobile_0.csv',encoding='GBK')data = data[['sid','ts', 'lon', 'lat', 'region', 'street', 'address', 'area', 'building', 'category_tags_

2021-03-26 22:25:25 2318

原创 爬虫入门学习:爬取股票论坛信息

准备工作安装requests、bs4库。获取headers,目标网址guba.eastmoney.com,先打开一个网页标签,进入开发人员工具,选择network网络,然后进入目标网址,找到下图所示的点击可得,正式爬取此处选择茅台的讨论区进行爬取,其url为http://guba.eastmoney.com/list,600519_1.html。首先测试能否访问网址,import requestsimport csvfrom requests.exceptions import R

2021-03-08 15:28:39 966

原创 数字信号处理

FFT、混频快速傅里叶变换快速傅里叶变换将离散的时域数据转到频域上,变换后是对称的,取单边即可。信号s1包含三个频率f1、f3、f4。根据奈奎斯特采样定律,采样频率48000Hz,傅里叶变换后频域到24000Hz。fs = 48000f1 = 5000f2 = 2000f3 = 9000f4 = 3000pi = math.pipi = math.pin = np.arange(3000)s1 = np.sin(2*pi*f3*n/fs)+np.sin(2*pi*f4*n/fs)+n

2021-03-02 18:48:00 339

原创 ROS学习—opencv使用之图片传输

ROS学习—opencv使用之图片传输前提操作:ros已安装,opencv已安装。首先在工作空间中新建一个功能包rosopencvcatkin_create_pkg rosopencv sensor_msgs cv_bridge roscpp std_msgs image_transport编译一下catkin_make,新建cpp文件如下#include <ros/ros.h>#include <image_transport/image_transport.h>#

2020-12-23 16:09:58 1107 1

原创 ROS入门 TX2+Turtlebot+Kinect2.0配置记录

首先是刷机,本人使用的是虚拟机,此处一坑,使用VMware一定要选择新版本的,旧版本的功能不稳定,容易卡死。装ros-Kinect版对应的是ubuntu16.0,所以虚拟机也用的ubuntu16.0,参考创客教程无其他问题出现,等待时间更久一些,Tx2可以接显示器观察刷机情况。刷机完成后先进行换源,此处注意arm源和普通ubuntu源不同,然后开始装ros,参考创客教程无问题。装完ros后要初始化一个工作空间,个人理解为类似一个工程文件夹的初始化,工作空间可以删除以及建立多个。创建工作空间后都要配置环境

2020-10-15 11:21:42 487 1

原创 声波成像学习笔记

发射信号数学模型推导论文M. O’Toole, D. B. Lindell, and G. Wetzstein, “Confocal Non-Line-of-Sight Imaging Based on the Light-Cone Transform,” Nature, vol. 555, no. 7696, pp. 338-341, 2018.D. B. Lindell, G. Wetzstein,and V. Koltun, “Acoustic Non-Line-of-Sight I

2020-09-14 16:32:20 972

原创 超声学习 Field ll使用

超声学习 Field_ll使用,持续更新下载Field_ll包函数命令汇总下载Field_ll包使用field_init命令初始化,函数命令汇总field_init #初始化field_end #终止退出set_sampling #设置采样频率set_field #设置仿真参数xdc_apodization #创建一个换能器孔径的变迹时间线...

2020-09-14 16:20:26 747

原创 f-k偏移算法成像

处理流程图由于LCT的图像形成模型严格地假设了漫反射,因此在重建过程中,伪影以条纹的形式出现在物体周围。由于f-k偏移没有对隐藏对象的反射特性作出明确的假设, f-k偏移可以为镜面反射对象产生更高质量的重建。就平均绝对误差而言,f-k偏移比LCT好3.5倍,就中值绝对误差而言,f-k偏移比LCT好1.8倍。对于漫反射和有光泽的对象,f-k迁移和LCT的重建都趋于相似,尽管f-k迁移通常对测量中存在的噪声不太敏感。1.问题1)虽然f-k偏移提供了波动方程的精确解,但波偏移模型和基于几何光学的标准NL.

2020-07-28 10:05:13 1938

原创 TCP,UDP学习总结

树莓派通过TCP发送读取的传感器信息,通过UDP发送摄像头信息,采用opencv编码,通过两个线程来分别实现这两个功能,TCP线程如下:def tcplink(sock, addr): pow=30 #print('Accept new connection from %s:%s...' % addr) try: while True: temp=str(pow) sock.send(temp.encode('gbk'

2020-05-21 13:47:44 128

经典数据集——猫狗大战数据集

kaggle猫狗大战竞赛的数据集,压缩包包含猫狗图片各12500张,分为cat和dog两个文件夹,方便用于图像识别

2020-10-28

2019研究生数学建模试题及优秀论文.rar

2019全国研究生华为杯数学建模试题,以及A,B,C,D,E,F各组优秀论文均有,非常有参考意义,欢迎下载参考使用。

2020-07-28

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除