- 博客(37)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【数据结构】快速排序
快速排序:快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。快速排序可以让时间复杂度达到O(log(N)* N);快速排序自从Hoare提出后还衍生出了...
2020-03-29 14:32:12
209
1
原创 【Linux】Posix信号量
1. 信号量的概念和作用1.1信号量的概念和原理:信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段。它是一个特殊的变量,只允许对它进行等待wait()和发送信号post(),并且这两种操作都是原子操作。该变量的值表示允许同时访问共享资源的最大进程数。wait() 等待一个信号量该操作会检查信号量的值,如果其值小于或等于0,那就阻塞,直到该值变成大于0,然后等待进程将信号量的值减1,进程获得共享资源的访问权限。这整个操作必须是一个原子操作。post() 挂出一个信号量。该操作将信号量的
2021-05-04 23:01:43
224
原创 【Linux】条件变量
什么是条件变量:与互斥锁不同,条件变量是用来等待而不是用来上锁的,一个条件变量对应一个等待队列。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)唤醒线程。条件变量的使用:1.条件变量初始化:(1)pthread_cond_t cond=PTHREAD_COND_INITIALIZER;(2)int pthread_cond_init(pthread_cond_t *cond, pthrea
2021-04-12 17:01:26
241
原创 http协议
HTTP协议1. 什么是HTTP协议超文本传输协议:针对网络上的客户端与服务器端在超文本数据传输时候,遵守的一种规范。是一种基于TCP/IP的应用层协议,也是目前为止最为流行的应用层协议之一,可以说HTT P协议是万维网的基石。工作方式:客户端请求服务端应答的模式2.关于URL2.1 URL的概念URL指的是统一资源定位符(Uniform Resource Locator)。是指文件在网络上的地址。是在Internet的WWW服务器上用于指定信息位置的表示方法,它指定了如HTTP或FTP等In
2021-04-12 14:27:20
246
原创 【C++】多态
对多态的理解:多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优 先买票。需要注意的是:多态是在不同继承关系的类对象,对象之间必须要有继承关系,去调用同一函数,产生了不同的行为。比如Student继承了Person。 Person对象买票全价,Student对象买票半价。class Person{ public: virtual void Bu
2021-03-15 12:30:21
138
原创 【Linux】线程安全,mutex锁的使用
什么是线程安全?当多个线程访问某个方法时,不管这些线程如何交替的执行,如果每次运行的结果和单线程运行的结果都是一样的,那么就可以说线程安全。线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步和互斥,否则的话就可能影响线程安全。互斥锁的使用...
2021-03-13 09:45:17
543
原创 【数据结构】红黑树
目录红黑树的概念:红黑树的插入操作:情况一:情况二:情况三:红黑树与AVL树的比较:红黑树的概念:红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色属性,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩 倍,因而是接近平衡的。红黑树需要满足以下特性:1.每个结点不是红色就是黑色2. 根节点是黑色的3. 如果一个节点是红色的,则它的两个孩子结点是黑色的4...
2021-02-27 21:47:56
251
原创 【C++】vector 的使用,模拟实现,以及迭代器失效问题。
vector的使用:vector空间是如何增长的?当添加元素时,如果vector空间大小不足,则会动态开辟新的空间,新空间的大小要根据STL版本而定,例如vs下capacity是按1.5倍增长的,g++是按2倍增长的。vs是PJ版本STL,g++是SGI版本STL。开辟完新空间将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间。无论是1.5倍还是2倍都是根据根据需求而定的, 1.5倍增容的次数更多,效率较低,因为每次增容都是要付出时间代价的。而2倍速的增容可能效率更高一些但是比起1.5倍的增
2020-12-08 20:45:15
163
原创 【C语言】结构体内存对齐
(一)结构体的概念:什么是结构体?结构体是由一批数据组合而成的一种新的数据类型。组成结构型数据的每个数据称为结构型数据的“成员”。为什么需要结构体?C语言中有许多内置类型比如:整形(int,long,char等),浮点型(flaot,double),还有数组,指针,字符串等。但是在实际问题中只有这些数据类型是不够的,比如一个学生的信息就需要学号(字符串),姓名(字符串),年龄(整形)等等,如果零散的定义多个不同类型的变量,来描述一个学生的话使用起来就会很乱。所以我们就需要一个新的数据类型。——结构体
2020-11-26 15:51:47
164
原创 【C语言】指针和数组的联系与区别
指针:一,指针的概念 :指针首先是一种数据类型,使用它定义的变量称为指针变量,指针变量是专门用来存放地址的。以int* a为例:a就是一个指针变量,a变量存放一个int类型数据的地址。a变量的大小根据编译器使用32位方式编译还是64位方式编译分别对应4个字节和8个字节。二,关于指针的运算:(1)指针 + / - 整数:以int* a为例 a + 10,不是增加10个字节,而是增加10个int类型变量的大小也就是 4 * 10 = 40个字节。a - 10与加操作类似:减去40个字节。 同理 a++
2020-11-19 20:56:16
410
原创 【Linux】线程概念,线程控制。
目录线程概念:线程控制:线程概念:操作系统分配资源以进程为基本单位。而线程是进程的组成部分,它代表了一条顺序的执行流,每个进程至少有一个执行流。线程是cpu调度的最小单位,同类的多个线程共享同一块内存空间和一组系统资源。假如有一个程序它由fun1()fun2()fun3()三个函数组成。三个函数该程序运行起来分配相应的资源,pcb块,虚拟地址空间,页表等如下图所示。总结:在linux中没有线程的概念,线程的创建是通过库函数实现的,库函数通过是模拟进程pcb实现的(如上图所示.
2020-11-11 20:53:05
318
原创 【Linux】进程间通信(1):共享内存shmget() shmat() shmdt() shmctl()
文章目录什么是共享内存:共享内存的使用:什么是共享内存:进程的是独立的,每个进程有自己的地址空间,通过页表映射到物理内存上。共享内存就是在物理内存上开辟一段内存空间,然后分别与多个不相干的进程,通过页表关联起来。关联的过程就是每个进程都开辟一段自己的虚拟地址空间 并通过页表 与共享内存一一对应。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。共享内存的使用:(1) 创建或打开共享内存int shmget (key_t key, size_t size,
2020-11-04 10:13:58
346
原创 【Linux】基本IO操作 文件描述符 文件系统
文章目录标准库IO操作:系统调用接口:标准库IO操作:FILE * fopen(const char* path, const char* mode);参数:path字符串包含欲打开的文件路径及文件名。mode字符串则代表着流形态,流形式有如下几种:r :打开只读文件,该文件必须存在。r+ :打开可读写的文件,该文件必须存在。w :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ :打开可读写文件,若文件存在则文件长度清为零,即该文件内容
2020-10-19 17:40:19
392
原创 进程控制(创建,退出) 程序替换
创建进程:pid_t fork(void)创建一个新的进程(子进程),父进程调用fork()后,系统会为子进程分配资源:创建了一个新的PCB,然后将父进程PCB的大部分数据复制到新的PCB。PCB里边都有什么内容呢分为这么几类:(1)进程的标识信息(执行的哪个可执行文件,id是多少,父进程id等(2)进程的状态信息(CPU状态寄存器里的信息,地址空间,页表起始地址,进程状态,是否允许调度等)(3)进程占用的资源(分配给它的内存(内存地址空间mm),内核堆栈信息等)(4)保护现场的信息(寄存器信息
2020-10-17 17:40:43
143
原创 进程概念,进程状态,虚拟地址空间,环境变量
关于进程的理解:进程的概念:进程是运行着的程序,是系统运行程序的基本单位,进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。程序 一系列有序的指令集合,存储在硬盘中是静态的代码。什么是PCB:想要运行程序,既:程序的数据和指令想要被cpu处理,第一步就是将代码和数据加载到内存中,并通过建立PCB控制块(task_struct结构体),建立进程。task_struct结构体是记录了进程的相关信息的数据结构,它包括:描述信息:内存指针,程序计数器,上下文数据,进程标识符PID,IO信
2020-10-13 18:01:44
215
原创 【C++】string 的使用和模拟实现
string类对象的常见构造:如何初始化类的对象是由类本身决定的。一个类可以定义很多种构造函数。当然每种构造函数在在初始值得数量或者类型都有差别(函数重载)。string() 构造空的string类对象,即空字符串string(const char* s) 用C-string来构造string类对象string(size_t n, char c) string类对象中包含n个字符cstring(const string&s) 拷贝构造函 string s0;//默认初始化,s0是一
2020-10-05 20:40:06
198
原创 C++ 类和对象上(this指针,六个默认成员函数)
文章目录对象大小如何计算:this指针:构造函数析构函数:拷贝构造:运算符重载对象大小如何计算:对象中只存储成员变量,不存储成员函数。因为一个类可以实例化出多个对象,每个对象的成员变量可以存储不同的值,但是调用的函数却是一个。如果每个对象都放成员函数,而这些成员函数都一样,那么空间就浪费了,所以把成员函数放在一个公共区域。所以对象的大小是成员变量之和,并且考虑内存对齐。没有成员变量的类的大小是1个字节。这一个字节不是为了存储数据,是为了占位表示对象存在。this指针:我们先来定义一个日期类Date
2020-10-02 11:37:06
181
原创 C++基础(命名空间,为什么C++可以函数重载,应用,内存结构)
文章目录命名空间:函数重载:引用:内联函数:命名空间:在C/C++中,变量、函数和类都是大量存在的,如果这些变量、函数和类的名称将都存在于全局作 用域中,可能会导致很多冲突。为了解决命名冲突 ,C++中引入了命名空间,所谓命名空间就是一个可以由用户自己定义的作用域,在不同的作用域中可以定义相同名字的变量,互不干扰,系统能够区分它们。缺省参数缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该 默认值,否则使用指定的实参。全缺省参数:举例void Test
2020-10-01 22:28:34
228
原创 【剑指offer】面试题12. 矩阵中的路径
题目描述:解题思路:(1)遍历board矩阵找到 board[row][col] == word[0],从(row,col)开始进入搜索,(既进入一个函数,功能是寻找是否存在从(row,col)开始于word相同的路径,传入参数 bord ,bordsize,boardcolsize,row,col,以及另一个矩阵arr,(arr下边会介绍))。(2)此时与(row,col)相邻可能有四个...
2020-04-12 11:56:40
113
原创 【剑指offer】面试题09. 用两个栈实现队列
题目描述:解题思路:栈的特点是先入先后出,要实现先入先出就得用两个栈来实现,一个栈用来入数据,一个栈用来出数据。结构如下:typedef struct CQueue{ StackNode* IN_data;//用于入数据的栈 StackNode* out_data;//用于出数据的栈} CQueue;队列是由两个栈组成的,入队列时直接将数据压入(In_data)栈...
2020-04-09 12:45:38
116
原创 【数据结构】希尔排序
直接插入排序:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移直接插入排序实现:void sort(int* a , int n){ for(int end ...
2020-03-19 21:57:03
106
原创 【数据结构】二叉堆的概念 及其调整
堆的定义:堆通常是一个可以被看做一棵完全二叉树的数组对象。二叉堆满足如下性质: 堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆的存储:#define Elementtype inttypedef struct MaxHeap{ Elementtype *...
2020-02-26 16:51:56
195
原创 Leetcode189.旋转数组
题目要求:(1)暴力求解void rotate(int* nums, int numsSize, int k){ k = k % numsSize; for(int i = 0;i < k;i++){//旋转k次 int tem = nums[numsSize - 1]; for(int i = numsSize - 1;i > 0...
2020-02-22 14:34:33
116
原创 【数据结构】平衡二叉树的概念及其实现
什么是平衡二叉树?对于二叉搜索树,节点的不同插入次序,将导致不同的深度和查找效率。这样就出现了一个问题。如何设计二叉树的结构可以让查找效率更高呢?如果一棵树它的左右子树都一样。既左右子树的高度和节点的数量都一样这样的树,查找效率就最高可是这个都一样的要求太高了。我们把标准再降低一点就有了平衡二叉树。平衡因子:BF(T)=HL- HR;其中HL,HR分别代表数T的左右子树的高度。平衡二叉树(A...
2020-02-20 13:23:31
539
原创 【数据结构】二叉树的概念及实现
二叉树的定义:二叉树T一个有穷的节点集合,这个集合可以为空,若不为空,则它由根节点和一个称为左子树TL 和 右子树TR的两个完全不相交的二叉树组成。二叉树的顺序存储分析:完全二叉树:若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有节点都连续集中在最左边,这就是完全二叉树满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。满二叉...
2020-02-16 16:22:44
163
原创 【数据结构】二叉搜索树的概念和常见操作
什么是二叉搜索树?我们把一般的查找操作分为两类,静态查找和动态查找。在静态查找中有一种很快的查找方法(二分查找时间复杂度为O( log(n) )。它之所以可以将时间复杂度降的这么低,是因为在查找之前对数据进行了顺序的排序。在查找时查找的顺序是固定的,是一个判定树一样的结构。把一个线性的查找过程转换成了一个类似树的查找过程。查找效率就是树的高度。从此我们得到启示:在查找时为什么不能把数据直接用二叉...
2020-02-16 14:35:56
184
原创 【数据结构】队列的定义及实现(c语言)
队列的定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的顺序存储实现:队列的顺序存储通常由一个一维数组,一个记录队头的变量front,一个记录队尾的变量rear和一个记录队列大小的变量 MaxSize组成。结构如下:#...
2020-02-03 19:29:26
980
原创 [C语言]Leetcode 23.合并K个排序链表
(1)题目描述:(2)解题:方法一:逐一比较思路:遍历K个链表的第一个节点,找出最小的val值。将该节点插入到新的链表中,循环操作,直到k个链表都为空为止。 假设一共有N个节点,每找到一个节点都要遍历K次。所以时间复杂度为O(K*N)。代码:struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){ ...
2020-01-20 22:49:32
240
原创 【数据结构】无头和有头单链表基本操作的实现与比较(C语言)
typedef int DataType;typedef struct SListNode{//结点 struct SListNode* next; DataType data;}SListNode,*PListNode;int main(){ PListNode Phead;}区别:(1)尾插操作:因为如果链表为空,无头链表需要对头指针Phead进行赋值所以传参时,需要...
2019-12-27 11:04:02
440
原创 LeetCode160相交链表
编写一个程序,找到两个单链表相交的起始节点。在节点 c1 开始相交。注意:如果两个链表没有交点,返回 null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循环。程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。 struct ListNode { int val; struct ListNode *next; }; ...
2019-12-15 12:15:09
100
原创 &数组名和数组名 二维数组的传参
数组名和&数组名首先我们看下面代码:#include <stdio.h> int main() { int arr[10] = {0}; printf("%p\n", arr); printf("%p\n", &arr); printf("arr+1 = %p\n", arr+1);printf("&arr+1= %p\n...
2019-11-12 11:53:04
244
原创 【C语言】杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);
杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);1 2 34 5 67 8 9**解题思路:**因为要求时间复杂度是O(N),所以不能用普通的遍历二维数组的方法查找一个数,因为它的时间复杂度为O(N^2);所以应该根据杨氏矩阵的规律求解,我们首先从数组的右上角开始查找 ,对最右上角的值进行判断(num变...
2019-11-07 12:44:40
197
原创 数据的截断和扩展
数据的截断和扩展数据的扩展: 在数据扩展的时候,需要将数据扩展成字符数更长的数据的时候,一般低位都保持不变,继续保留原有的数据,多出的高字节数据,需要根据当前被扩展数据进行不同的填充。数据的截断:数据截断就是根据要求,将数据的高字节数据截去,只保留低字节部分。为了深刻的理解我们在下边例题里边领会吧。#include <stdio.h> int main() { cha...
2019-10-29 15:02:27
2427
原创 【c语言】交换数组A[]B[]的内容(数组长度相同);计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值;编写程序数一下 1到 100 的所有整数中出现多少次数字9。
交换数组A[]B[]的内容(数组长度相同)#include<stdio.h>#include<stdlib.h>//交换数组A[]B[]的内容(数组长度相同)int main(){ int A[10]={0,1,2,3,4,5,6,7,8,9}; int B[10]={10,11,12,13,14,15,16,17,18,19}; int length = ...
2019-10-14 11:30:52
241
原创 【C语言】给定两个整型变量的值,将两个值的内容交换。求10个整数的最大值。将三个数从大到小输出。求两个数最大公约数
(1)给定两个整型变量的值,将两个值的内容交换下边是不给创建临时变量的第一种做法#include<stdio.h>#include<stdlib.h>int main(){ //给定两个整型变量的值,将两个值的内容交换 int a=6; int b=7;//创建两个整型变量 a=a+b; b=a-b;//将原a的值付给b; a=a-b;//将原b的值付...
2019-09-27 21:26:21
279
原创 打印100-200的素数,乘法口诀,1000-2000的闰年
##打印100-200内的所有素数#include<stdio.h>#include<stdlib.h>int main(){//输出100—200之间的所有素数;//一个大于1的正整数,如果除了1和它本身外,不能被其他整数整除,就叫素数; printf("请输出100—200以内的所有素数\n"); for(int j=100;j<201;j++)...
2019-09-25 13:42:24
179
原创 我的flag
今天是2019年9月23日,我想了很久,可是我还是没有长远的打算。我希望可以多学点知识。只是想我现在应该抓紧时间好好学习知识,变的更加自律。学习方面还是有一些打算的,我做了以后30天的学习计划;int main(){int days=0; //天数int Timetable=0; //时间表for(day=0;day<30; day++)for(Timetable...
2019-09-23 16:53:23
230
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人