自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 二叉树的基本知识

二叉树的定义在引入二叉树之前先对树的概念进行介绍,简单来说树表示一个集合以及集合中元素之间的相互关系。树中的元素称为节点,节点之间一般为父子关系,或者兄弟关系,树都有一个根节点,上下层之间的关系是父子关系,同一层节点之间的关系是兄弟关系,树中一个节点可以有多个孩子。而二叉树就是树的一个特殊的形式,即一个节点中最多包含两个节点。如图所示,节点A就是根节点,节点B,C是兄弟节点,同时两者又分别和下一层的D、E、F构成父子节点。二叉树的分类二叉树大致分为以下几类:满二叉树:即除了叶子节点外,所有的节点都

2022-04-20 12:52:12 459 1

原创 栈和队列的基本知识

基础知识首先需要注意栈和队列本质的不同:栈是后进先出的类型而队列是先进先出的类型,他们都是STL(C++标准库)中常用的数据结构。STL的引入是为了提供更好的复用性。其中STL也是有不同版本的,最初的版本是HP STL,是开源的,后续的许多版本都是在这个基础上演变的,而目前我们提到的STL一般是指SGI STL,是从上述的版本中演变过来的。同时需要注意的是,栈和队列在STL中一般不划分为容器,而是划分为容器适配器,数据结构示意图如下所示。栈(stack)对外提供push和pop两个接口,对应入栈和出栈

2022-04-15 16:48:28 990

原创 哈希表的基本知识

基础知识哈希表(Hash Table)又被称为散列表,是通过键值直接访问数据的一种数据结构,数组就是一种常见的哈希表,因为可以通过下标来访问数据。...

2022-04-13 16:54:59 681

原创 链表的基本知识

基本理论和数组不同的是,链表是通过指针串联在一起的一种数据结构,所以链表一般包含两个部分:指针域和数据域。指针域指向链表下一个节点,数据与存放数据。一般来说,如果链表有头节点,头节点不存放数据。常用的链表类型有单链表、双链表、循环链表。单链表的示意图如图所示,双链表就是比单链表多一条往回的线,循环链表就是尾节点指向头节点:由于链表使用指针进行索引,所以在内存中的不是连续存放的,分配机制取决于你的操作系统内存管理机制。常见链表的操作是增加、删除、查找、打印等,由于是链式存储,所以增加和删除不用大规模移动

2022-04-10 10:55:05 416

原创 数组的基本理论

基础理论数组是C++中基础的数据结构,在许多场景下都有使用,例如vector的底层实现就是数组。数组的定义是存放在连续空间内的相同类型元素的集合,因此可以方便的通过下标的方式进行索引。一般情况下,数组的下标是从0开始的。如下图所示:因为数组元素的连续存储,所以插入和删除的需要移动大量的元素。数组中的元素不能被删除,只能被覆盖,就是将删除元素后面的元素往前移动,覆盖原来的数据,达到删除的目的,插入也类似,需要移动大量的元素,所以时间复杂度都为O(n)。另外需要注意的是,在C++中二维数组的存放形式也是连

2022-04-09 10:27:16 563

原创 编程语言的内存空间

首先需要说明的是c/c++堆上申请的空间需要自己释放,java和python不需要用户自己释放,不用担心内存泄露的问题,其中python中,万物皆对象,所以基本数据类型中占用的空间将大于数据本身所占用的空间,例如int型4个字节,python申请一个对象进行存放数据,所以占的空间比4字节的大。总的来说,以c++为例,程序运行时将所需的空间分为固定部分和可变部分:固定部分是代码区和数据区,可变部分是栈区和堆区,其中栈区的空间程序自己释放,堆区需要自己释放,在程序结束时可能会被系统回收。在数据类型方面,32

2022-04-07 19:22:30 985

原创 时间复杂度

时间复杂度简单来说,时间复杂度描述的是算法运行的时间,通常使用O()来表示,例如O(n),《算法导论》给出的O()定义是指算法在最坏情况下运行时间的上界,例如在插入排序中,有序的情况下复杂度是O(n),最坏情况下是O(n^2)。再比如快速排序时间复杂度是O(nlogn),但是在数据有序的情况下时间复杂度是O(n^2),这和定义不符,因为这里我们关注的是一般意义上的时间复杂度,不是严格意义上的时间复杂度的上界,因为一般情况下不会在有序的情况下使用快排。其次是时间复杂度上的常数项为什么可以省略的问题,因为

2022-04-06 16:13:28 475

原创 斐波那契数列

斐波那契数列数列,又叫做兔子数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入。描述的是这样的一个数列,0,1,1,2,3,5,8…有两种写法,一种是递归法,一种是动态规划法。一,递归法递归需要用到栈,一般需要一个递推的公式,还需要一个递归的终止条件,这里的终止条件就是当n等于0,或者当n等于1的时候。int fib(int n){ if (n == 0) { return 0; } else if (n == 1) { return 1

2021-10-26 10:43:19 136

原创 C++单例模式

什么是单例模式单例模式是一种常见的设计模式,核心结构是只包含一个称为单例的特殊类,它的目的是保证一个类只有一个实例,并提供一个全局的访问点,该实例被所有程序模块共享,避免了类频繁创建和销毁。它的用处也十分广泛,比如日志管理,操作系统的日志管理器。怎么实现为了保证这个类只实例化一次,所以设计思路需要把类的构造函数设置成private,类的内部在申请一个private该类的指针,然后对外需要提供一个public的接口,用来访问构造函数。需要注意的是需要把该类的指针和对外的接口设置成static,这样做的

2021-09-22 17:58:26 61

原创 力扣215:数组中第K大最大元素

一,题目描述题目链接给定一个数组,求这个数组中第K大的数字。示例如下:输入: [3,2,1,5,6,4] 和 k = 2输出: 5二, 思路可以使用快排的思想解决这个问题,因为每次快排之后都会有一个数字归位。而且快排采用分治的策略,查找速度很快。所以可以利用快排之后数字的下标和第几大K进行对比,如果等于就是找到了,如果小于,说明在快排的右半边,大于在左半边,从而找到正确的数字。这里需要转变一下的是需要将第几大转化成第几小,因为数组是从小到大排序的,所以需要转换一下。三,实现class

2021-09-13 10:52:14 84

原创 二叉树层序遍历

一,概念层序遍历就是一层一层从左到右遍历二叉树,所以也被称为广度优先遍历,跟之前的前中后序遍历有所不同。二,思路由于需要逐层去读,需要一个队列保存每一个节点,还需要一个数组去保存节点的值。具体思路:如果根节点不空,就入队,然后出队,把值保存在数组中。然后把其左右孩子入队,重复上述操作,直到遍历完成。三,实现代码实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tr

2021-09-13 09:30:13 74

原创 快排面面观(3)-单链表的快排

我在快排面面观(1),快排面面观(2)分别写了快速排序的基本概念和快排的优化,有兴趣的同学可以先看前两篇之后再来看这一篇。单链表是链式结构,元素和元素之间通过指针连接,所以链表的排序我们也可以参考数组的快速排序,可以参靠第二篇文章中的单向排序,代码如下,单链表是带头节点的单链表,设置两个变量指向头节点和头节点的下一个节点,头节点不存值。typedef struct LinkNode{ int val; LinkNode* next;}LinkNode, *LinkList;LinkList b

2021-09-03 11:24:40 110

原创 c++中NULL和nullptr的区别

一,C中NULL在C语言中,NULL的类型是((void*)0),相当于一个空指针,会根据不同的指针隐式转换为相应的类型,如char* p = NULL;就将NULL转换成char型。二,c++中的NULL和nullptrC++中的NULL实际上是0,因为在C++中,NULL无法通过隐式转换成其他类型,所以在用NULL代替空指针的时候可能会遇到问题。void func(int){ cout << "func(int)" << endl;}void func(void*

2021-09-02 22:22:08 325

原创 快排面面观(2)-优化快速排序

传统的快速排序是通过两个变量指向数组的首尾然后通过递归来实现的,具体可以看我的这一篇文章快排面面观(1),还会有一些基于快排的变化和优化,比如怎么单向进行快排,还有就是待排序数组是有序的或者是接近有序的,利用传统的快排效率就比较低,所以 就要对待排序数组进行处理。(1)单向快排:具体的算法就是设置一个一前一后的指针,一个变量i指向数组首元素,一个变量j指向它的前一个,保存首元素的值,然后移动i遇到比首元素小的值让j加一之后和i交换,遇到比它大的i继续前移,这样的作用就是j最终指向的就是分隔点,最后交换首

2021-09-02 21:47:52 231

原创 快排面面观(1)-递归和非递归

快排的思想(1)递归的版本快排体现的就是分治的思想,传统的快排思想首先将原数组分成两个部分,再通过递归分别对两个子数组进行快排。定义两个变量left,right指向首尾,递归结束的条件就是left > right。完整的代码如下,代码的重点是Position函数,即找到分隔数组的位置。注意函数中的边界判断。判断完位置pos之后,利用分治和递归的思想,将数组分成两个部分进行递归。#include <iostream>#include <vector>#include &

2021-09-02 20:51:09 195

原创 剑指offer刷题笔记03:62圆圈中最后的数字

题目描述:0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof思路:这道题是我在小米的笔

2021-09-02 14:53:46 75

原创 剑指offer刷题笔记02

这道题是offer03,数组中重复的数字。offer03 数组中重复的数字在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。从题中可以分析,数组中不止一个重复的只要找出一个就可以了。而且长度为n的数组里的数字也是0~n-1,是有对应关系的。本题有两种解法:解法一:哈希法:创建一个map存放数组的值和出现的次数,如果出现的值不为1,说明该数字重复。步骤:(1)

2021-08-09 09:04:16 70

原创 剑指offer刷题笔记01

剑指offer里的题很经典,我的顺序是从简单题开始刷,并写下我的思路和见解,今天写的是offer09和offer10-1。offer09 用两个栈实现队列队列是先进先出类型的结构,栈是后进先出的结构,两个栈实现队列的思路是使用一个栈作为输入栈,一个栈是输出栈,这样一来就把后进先出变成先进先出。具体步骤如下:(1)定义两个栈s1,s2。s1是输入栈,即把数据先存放在s1中;(2)s2是输出栈,需要进行判断:如果s2不为空,就先将其中的数据输出;如果为空就把s1的数据存进去(前提是s1中有数据)。(3

2021-08-07 22:51:57 67

原创 Linux之fork()相关知识

1,基本概念:Linux中的fork()的作用是复制进程,调用fork()之后会产生一个新的进程,称为子进程,被调用的进程称为父进程,两个进程的内容完全一样,语法如下:pid_t pid = fork();//复制进程该函数会返回一个int类型的返回值,如果pid等于0,则该进程是子进程,大于零的是父进程,失败的话返回值时-1。2,写时拷贝(COW)fork()之后父子进程指向相同的物理空间(内存区),如果父子进程只是对内存区的内容进行读取,就不用单独为子进程开辟新的物理空间,这样可以减少开销,

2021-08-05 10:47:39 126

原创 函数调用过程

我们知道程序是运行在虚拟地址空间中,函数的调用过程主要包含以下几部分:函数参数的带入、栈帧的开辟、返回值的带出以及栈帧的销毁。程序是从main函数开始执行的,因此首先main函数会有一个栈帧存放main函数中的参数,当调用到函数时,例如(sum求和)等,需要在main函数的上方进行栈帧开辟。其中函数有以下几部分组成:函数名、参数、返回值,调用函数时需要在虚拟地址空间中开辟一个空间,我们称之为栈帧,调用结束之后需要销毁栈帧。栈顶和栈底分别用esp和edp表示,如图所示。下面分别介绍以下流程。1,参数的带

2021-08-04 10:06:27 1910

原创 编译链接过程

一,主要分为预编译,编译,汇编,链接。其中前三个统称为编译,之后通过链接形成二进制可执行文件。(1)预编译主要是替换,生成行号和文件索引,用于后来编译遇到问题时产生错误提醒;(2)编译生成符号,符号的作用就是用来标记,链接的时候可以通过符号找到对应的值进行匹配,数据和函数名可以产生符号;(3)汇编形成二进制可重定位文件,用于链接时的定位不同的文件;(4)链接通过可重定位文件形成二进制可执行文件,最终形成执行文件。需要注意的是,二进制可重定位文件是针对单个文件的,链接时的二进制可执行文件是针对多个文件

2021-07-20 22:22:00 777

原创 进程间通信

进程间通信通信方式大致有以下几种:管道,信号量,消息队列,共享内存,套接字

2021-05-27 17:25:49 38

原创 二维数组和动态二维数组

两种二维数组的区别C语言中,创建二维数组的方法有两种,一种是直接申请一片连续的空间,然后二维数组的数据依次存放在数组中。动态二维数组顾名思义,可以动态的扩展空间,用户可以自己输入行和列来进行二维数组的创建。下面分别介绍两种数组的区别。二维数组二维数组是行优先存放的,是在内存中连续存放,创建的代码如下所示,是一个三行四列的二维数组。int ar[3][4] = { 12,23,34,45, 56,67,78,89, 90,100,110,120 };动态二维数组动态二维数

2021-05-01 11:10:00 1110

原创 c语言宏定义

宏定义和const的区别宏定义没有类型,不开辟空间,做的只是在预编译时的替换,没有分号,否则会把分号也当成变量替换掉。const就是申请一个常变量,有类型,需要开辟一个空间。宏定义常见的考点如上图所示,如果是MAX(++a,b),这样a会增加两次,例如a如果是10,调用之后a的值变为12。比如这个例子,如果不加括号的话,就会变成a + (a * b) + b,造成与你预想的结果不同的值。一些常见的宏#ifndef,意思是如果没有定义就进行操作,可以防止一些头文件重复引用,常常与#endif搭

2021-04-27 22:06:13 163

原创 初识Linux

初识LinuxLinux是一种操作系统,和windows类似,这里介绍的是Ubuntu,一种常用的Linux系统,Linux中一切皆文件我们称文件夹为目录文件,不同的文件权限不同,例如root文件,需要管理员的权限。我们一般都在home目录下进行操作。Linux系统又叫做多用户系统,例如你在家目录下创建了两个文件夹,你在一个文件夹中的操作,另一个文件夹不可操作,彼此独立,所以称为多用户...

2021-04-24 10:48:00 32

原创 C语言基本知识

C语言数据类型大致分为整型和浮点型,整型包括char, unsigned char, short,unsigned short,int,unsigned int, long int, long long int;浮点型包括float,double等,在内存中的字节数不同。C语言常量大致分为字面常量,宏常量,const修饰的变量,称为常变量,宏常量,枚举常量,字符常量和字符串常量。其中需要注意的是宏常量只是替换作用,而且没有分号,常变量是开辟了空间,枚举类型里面都是整数,不能是小数。...

2021-04-21 21:44:03 79

原创 C语言整数数据类型转换

基本数据类型基本整数数据类型包括int,char等,具体见下表,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。数据是以二进制补码的形式储存到计算机中的,正数的原码,反码,补码相同,负数补码是反码加一,0代表正数,1代表负数,最高位是符号位,例如10的原码是0000 1010 ,10的反码,补码相同,-10的原码是1000 1010,反码1111 0101, 补码1111 0110。当从小范围到大范围的时候需要扩充,反之需要截断,如果整数类型是有符号的,填充就是符号位,无符号的就是填

2021-04-21 11:52:16 992

原创 迭代法遍历二叉树

二叉树遍历(迭代版)二叉树的遍历主要分为四种,前序遍历,中序遍历,后序遍历和层序遍历。之前写过递归版,本次主要将前三种的遍历的迭代版本。迭代版本需要自己写一个栈来实现数据的存取。具体如下:前序迭代法首先自己创建一个栈,栈是后进先出的线性表,所以每次只能将栈顶元素弹出,根据前序遍历的规则,如果根节点不为空,将根节点入栈,弹出,然后遍历根节点的左子树,入栈,弹出,然后遍历根节点的右子树。/** * Definition for a binary tree node. * struct TreeNod

2021-04-18 12:07:27 456

原创 二叉树遍历

二叉树遍历二叉树的遍历主要分为四种,前序遍历,中序遍历,后序遍历和层序遍历。本次主要将前三种的遍历的递归版本,还有迭代版本,后续会写。其中前序遍历方式是根节点,左节点,右节点;中序遍历遍历方式是左节点,根节点,右节点;后序遍历是左节点,右节点,根节点。前序遍历前序遍历是很常见的一种类型,理解起来也很容易,一般建立二叉树就是通过前序遍历来创建的。前序遍历简单来说就是中左右,先访问根节点,然后一直向左遍历,当遍历到最左边的时候,访问并遍历右节点。/** * Definition for a bina

2021-04-18 11:08:33 71

空空如也

空空如也

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

TA关注的人

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