- 博客(73)
- 收藏
- 关注
原创 n后问题
递归思路:把棋盘存储为一个N维数组a[N+1],数组中第i个元素的值代表第i行的皇后位置,这样便可以把问题的空间规模压缩为一维O(N),在判断是否冲突时也很简单,首先每行只有一个皇后,且在数组中只占据一个元素的位置,行冲突就不存在了,其次是列冲突,判断是否有a[i]与当前要放置皇后的列k相等即可。至于斜线冲突,通过观察可以发现所有在斜线上冲突的皇后的位置都有规律即它们所在的行列互减的绝对值相等。...
2019-09-20 14:37:15
359
原创 Go_Hello World
用Go语言编写第一个程序Hello World代码如下:packagemainimport"fmt"funcmain(){fmt.Printf("Helloworld\n")}package:声明,表示该Go代码属于包mainfmt:该程序所依赖的包func:函数的标识关键字Printf:打印函数Go源文件以package声明开头,表示该Go代码...
2019-09-05 12:30:00
229
原创 Go_安装与配置
Go:https://studygolang.com/dl Go环境Git:https://git-scm.com/download/ Go插件VS CODE:https://code.visualstudio.com/ Go编...
2019-09-05 12:13:22
431
原创 排序_堆排
堆:Heap是计算机科学中一类特殊的数据结构的统称,通常是一个可以被看做一棵完全二叉树的数组对象。堆是非线性数据结构,相当于一给2一维数组,有两个直接后继。堆的性质:堆中某个节点的值总是不大于或不小于其父节点的值,且总是一棵完全二叉树。堆的分类:大根堆、小根堆大根堆:将根节点最大的堆叫做最大堆或大根堆,及根节点的元素值最大,且所有父节点的值大于其左右子节点的值小根堆:将根节点最小的堆叫做最小堆或...
2019-08-30 14:22:34
198
原创 Linux_libco协程库剖析
非对称协程(asymmetric coroutines):是跟一个特定的调用者绑定的,协程让出 CPU 时,只能让回给原调用者。那到底是什么东西“不对称”呢?其实,非对称在于程序控制流转移到被调协程时使用的是 call/resume 操作,而当被调协程让出 CPU时使用的却是 return/yield 操作。此外,协程间的地位也不对等,caller 与 callee 关系是确定的,不可更改的,非...
2019-08-22 13:42:15
466
原创 Linux_协程、libco
协程:协程,又被称为用户级线程,是在应用层被调度,可以减少因为调用系统调用而阻塞的线程切换的时间基本原理:协程实质上可以看成是子程序、函数。一个线程上面可以运行多个协程,但是同一时间只能运行一个协程,协程在线程上的切换,是由于遇到阻塞的操作,或者主动让出线程使用权。比如,有10个协程,当前线程正在运行协程1,然后协程1执行一个recv的阻塞操作,协程的调度器能够检测到这个操作,将协程1切换出...
2019-08-20 19:12:11
839
原创 求一个二叉树中两个结点的最大距离
求一个二叉树中两个结点的最大距离分为两个情况:1: 最大距离为从左子树的最深节点,通过根节点,再到右子树的最深节点2: 或路径不穿过根节点,而是左子树或右子树的最大距离路径template<class T>struct BinaryTreeNode{BinaryTreeNode(const T& value): data(value), leftc...
2019-08-20 13:15:56
396
原创 C++_智能指针、强转指针
智能指针:C++ 98 auto_ptrC++11 unique_ptr shared_ptr weak_ptrauto_ptr:所有权唯一,新的智能指针取消旧智能指针所有权 ,赋值或者拷贝导致智能指针提前失效 (一个较为早期的版本(日常是不用的)解决拷贝构造(多次释放)的方法是管理权转移(以前的对象不再管理,把旧对象的管理空间的权限交给旧对象拷贝出的...
2019-08-19 16:05:39
1593
原创 C++_封装 、继承 、多态
C++的三大特征:封装 、继承 、多态。封装突破了C语言函数的概念,可以隐藏实现细节,使得代码模块化,继承可以扩展已存在的模块,它们目的都是为了:代码重用。而多态是为了实现另一个目的:接口重用。封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成...
2019-08-19 15:48:15
499
原创 C++_内存池
默认内存管理的不足:malloc/free 和 new/delete 在堆上申请和释放内存都有一定的额外开销。开销来自维护 内存空闲块表。malloc和new 申请堆内存时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法找到合适大小的空闲内存块。如果该空闲内存块过大,还需要切割成已分配的部分和较小的空闲块。然后系统更新内存空闲块表,完成一次内存分配。类似地,在free和delete释放内...
2019-08-18 17:24:39
277
原创 C++_浅拷贝、深拷贝、写时拷贝
浅拷贝:编译器只是直接将指针的值拷贝过来,结果多个对象共用了一块内存,当一个对象调用了析构函数将这块内存释放掉之后,另一些对象不知道这块空间已经还给了系统,再次调用析构函数进行释放时发现已经释放了,就会造成程序崩溃。在类的成员中有指针类型的成员变量的时候,必须对其写出显式的拷贝构造函数和赋值运算符重载函数,否则,默认的拷贝构造函数和赋值运算符重载函数只会对该指针进行浅拷贝(即直接将指针的值拷贝过...
2019-08-18 16:34:17
271
原创 C++_运算符重载
运算符重载:使自定义类型满足和内置类型相同的运算功能C++语言支持函数重载,重载的底层实现是,C++编译器编译函数符号的时候,是根据函数名和形参的个数,类型来共同决定的,因此如果一组函数只是函数名相同,而参数列表不同的话,那么它们生成的符号也是不同的,就不会产生冲突了,编译过程中,函数生成的符号不同。在编译器编译时,根据调用点用户传入的实参,来选择一个类型最为匹配的函数重载版本进行调用,这一...
2019-08-16 19:11:54
235
原创 const、static
const 有如下特点以及应用场景:在 C++中 const 是用来定义常量的,不能作为左值被修改,而且必须初始化。const 常量的初始值如果是一个明确的值,那么常量在编译期会被常量的初始值替换。在 C++中修饰的量也可以是常变量(和 C 语言相同),此时它只是不能作为左值,其他性质和普通变量一样,不能定义数组大小,没有编译时期值替换规则等,const 可以修饰成员方法,成为常成员方法,在...
2019-08-16 18:37:51
282
原创 数据库基础1
一、存储引擎二、索引三、事务一、存储引擎:一种文件的存储机制MySQL的默认存储引擎:V5.1之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB查看默认存储引擎:show variables like '%engine%'MyISAM: 不支持外键,不支持事务,支持全文索引,底层B+树,表锁(每次锁定一个表的数据),在线分析处理操作速度快 .fr...
2019-08-16 12:23:47
220
原创 数据库基础2_SQL基础操作
SQL基础操作DDL 数据定义语言:create drop alter show一:库 创建库:creat database [if not exists]name; db:数据库 删除库:drop databsae [if exists]name; if ...
2019-08-16 11:58:33
197
原创 全排列、子集问题
输入一个字符串,打印出该字符串中字符的所有排序,例如输入字符串abc,则打印出字符串a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba//解法一:经典的解法#include<iostream>#include<string.h>using namespace std;void PermutationNumber(char *pstr...
2019-08-14 19:16:42
309
原创 给定数组元素,插入(替换)一个元素,使得它左边的值小于等于它,右边的值大于它,求位置?
给定数组元素,插入一个元素,使得它左边的值小于等于它,右边的值大于它,求这个元素插入的位置://用vector初始化数组元素(随机值)void Init_Vector(vector<int> &ivec){ for(int i = 0;i<10;++i) { ivec.push_back(rand()%100); }}//...
2019-08-14 14:25:06
393
原创 BST
BST(Binary Search Tree):二叉查找树,也叫二叉搜索树,二叉排序树,其目的是为了提高查找的效率,其查找在平均和最坏的情况下都是logn级别,接近二分查找BST性质:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。BST原理:通常采取二叉链表作为二叉排序...
2019-08-12 21:12:59
215
原创 二叉树_线索化二叉树
#include<assert.h>#include<iostream>#include<vector>#include<stack>#include<queue>using namespace std;typedef char ElemType;#define END '#'typedef enum //存在...
2019-08-11 20:06:27
239
原创 union_整形->IP(点分十进制)
解法一:普通处理#include<stdio.h>void PrintIP(unsigned int ip){ int i = 0; int a =0; for(int i = 0;i<4;++i) { a = ip & 0x0ff; printf("%d.",a); ip>&...
2019-08-11 17:18:20
273
原创 C++_文件传输2_客户端与服务器端编程
#define UPFILE 1#define DOWNFILE 2#define COMMAND 3typedef struct Command{ long type; char text[128];}S_Command;class FileTrans{public: void SendFile(char *filename, int sockfd,...
2019-08-11 13:17:45
617
原创 Linux_IO复用
I/O模型:阻塞I/O、非阻塞I/O、I/O复用、信号I/O、异步I/OI/O复用:一个单进程、单线程的服务器程序同时监听多个文件描述符上是否有关注的事件发生,如果某些文件描述符上有事件发生,则程序接着处理有事件发生的文件描述符,没有事件发生的文件描述符则不予理会,这样就可以极大的提高程序的性能。使得一个程序能同时监听多个文件描述符。I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的,...
2019-08-10 22:35:49
312
原创 Linux_多进程、多线程、线程池、进程池
单进程、单线程编程:这样的服务器程序同一时刻只能处理一个客户端连接,可以和多个客户端串行交互int main(){ int listenfd = socket(); int res = bind(); res = listen(); while(1) { int c...
2019-08-10 20:38:43
291
原创 Linux_内存、虚拟内存
一、内存的管理方案分区:固定分区:操作系统启动时将内存分配完成 大小相等的固定分区:将内存分配成大小相等的区块,会产生内部碎片 放置策略:为每一个区块维护一给队列,为整体维护一个等待队列 大小不等的固定分区:将内存分配成大小不等的...
2019-08-10 15:28:45
363
原创 Linux_HTTP
ARP:地址解析协议,用来将IP地址转换为MAC地址。MAC(Media Access Control,介质访问控制)地址:或称为MAC位址、硬件地址,用来定义网络设备的位置DNS:域名解析协议,是用来将域名转换为IP地(也可以将IP地址转换为相应的域名地址)DNS工作方式:递归式、迭代式域名:URL - 字符串 “www.baidu.com”IP地址:IP - 整型值 "168.1...
2019-08-10 11:50:25
242
原创 Linux_IP_IPV4、6
IP协议:是TCP/IP协议族的动力,为上层协议提供无状态、无连接、不可靠的数据报服务无状态:IP通信双方不同步传输数据,IP数据报的发送、传输、接收都相互独立,无上下文关系 无法处理乱序、重复的数据,16位标识仅用来处理IP分片和重组,无法指示接收顺序无连接:IP通讯双方都不长久的维持对方的任何信息,因此上层协议每次发送数据时都必须明确指出对方的IP不可靠...
2019-08-09 21:40:13
391
原创 Linux_三次握手、四次挥手
三次握手:第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1)(确认号:数值等于发送方的发送序号+1(即接收方期望接收的下一个序列号)),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+AC...
2019-08-09 20:12:11
400
原创 Linux_TCP、UDP
TCPl:面向连接的、可靠的、字节流服务UDP:无连接、不可靠、数据报服务面向连接:两端通讯之前先建立连接,连接一旦建立,两端的交互过程都在这一连接上完成,无需建立新的连接,通讯完成后,需要断开连接,以释放服务器的资源操作系统为我们维护连接,所以内核需要为连接分配相应的资源对于服务器而言,一个链接只能为一个客户端服务,从而造成服务器性能有待优化字节流服务、数据报服务、无状态服...
2019-08-09 18:50:35
318
原创 Linux_网络基础及编程流程
基本概念:IP地址:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异标识主机端口号:客户端可以通过ip地址找到对应的服务器端,但是服务器端有很多的端口,每个应用程序对应一个端口号,通过端口号,客户端才能真正的访问到该服务器。 标识主机上运行的进程网络字节序列:网络字节顺序...
2019-08-09 15:05:10
221
原创 C++_文件传输1_发送与接收
Linux下基于TCP的文件传输相关函数及结构体:int open(char *path,intflag,/*mode_t mode*/); open建立了一条到文件的访问路径,如果调用成功则会返回一个能够被read,write和其它系统调用的文件描述符,它不会与任何其它运行中的进程共享,flag(O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写)...
2019-08-08 21:16:28
1058
原创 Linux_锁
互斥锁:互斥锁是只能在线程之间使用的一种控制临界资源访问的机制,如果一个线程要访问临界资源,则必须先加锁,用完之后解锁,这样在一个线程访问临界资源的过程中,其它线程加锁就会阻塞,不能访问临界资源的临界区,直到访问临界资源的线程访问结束并解锁头文件:#include <pthread.h>初始化:int pthread_mutex_init(pthread_mutex_t ...
2019-08-08 13:12:05
224
原创 Linux_线程
线程:线程是进程内部的一条执行序列(执行流) (执行序列: 一组有序指令+数据的集合(以函数为单位)) 每一个进程至少有一条线程,称之为主线程,从代码角度看,即为main()的函数体 在主线程中可以通过线程库创建其它线程(函数线程)。 主线程和函数线程会同时向下运行,一个进程中的线程都...
2019-08-07 23:19:27
205
原创 offsetof_计算结构体偏移量
Linux2.4.0源码:#ifndef _LINUX_STDDEF_H#define _LINUX_STDDEF_H#undef NULL#if defined(__cplusplus)#define NULL 0#else#define NULL ((void *)0)#endif#undef offsetof#define offsetof(TYPE, MEMBER...
2019-08-05 15:11:59
507
原创 Linux_进程
进程:进程:运行中的程序程序:存储在磁盘上的二进制可执行文件进程:一组有序指令+数据+资源的集合进程是程序的执行过程,有开始,有结束,有结果,操作系统为了唯一标识一个进程,会给进程分配一个ID:PID内核对象:进程都是独立运行的,所以进程要通讯,必须有能够共享的东西,内核对象,内核对象由操作系统内核维护的、在操作系统内核中的结构体变量。标识符:标识符是内核对象的内部名,类似文件描...
2019-08-05 14:25:18
207
原创 Linux_进程间通方式
管道:半双工通讯管道:借助文件系统在多个进程之间建立一条数据通讯信道,各进程通过自己打开的文件描述符操作同一块内存空间,从而完成数据的传递工作,管道的数据都是通过内存空间缓存的,像现实中的管道两端,一段进行读操作,一段进行写操作,如果管道为空,read会阻塞,如果管道为满则write会阻塞有名管道:可以在任意进程间通讯,通讯是双向的,任意一端都可以进行读操作和写操作,但同一时间只能一端读,...
2019-08-05 14:24:25
203
原创 Linux_PCB
进程控制块 PCB每个进程在内核中都有一个进程控制块(Processing Control Block),Linux内核的进程控制块是task_struct结构体,用来维护进程相关的信息,主要表示进程状态。其作用是使一个在多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位或与其它进程并发执行的进程。PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制...
2019-08-05 12:48:31
2536
原创 Linux_用户态和内核态
内核态用户态区别:内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境。简而言之系统程序在内核运行时的状态,CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序,运行在内核态的程序可以访问的资源多,但可靠性、安全性要求高,维护管理都较复杂用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源。简而言之系统程序在用户状...
2019-08-05 12:37:18
425
原创 Linux_信号
信号信号时系统预先定义好的某些特定事件,信号可以被产生,接收,产生和接收的主体都是进程,信号有三种响应方式:忽略 默认 自定义 1) 改变信号响应方式 signal()修改信号的响应方式:signal函数可以修改信号的响应方式typedef void(* sighandle_t)(int);sighandle_t (*signal)(int,sighandle_t);忽略:SIG...
2019-08-05 12:26:17
202
原创 Linux_文件操作函数、库函数、系统调用函数
文件操作函数:int open(char *path,int flag,/*mode_t mode*/):打开一个普通文件。成功则返回文件描述符int read(int fd,void *buff,size_t size):按字节读取文件内容 size读取字节大小,缓冲区大小int write(int fd,void *buff,size_t size):按字节给文件中写入数据 buff文...
2019-08-04 20:20:50
272
原创 Linux_fork与exec
fork()与 exec() fork()函数原型:pid_t fork(void)typedef int _kernel_pid_t typedef _kernel_pid_t pid_tfork()会新生成一...
2019-08-04 19:56:51
376
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人