<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Sunny5106的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Sunny5106</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Sunny5106]]></copyright><item><title><![CDATA[【简明清晰】各种内部排序算法的比较及应用归纳]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119716481</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119716481</guid><author>Sunny5106</author><pubDate>Sun, 15 Aug 2021 17:24:32 +0800</pubDate><description><![CDATA[排序算法的性质
	算法种类
			时间复杂度
			空间复杂度
			是否稳定
		最好情况
			平均情况
			最坏情况
		直接插入排序
			O（n）
			O（n²）
			O（n²）
			O（1）
			是
		冒泡排序
			O（n）
			O（n²）
			O（n²）
			O（1）
			是
		简单选择排序
			O（n²）
			O（n²）
			O（n²）
			O（1）
			否
		快速排序
			O（nlog2n）
			O（nlog2n）
			O（n²）
			O（nlo]]></description><category></category></item><item><title><![CDATA[线索二叉树中序线索化以及构造]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119679330</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119679330</guid><author>Sunny5106</author><pubDate>Fri, 13 Aug 2021 16:56:24 +0800</pubDate><description><![CDATA[传统的二叉链表存储仅能体现一种父子关系，不能直接得到结点在遍历中的前驱或者后继。



线索二叉树的存储结构：


typedef struct ThreadNode
{
    ElemType data;
    struct ThreadNode *lchild, *rchild;    //左右孩子指针
    int ltag, rtag;                        //左右线索标志
}THreadNode, *ThreadTree;


ltag=0：lchild域指向结点的]]></description><category></category></item><item><title><![CDATA[更好用的冒泡排序、双向冒泡排序，拓展荷兰国旗问题]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119647260</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119647260</guid><author>Sunny5106</author><pubDate>Thu, 12 Aug 2021 16:37:33 +0800</pubDate><description><![CDATA[冒泡排序



基本思想：从后往前（或者从前往后）两两比较相邻元素的值，若为逆序，则交换他们，直到序列比较完。当一整趟下来都没有元素被移动，代表算法可以提前结束。好比于关键字小的元素逐渐往上漂浮直到冒出水面，关键字打的元素如石头一般下沉到水底。






void BubbleSort(ElemType A[], int n)
{
	for(int i=0; i&lt;n-1; i++)
	{
		flag = false;		//表示本趟冒泡是否发生交换的标志
		for(int j=n-1; j&gt]]></description><category></category></item><item><title><![CDATA[简单易懂插入排序算法大全：直接插入、折半插入、希尔Shell排序]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119612893</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119612893</guid><author>Sunny5106</author><pubDate>Wed, 11 Aug 2021 18:01:33 +0800</pubDate><description><![CDATA[直接插入排序



直接插入排序的思想最简单也最直观

步骤：

1、查找出L（i）在［1…i-1］中的插入位置k； 

2、将L［k…i-1］中所有元素依次后移一个位置；

3、将L（i）复制到L（k）

思想：每次将一个待排序的记录，按key大小插入到前面已排好序的子序列中


void Directly_InsertSort(ElemType A[], int n)
{
	int i, j;
	for(int i=2; i&lt;=n; i++)
	{
		//依次将A[2]～A[N]插入到前面已排序]]></description><category></category></item><item><title><![CDATA[C++知识点汇总：内存分配、面向对象]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517705</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517705</guid><author>Sunny5106</author><pubDate>Wed, 11 Aug 2021 17:40:09 +0800</pubDate><description><![CDATA[C++ 内存的分配方式有几种？
	从静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量。
		在栈上创建。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中，效率很高，但是分配的内存容量有限。
		从堆上分配，亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存，程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定，使用非常灵活，]]></description><category></category></item><item><title><![CDATA[C++知识点汇总：引用、指针、virtual、inline、new、delete]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517693</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517693</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 17:25:12 +0800</pubDate><description><![CDATA[C++ 引用和指针的区别
	指针一般指的是某块内存的地址，通过这个地址，我们可以寻址到这块内存；而引用是一个变量的别名，例如我们给小明起了个外号
		指针可以为空，引用不能为空
		引用
		引用被称为变量的别名，它不能脱离被引用对象独立存在
			引用变量在功能上等于一个指针常量，即一旦指向某一个单元就不能在指向别处
			在底层，引用变量由指针按照指针常量的方式实现
			引用看做是通过一个常量指针来实现的，它只能绑定到初始化它的对象上
		
		指针
		指针p也是对象，它同样有地址&amp;p和存储]]></description><category></category></item><item><title><![CDATA[C++知识点汇总：const、纯虚函数、析构、内敛、extern]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517661</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517661</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 17:23:57 +0800</pubDate><description><![CDATA[C++ const 指针
	
		const指针是指针变量的值一经初始化，就不可以改变指向，初始化是必要的。
		当成员函数被声明为const时，如果试图修改对象的数据，编译器将视为错误。
		如果声明了一个指向const对象的指针，则通过该指针只能调用const方法（成员函数）。
	


C++ 指向const的指针

	指针指向的内容是不能被修改的
		
	


C++ 纯虚函数

	
		抽象类的特点
		不能构建对象，可以构建对象指针
			一般拿来充当中间访问层
		
	


C++ 虚析构函数
]]></description><category></category></item><item><title><![CDATA[C++知识点汇总：多态、转换、指针、引用、重载、模板]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517616</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517616</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 17:22:31 +0800</pubDate><description><![CDATA[C++多态性
	一个接口，多种方法
		不同继承关系的类对象，去调用同一函数，产生的不同的行为
		继承中构成的条件
		调用函数的对象必须是指针或者引用
			被调用的函数必须是虚函数，且完成了虚函数的重写
			虚函数的重写（覆盖）
				派生类中有一个跟基类完全相同的虚函数
					不同作用域（分别在基类和派生类）
					函数名、参数、返回值都相同
					基类函数必须有virtual关键字
				
			
		
	


静态多态

	编译器在编译期间完成多态的构建
		实现方式
		函数]]></description><category></category></item><item><title><![CDATA[OpenCV 360度行车辅助系统——增强型倒车辅助]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517553</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517553</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 17:18:51 +0800</pubDate><description><![CDATA[这个算法是我自己学习到的，和卓跃的级联分类器方法不大一样。光流分析的灵感来自于视频拼接。

1、因为这种算法会将每一帧画面的运动结构进行一个函数解析，通过泰勒公式将目标兴趣点连接，甚至可以达到一个预判的效果



3、我们这种光线捕捉的方法，只需要有光线就可以识别到，很适合夜间模式行车



5、我们的核心就是：在第一帧图像中检测Shi-Tomasi角点， - 使用LK算法来迭代的跟踪这些特征点，如果在当前帧找到了上一帧中的点，那么这个点的状态就是1，否则就是0







...]]></description><category></category></item><item><title><![CDATA[OpenCV 360度行车辅助系统——红绿灯智能预判]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517209</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517209</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 17:06:15 +0800</pubDate><description><![CDATA[AI学习红绿灯
此功能仅限前置摄像头。当视频刚开始播放时，通过自研AI算法学习红绿像素高频出现的位置，学习结束后根据学习结果判断是否使用AI红绿灯 区域，并在接下来的视频部分针对区域进行红绿灯识别。

检测到红灯则在视频底端显示“Red”字样，检测到绿灯则在视频底端显示“Green”字样。













1、收集前5%帧的红绿色素点

2、按照坐标大小排序，删掉前后10%，删掉异常大、小的值

3、筛选后判断结果数量是否充足，充足则开始使用，不足则用系统默认的区域

4、在应用的过程中持...]]></description><category></category></item><item><title><![CDATA[STM32串口通信如何实现]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517129</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517129</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 16:58:56 +0800</pubDate><description><![CDATA[在系统开机完成后，可以往串口发送指定格式的指令，系统接收到指令后会执行该
指令，并将指令执行结果返回到串口和系统主界面上的系统信息区






通过串口发送&lt;GetTime&gt;指令给系统，系统返回当前的时间至串口,返回的时间格式
YYYY/MM/DD hh:mm， OK 结束，同时系统底部信息区显示 USART:&lt;GetTime&gt;。



通过串口发送&lt;SetTime,2019-08-03,05:40:38&gt;指令给系统，系统设置当前系统时间，
串口返回 OK,在系统主..]]></description><category></category></item><item><title><![CDATA[使用STM32安装接线和软件初始化]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119517043</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119517043</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 16:54:51 +0800</pubDate><description><![CDATA[设备： STM32 开发板、语音模块、音频解码模块、温湿度感应器模块、拓展电路板






拓展电路板接线（此步骤注意焊点，请误伤手）
对应每个模块，将每个模块上对应的 3.3V/GND 端接入对应推展电路板端口。
语音模块： 3V3-3.3V GND-GND
温湿度感应器模块： 3V3-3.3V Data-DATA GND-GND
音频解码模块： GND-GND
其中四根直连线对应开发板 GPIO 口：
红-PA7
褐-PA6
黑-PA5
白-PE6





正确接线情况






软件初...]]></description><category></category></item><item><title><![CDATA[创建你的第一个OpenCV项目]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119516982</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119516982</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 16:51:12 +0800</pubDate><description><![CDATA[1.1．Mat类的所有内容

 Mat这个类名是由矩阵借用而来的，是一个n维的数组，能够在单个或多个通道中存储和处理不同的数学数据类型。计算机视觉中的图像就是像素矩形（因此是二维数组），具有指定的宽度（矩阵中的列数）和高度（矩阵中的行数）。此外，灰度图中的一个像素可以用单个数字来表示（因此是单通道），最小值（通常是0）表示黑色，最大值（通常是255，即一个字节能表示的最大的数字），表示白色，最大与最小值之间的所有值相应地对应于不同的灰度。







同样地，在标准RGB彩色图像中一个像素有三个...]]></description><category></category></item><item><title><![CDATA[如何使用Qt配置运行使用OpenCV]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119516924</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119516924</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 16:49:21 +0800</pubDate><description><![CDATA[0.5．开始Qt配置OpenCV

首先先用Qt5创建一个新工程，可以选择Non-Qt-Project，不调用Qt的库文件：











也可以使用常规Qt开发环境：









【注】如果没有出现MSVC2015 32bit这种编译器，说明Qt版本过高（如Qt5.12及以上就会淘汰掉低版本，其他版本笔者未使用过）。

在pro文件底端加上两行代码，以引入OpenCV构建好的库：





待pro文件完成了OpenCV包的导入之后，我们还需要在qt头文件里面引用库函数。此时检查...]]></description><category></category></item><item><title><![CDATA[OpenCV安装步骤，手把手教你解决一切问题]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119516864</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119516864</guid><author>Sunny5106</author><pubDate>Sun, 08 Aug 2021 16:46:38 +0800</pubDate><description><![CDATA[0.1．关于OpenCV

OpenCV（Open Source Computer Vision Library）是一个开源的机器视觉和机器学习软件库。OpenCV为计算机视觉提供框架，产品受BSD授权。OpenCV库含有超过2500种优化的算法，其中包括全面经典的和当今世界最先进的机器视觉学习算法，可以用来检测和识别人脸，识别对象、人类行动的视频分类，跟踪相机移动，跟踪物体移动，提取对象的3D模型，从立体相机产生3D点云图像缝合到一起还原一个高分辨率场景，还可以删除红眼、跟随眼球运动、识别景物，提供增强现]]></description><category></category></item><item><title><![CDATA[深度优先算法DFS实现图的遍历]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119389519</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119389519</guid><author>Sunny5106</author><pubDate>Wed, 04 Aug 2021 17:38:40 +0800</pubDate><description><![CDATA[与广度优先搜索不同，深度优先搜索DFS类似于树的先序遍历。



伪代码如下：


bool visited[MAX_NUM];		//访问标记数组

void DFS_Traverse(Graph G)
{
	for(v=0; v&lt;G.vex_num; ++v)
		visited[v] = false;
	for(v=0; v&lt;G.vex_num; ++v)
	{
		if(visised[v] == false)
			DFS(G, v);		//防止漏掉非连通图
	}
}

void D]]></description><category></category></item><item><title><![CDATA[广度优先算法BFS遍历图]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119388629</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119388629</guid><author>Sunny5106</author><pubDate>Wed, 04 Aug 2021 17:17:25 +0800</pubDate><description><![CDATA[广度优先搜索BFS类似于二叉树的层序遍历算法

以V0为源点，按距离由近至远依次访问和V有路径相同且路径长度为1，2，3...的顶点。广度优先搜索是一种分层的查找过程，每向前走一步可能访问一批顶点，依一个辅助队列的帮助，记忆正在访问的顶点的下一层顶点



伪代码如下：


bool visited[MAX_NUM];		//访问标记数组

void BFS_Traverse(Graph G)
{
	for(int i=0; i&lt;G.vex_num; ++i;)
	{
		visited[i] = f]]></description><category></category></item><item><title><![CDATA[难难难！如何求图的某一顶点到其他顶点最短距离？迪杰斯特拉Dijkstra和弗洛伊德Floyd要上场了]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119387454</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119387454</guid><author>Sunny5106</author><pubDate>Wed, 04 Aug 2021 16:55:55 +0800</pubDate><description><![CDATA[对于无权图来说，可以使用广度优先遍历算法BFS，实现求单源路径最短。但是，如果图带了权值，求这种最短路径可以通过经典的Dijkstra（迪杰斯特拉）算法或者是Floyd（弗洛伊德）算法来求解。当然，这两种算法也是不容易理解的。这里以简单直白的描述方式来介绍以上两种经典算法。



一、Dijkstra算法求单源最短路径问题



算法的核心是：循环遍历所有结点，找到还没有确定的最短路径，且dist最小的顶点Vi，令Final[i] ＝ true，以此来判断是否已找到最短路径。

dist[]：记录从源点V0]]></description><category></category></item><item><title><![CDATA[常见树的存储结构，及如何求以孩子兄弟法存储的森林的叶子结点数]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119277226</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119277226</guid><author>Sunny5106</author><pubDate>Sat, 31 Jul 2021 16:32:05 +0800</pubDate><description><![CDATA[树的存储方式有很多种，既可以采用顺序存储结构，也可以采用链式存储结构，只要能唯一地反映树中的各结点之间的逻辑关系就可以



首先介绍第一种，双亲表示法

双亲表示法：用一片连续空间（数组）来存储每个结点，同时在每个结点中增设一个伪指针（指明其双亲结点在数组中的位置）。因为根结点没有双亲，所以他的伪指针域规定为－1。


#define MAX_TREE_SIZE 100			//树中结点数
typedef struct
{
	ElemType data;
	int parent;						//双亲在数组]]></description><category></category></item><item><title><![CDATA[如何将表达式二叉树输出为中缀表达式（带括号）]]></title><link>https://blog.youkuaiyun.com/Sunny5106/article/details/119251173</link><guid>https://blog.youkuaiyun.com/Sunny5106/article/details/119251173</guid><author>Sunny5106</author><pubDate>Fri, 30 Jul 2021 16:45:56 +0800</pubDate><description><![CDATA[中缀表达式是最符合我们人类阅读的一种方式，因为它和我们日常的数学表达式很接近



算法思想：基于二叉树的中序遍历，但是我们要给关键位置加上左括号和右括号。除了根结点和叶子结点，遍历到其他结点的时候，在遍历左子树之前加左括号，遍历完右子树后加上右括号。




void Ready2Btree2Exp(BTree *root)
{
	Btree2Expression(root, 1);	//根结点的高度为1
}

void Btree2Expression(BTree *root, int deep)
{
]]></description><category></category></item></channel></rss>