数据结构与算法
文章平均质量分 88
zhanghuaichao
这个作者很懒,什么都没留下…
展开
-
C++线程池的实现
池式结构 在计算机体系结构中有许多池式结构:内存池、数据库连接池、请求池、消息队列、对象池等等。 池式结构解决的主要问题为缓冲问题,起到的是缓冲区的作⽤。 线程池通过使⽤线程池,我们可以有效降低多线程操作中任务申请和释放产⽣的性能消耗。特别是当我们每个线程的任务处理⽐较快时,系统 ⼤部分性能消耗都花在了pthread_create以及释放线程的过程中。那既然是这样的话,何不在程序开始运⾏阶段提前创建好⼀堆线程,等 我们需要⽤的时候只要去这⼀堆线程中领⼀个线程,⽤完了再放回去,等程.原创 2022-05-07 23:08:45 · 2513 阅读 · 0 评论 -
深入理解递归函数
1.递归函数概念介绍以及个人对递归的理解先给出一个概念:递归函数:我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。一直都对递归有种敬畏之情,因为之前在一家公司里是不让写递归的,我记得当时的理由是递归代码比较晦涩,所以自己也就一直没有对递归深入的了解,但是随着时间的推移,我感觉有的时候,用递归写的代码是优雅的,递归应该算作是一种算法,或者编程技巧。当然递归也有自己的缺点,它会有函数间的不断调用,函数调用栈是比较消耗时间和内存的,同时如果递归结束条件写的不对,也会造成原创 2022-05-04 18:00:35 · 5383 阅读 · 0 评论 -
红黑树的性质以及时间复杂度证明
很久就想写一篇红黑树的博客,一直没有倒出时间,今天想稍微的总结下红黑树,但是并不想介绍如何的进行插入删除,以及怎么进行旋转,变色,本编文章主要讲解红黑树的时间复杂度的证明,要想证明红黑树的时间复杂度,我们先得说说两件事,红黑树的性质和数学归纳法:1.红黑树的性质有哪些,有了这些性质,我们才能后面进行证明先来一张红黑树的图片,便于后期进行对红黑树进行分析:先说下红黑树的性质:Every node is either red or black. The root is black..原创 2022-03-28 18:27:11 · 2456 阅读 · 1 评论 -
将二叉搜索树转为一个排好序的双向链表
这道题在面试中比较常见,原因有几个1.要涉及到二叉树的中序遍历。2.考察了二叉排序树的特点。3.考察了双向链表。4.大量考察了指针的使用,以及递归思想。大致的解题思想如下:1.进行中序遍历2.完成上一个节点和当前节点的 二叉树和链表的左右指针关系的转化。2.1 原先指向左子节点的指针 调整为链表中指向前一个节点的指针2.2 原先指向右子节点的指针 调整为链表中指向后一个节点的指针我们的调整策略是两个点两个点之间进行调整 一次只会调整两个节点 不...原创 2020-12-06 17:55:18 · 227 阅读 · 0 评论 -
二叉树的前序遍历的非递归实现
我们知道二叉树的遍历主要有,前序,中序,后续,我们常用递归的方式进行实现,而我们都知道能用递归函数实现,都可以用数据结构栈进行实现。下面我们就用栈的数据结构来处理二叉树的前序遍历:BinaryTree.h#pragma oncestruct BinaryTreeNode{ int m_value; struct BinaryTreeNode* m_left; struct BinaryTreeNode* m_right;};//二叉树结点的创建struct BinaryTree原创 2020-12-06 17:23:27 · 1726 阅读 · 0 评论 -
二叉树的四种遍历方式
最近在复习树,学习了下树的遍历,以及静态的生成树,动态的生成树,我们一般用到的是#号法创建,这个请参考我的另外一篇博客这个不多说,直接上代码BinaryTree.h如下代码:#pragma oncestruct BinaryTreeNode{ int m_value; struct BinaryTreeNode* m_left; struct BinaryTreeNode* m_right;};//二叉树结点的创建struct BinaryTreeNode* CreateBin原创 2020-12-05 12:05:48 · 219 阅读 · 0 评论 -
单链表是否有环问题常见面试题
转载https://www.cnblogs.com/yorkyang/p/10876604.html转载 2020-11-29 20:45:54 · 137 阅读 · 0 评论 -
线性表的反转
线性表的反转,是指将头结点变成尾结点,尾结点变成头结点这个主要注意两点:防止断链,所以要提前保留当前指针的后一个指针,当前指针的next域要,指向前一个结点,所以要有前一个结点的指针,再加上当前结点,就是共有三个辅助指针变量。不多说,直接上代码,这里的代码用到了之前的我的一篇文章里的代码线性表的链式存储(传统模式)话不多说,直接上代码:#include<iostream>#include<vector>using namespace std;struc.原创 2020-11-28 21:28:51 · 1338 阅读 · 1 评论 -
排序算法之直接插入法
插入算法主要记住三点:就是算法的核心了1.要比较的元素拿出来2.符合条件的元素后移3.把拿出来的元素放到正确的位置直接上代码:#include<iostream>using namespace std;//直接插入元素的本质/*1.要比较的元素拿出来2.符合条件的元素后移3.把拿出来的元素放到正确的位置49 38 65 97 76 13 27*/void StraitInsertSort(int array[],int length){ int tmp =原创 2020-11-19 21:42:31 · 3083 阅读 · 0 评论 -
扩展二叉树(#号法)先序和后续可确定二叉树,中序不可
在我们动态的创建二叉树的时候,一般会选择#号法,本文主要是讲解为什么扩展二叉树的先序和后续都可以唯一确定一颗二叉树,而中序不可以。我们在讲解扩展二叉树之前,先来回顾下,非扩展的二叉树,非扩展的二叉树,我们在已知前序,中序,后续任意一个遍历序列的时候,都是不能唯一确定一个二叉树的,因为如果知道前序和后续,只是知道哪个是跟结点,但是无法区分左右孩子,而知道了中序遍历,不知道头结点,区分左右子树也没有意义,所以一定是前序+中序 或者后续+中序的组合才可以。而扩展二叉树的意思是把一棵树的左右孩子都..原创 2020-11-01 17:35:56 · 5270 阅读 · 2 评论 -
根据前序遍历和中序遍历得到二叉树后续遍历(一看就懂)
文章转载自:https://www.cnblogs.com/jiaxin359/p/9512348.html问题:已知一个二叉树前序遍历为:ABDEGCFH,中序遍历为:DBGEACHF,则该二叉树的后序遍历为?思路是这样的:1:根据前序遍历来确定每次根节点的位置,因为前序遍历先访问的是根节点,所以前序遍历第一个位置就是根节点。 2:根据根节点和中序遍历将树划分为左右两棵树。3:根据第一步和第二步递归的处理左右两棵树。第一步:根据前序遍历A B D E G C F H确定头结点是A,根据中序..转载 2020-10-21 09:08:57 · 2331 阅读 · 1 评论 -
二叉树的动态创建(#号法)和遍历
二叉树每个结点最多有2个孩子,所以为它设计一个数据域和2个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。先直接上代码,这里只是实现了二叉树的生成和遍历,生成采用前序遍历,遍历采用三种方法#include<iostream>using namespace std;//二叉树的二叉链表结点结构定义typedef struct BitNode{ int data;//数据域 struct BitNode*lchild, *rchild;//左右孩子指针}BitNod原创 2020-10-20 20:33:29 · 1333 阅读 · 1 评论 -
队列的顺序存储结构
1.算法原理分析如下图2.队列的顺序存储代码要依赖于之前的文章中的seqlist_02.h和seqlist_02.cpp线性表的顺序存储(业务结点和算法逻辑分离)seqqueue.h如下:#ifndef _MY_SEQQUEUE_H_#define _MY_SEQQUEUE_H_typedef void SeqQueue;//创建队列 SeqQueue* SeqQueue_Create(int capacity);//销毁 队列 void SeqQueue_De.原创 2020-10-16 13:44:43 · 417 阅读 · 0 评论 -
栈的链式存储结构
栈的链式存储结构直接会用到线性表的链式存储结构的代码:LinkListApi.h和LinkListApi.cpp具体参考我之前的文章线性表的链式存储(业务结点和链表算法分离模式)这里直接上代码:linkstack.h如下:#ifndef _MY_LINKSTACK_H_#define _MY_LINKSTACK_H_typedef void LinkStack;typedef void LinkStackNode;LinkStack* LinkStack_Create();.原创 2020-10-09 14:55:57 · 194 阅读 · 0 评论 -
栈的顺序存储结构
1.算法原理分析如下图:2.栈的顺序存储代码要依赖于上一篇文章中的seqlist_02.h和seqlist_02.cpp线性表的顺序存储(业务结点和算法逻辑分离)seqstack.h代码如下:// seqstack.h#ifndef _MY_SEQSTACK_H_#define _MY_SEQSTACK_H_typedef void SeqStack;typedef void SeqStackNode;//直接在该函数里调用顺序表中的函数就可以了SeqStack* ..原创 2020-10-08 13:06:16 · 271 阅读 · 0 评论 -
线性表的顺序存储(传统写法---数据结点和顺序存储算法不分离)
1.线性表的顺序存储,通常通过数组模拟,其主要核心是插入和删除的算法1.1 插入算法1.2 删除算法2.代码实现seqlist_01.h代码如下://定义线性表的基本数据结构#define MAXSIZE 20 /*存储空间初始分配量*/typedef int ElemType;//传值还是传指针就是看要写还是要读,如果读的话直接传值就可以了//如果想修改线性表里的内容要传地址typedef struct tag_SqList{ ElemType data[M原创 2020-10-07 20:34:55 · 147 阅读 · 0 评论 -
单向循环链表的实现(业务结点和链表逻辑分离)
文章参考传智扫地扫讲义1.单向循环链表的内存结构示意图对于单向循环链表,的一个关键是循环,就是原来的链表的最后一个结点的next域指向null,现在变为指向第零个结点(默认描述从下标零开始,符合c语言的下标描述),如下图:(我们下面讲解的也是按照这个图进行)2.单向循环链表的插入单向循环链表的插入,分为两种情况,一种是在中间和尾部插入一种是在头部插入第一个元素,因为单向循环链表是有环的,环的形成就在插入第一个元素的时候,同时在已经有第一个元素的情况下,进行头插法的时候,因为第原创 2020-10-07 11:03:47 · 322 阅读 · 0 评论 -
线性表的链式存储(业务结点和链表算法分离模式)
原有的链表结构体里添加了数据域,导致业务结点和算法逻辑耦合,虽然可以用typedef定义不同的数据类型,但是还是不太方便。参考了传智扫地僧相关源码LinkListApi.h如下://直接给返回一个句柄,内部有一个外部不感知的结构体//原始的链表是业务结点和链表的算法互相耦合,不便于使用//要想写出可以使用的通用的链表,那就需要将业务结点和算法逻辑相互分离。//然后还有一个巧妙的地方即使结构体的首地址和第一个元素的首地址是重合的//初始化时返回给业务一个指针,不能让业务感知,返回void*原创 2020-10-05 19:42:06 · 156 阅读 · 0 评论 -
线性表的链式存储(传统模式)
为了便于自己理解,画了单链表的结构示意图,如下:插入链表示意图如下:下面是对应的代码实现#include<iostream>using namespace std;/*链表的结构写出来*/typedef struct Node{ int data;//数据域 struct Node *next;//指针域};//链表的抽象方法有哪些//创建一个链表 现在默认创建带头节点的链表//通过画图看下链表的结构,以及头指针和头节点的概念//1.初始.原创 2020-10-05 10:41:22 · 222 阅读 · 0 评论 -
二级指针作为输入的三种内存模型
1.指针数组模型 char *p[4];#include <stdlib.h>#include <string.h>#include <stdio.h>//二维指针的第一种内存模型//添加函数void printarray(char **p){ for (int m = 0; m < 4; m++) { printf("%s\n", p[m]); }}void sortarray(char **p){ int i, j =原创 2020-10-04 17:26:17 · 276 阅读 · 0 评论 -
数据结构中的逻辑结构(附上c++中的常见数据结构的逻辑结构)
最近在学习数据结构,有必要对自己这两天的学习做一个总结,今天就来总结下,数据结构的逻辑结构按照分类标准的不同,我们把数据结构分为逻辑机构和存储结构,今天主要讲解逻辑结构逻辑结构:是指数据对象中的数据元素之间的相互关系,主要分为以下四种结构1.集合结构集合结构中的数据元素处理同属于一个集合里,它们之间没有其他关系。各个数据元素是“平等”的,它们的共同属性是“同属于一个集合”。数...原创 2019-09-27 14:54:34 · 11085 阅读 · 2 评论 -
二叉树的建立及其递归遍历(C语言实现)
本文转载自二叉树的建立及其递归遍历(C语言实现)最近在学习数据结构中树的概念,迟迟不得入门,应该是自己的懒惰和没有勤加练习导致的,以后应该多加练习以下是我对二叉树的一些总结内容二叉树的特点有:- 每一个节点最多有两棵子树,所以二叉树中不存在度大于2的节点,注意,是最多有两棵,没有也是可以的左子树和右子树是有顺序的,次序不能颠倒,这点可以在哈夫曼编码中体现, 顺序不同编码方式不同...转载 2019-09-25 10:59:06 · 7015 阅读 · 12 评论 -
椭圆曲线加密算法介绍2--加密算法原理介绍
本问主要转载ECC椭圆曲线加解密原理详解(配图),以及ECC加密算法入门介绍其中绿色字体是小编在学习中添加的注释前言 同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开密钥算法。目前,国内详细介绍ECC的公开文献并不多(反正我没有找到)。有一些简...转载 2019-09-03 17:19:37 · 1614 阅读 · 3 评论 -
椭圆曲线加密算法介绍1-- https 对称加密与非对称加密
最近在工作中涉及到椭圆曲线加密问题,就开始详细的了解了下加密的概念,这篇博客的目的就是为了记录我学习的过程以及复习的依据,同时如果能给正在学习这方面的同道中人,提供一点点的启示作用,那就更好了。(本文主要参考了网络---Https和Http区别和对称加密和非对称加密)其中大部分图片都是从该文中截图后修改1.密钥与加密算法之间的关系这个东西是总被一些人解读的有问题,导致让人区分不开密钥和...原创 2019-09-03 14:37:42 · 2594 阅读 · 1 评论 -
四元数神态解算中的地磁计融合解读
四元数姿态解算中的地磁计融合解读 笔者最近在做四轴,涉及到地磁计的融合算法,网上大多数是x-IMU的融合代码,但是这段代码对于地磁计的融合说明没有做过多的解释,网上没有相关讨论,仅在阿莫论坛看到一篇相关的代码解释,里面有关于地磁计融合部分的解说,个人觉得说的不是很清楚,虽然是正确的,我这里再补充啰嗦一下。 首先给出x-IMU关于陀螺仪、加速度计、地磁计的融合代码转载 2015-09-09 12:17:00 · 2111 阅读 · 1 评论