- 博客(79)
- 收藏
- 关注
转载 无向图和有向图
1.无向图两点之间的边没有方向。点(Vertex)简称V,边(Edge)简称E2.有向图两点之间的边是有方向的有多少边以某点为出发点 则有多少的出度,同理有多少边以某点为终点则有多少入度,度=出度+入度3. 邻接矩阵用G=(V,E)表示上图的无向图,V表示顶点集合V=v1,v2,v3,etc,E表示边的集合e1,e2,e3,etc用aij表示vi和vj两个顶点之间的边的数量关系得到的矩阵A=A(G)即为图G的邻接矩阵。对于上图可得邻接矩阵A:..
2022-05-11 14:42:11
4375
原创 Google Protocol Buffer 使用入门
首先在Linux下安装protobuf,然后开始使用一、编写相关代码//my.protosyntax = "proto2";package my;message helloworld { required int32 id = 1; // ID required string str = 2; // str optional int32 opt = 3; //optional field }//reader.cpp#includ
2022-05-06 16:02:46
763
原创 状态压缩DP解网易雷火笔试题
题目:假设有n项工作待完成,每项工作都有完成截止日期 deadline,每项工作都会花去cost天,而且不能中断。安排完成工作的顺序,以减少总的工作推迟时间。输入正整数 n(1<=n<=20),表示工作数量。 接下来 n 行,每行包含两个整数,分别表示第 i 项工作的 deadline 和 cost。输出一个数字,表示最少需要推迟几天才能完成所有工作。输入例子1:33 38 13 2输出:2看了一上午的状态压缩dp算法,大概明白了用该算法的解题思路,其实就是动态规划+位
2022-05-05 11:49:51
787
原创 C++手写线程池及GDB调试多线程程序
一、简易线程池代码定义线程池类,主要成员变量有线程数量,启动停止标志位,模拟的任务队列,控制多线程同步的条件变量和互斥锁等。还可以根据项目要求添加其他内容。#include<vector>#include<string>#include<condition_variable>#include<iostream>#include<thread>#include<mutex>#include<queue>
2022-04-23 16:08:14
1771
原创 内存管理之伙伴系统与SLAB
一、内存碎片内存在进行申请和释放内存的情况下,难免会产生碎片。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题。内存碎片是由内存的申请和释放产生的,通常分为内部碎片和外部碎片。内部碎片是由于采用固定大小的内存分区,即以固定的大小块为单位来分配,采用这种方法,进程所分配的内存可能会比所需要的大,这多余的部分便是内部碎片。 外部碎片是由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。二、伙伴系统伙伴系
2022-04-16 15:09:24
1905
原创 程序链接之符号解析和重定位
一、空间与地址分配链接器在连接过程中的工作就是把多个输入的目标文件加工合并成一个输出文件。有几种不同的方案:按序叠加按序叠加可以说是最简单的一个方案,就是将输入的目标文件按照次序叠加起来。从图中可以看到,在有很多输入文件的情况下,输出文件将有很多零散的段。因为每个段都要遵循空间对齐,所以这样会占用大量空间。比如,一个段长度只有1字节,但是按照空间对齐,其在内存也要占用4096个字节。相似段合并为了解决按需叠加所带来的问题,引入了相似段合并这个概念,就是把相同性质的段合并到一起。.b.
2022-04-06 19:02:26
2984
转载 P问题、NP问题、NP完全问题和NP-hard问题
在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。(知道这两概念的可以自动跳过这部分)1、多项式:axn-bxn-1+c恩....就是长这个样子的,叫x最高次为n的多项式....咳咳,别嫌我啰嗦。。有些人说不定还真忘了啥是多项式了。。例如第一次看到的鄙人→_→2、时间复杂度我们知道在计算机算法求解问题当中,经常用时间复杂度和空间复杂度来表示一个算法的运行效率。空间复杂度表示一个算法在计算过程当中要占用的内存空间大小,这里暂不讨论。时间复杂度则表示这个算法运行得到想要的解所需的计算工作
2022-03-20 14:43:15
2852
4
原创 黑盒测试、白盒测试、灰盒测试
一、软件测试软件测试是软件开发过程的重要组成部分,用来确认一个程序的品质或性能是否符合开发提出的一些要求。软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。软件测试是为了发现错误而执行程序的过程,在软件生存期中横跨两个阶段,通常在编写出每一个模块之后就对它做必要的测试(称为单元测试)。编码和单元测试属于软件生存期中的同一个阶段。在结束这个阶段后对软件系统还要进行各种综合测试,这是软件生存期的另一个独立阶段,即测试阶段。目的第一是确认软件的质量,一
2022-03-20 12:39:32
574
原创 C++实现简易版智能指针
#include <iostream>using namespace std;template<class T>class smart_pointer {private: T* _ptr; int* _count;public: smart_pointer(T* ptr = nullptr) : _ptr(ptr) { if (_ptr) _count = new int(1); else _count = ne.
2022-03-17 17:08:34
1050
原创 Linux下查看TCP连接断开过程
本文尝试用Wireshark分析学习TCP连接、断开全过程。一、ping命令ping是一个十分强大的TCP/IP工具。主要作用:(1)用来检测网络的连通情况和分析网络速度;(2)根据域名得到服务器IP;(3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。在Linux下开启一个终端,尝试ping百度,结果如下图:可以看到连接正常。二、tcpdump命令这是个可以根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump可以将网..
2022-03-09 12:11:00
5284
转载 C++11 中的std::function和std::bind
1. 可调用对象可调用对象有一下几种定义:是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针;C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。不同类型可能具有相同的调用形式,如:// 普通函
2022-03-03 21:06:43
195
转载 Http 缓存机制
转载自彻底弄懂HTTP缓存机制及原理 - 云中桥 - 博客园 (cnblogs.com)前言Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能。但是对于很多前端同学来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的,却并不是很清楚。在介绍HTTP缓存之前,作为知识铺垫,先简单介绍一下HTTP报文HTTP报文就是浏览器和服务器间通信时发
2022-03-02 15:26:49
195
原创 operator new与placement new
placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。举例来说:class foo{};foo* pfoo = new foo;pfoo指向的对象的地址是不能决定的,new做了这些工作。第一步分配内存,第二步调用类的构造函数。分配内存这一操作是由operator new(size_t)来完成的,如果类重载了operator new,将调用foo::operator new(size_t ),否则调用全局::operator
2022-02-28 19:37:26
1038
原创 C/C++各种字符串函数
一、strrchrchar *strrchr(const char *str, int c)C 库函数 char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。参数str-- C 字符串。 c-- 要搜索的字符。以 int 形式传递,最终会转换回 char 形式。返回值该函数返回 str 中最后一次出现字符 c 的位置。如果未找到该值,则函数返回一个空指针。示例#in..
2022-02-28 16:33:56
3101
原创 开源协程库libco汇编原理分析
本文件进行协程切换,把协程运行时的上下文信息在寄存器和栈之间传输。栈空间是向下增长的。AT&T格式的汇编和intel格式的汇编不同,王爽书中写的是intel格式的汇编,gcc反汇编是AT&T格式的。在C语言和现代CPU的设计规范中,栈帧是一块由栈分配的内存块,在运行时,每当调用一次函数,都要存储其自动变量。因此对于同一函数的递归调用在每一次都会连续的获得自己独立的栈帧。函数的栈帧是指esp和ebp之间的一块地址。因此如果一个函数把更多的值压入堆栈,实际上是在扩展它本身的栈帧。(1)ES
2022-02-19 10:51:37
625
原创 C++智能指针介绍(shared_ptr,enable_shared_from_this,weak_ptr,unique_ptr)
一、shared_ptrshared_ptr,使用引用计数实现对同一块内存可以有多个引用,在最后一个引用被释放时,指向的内存才释放,这也是和unique_ptr最大的区别。基本用法:shared_ptr<int>sp1(new int(10));cout << "sp1: " << sp1.use_count() << '\n';cout << "sp1 = " << sp1 << " *sp1 = " <
2022-02-01 22:13:19
1035
原创 打印从1到最大的n位数
使用全排列递归打印#include<iostream>#include<string>#include<algorithm>#include<sstream>#include<fstream>#include<stdio.h>using namespace std;void printNumber(char* number, int& n, FILE* fd)//去掉开头的0,打印数字{ bool
2022-01-28 10:42:34
555
原创 C/C++文件IO函数
文件(file)通常是在磁盘或固态硬盘上的一段已命名的存储区。C中采用的主要是文件指针的办法,C++中对文件的操作主要运用了“文件流”(即非标准的输入输出)的思想。一、CC把文件看作是一系列连续的字节,每个字节都能被单独读取。C提供两种文件模式:文本模式和二进制模式。1.fopen函数std::FILE* fopen( const char* filename, const char* mode );打开文件filename并返回与该文件关联的文件流。mode用于确定文件访问模式。
2022-01-27 16:24:10
3445
原创 KMP算法简介
KMP算法,用于判断一个字符串是不是另一个字符串的子串,由名字首字母分别为K,M,P的三位发明者命名。此算法时间复杂度可达到m+n。代码如下: int KMP(string str1, string str2) { //str2为子字符串 int m = str1.size(), n = str2.size(); if(n == 0) return 0; vector<int> next(n, 0); for(in
2022-01-08 20:44:33
560
原创 GDB调试入门与“No symbol in current context“问题
Linux下打开终端输入GDB,可以看到相关信息:输入help获取帮助信息:输入带调试程序:#include<stdio.h>void f(){ printf("f() is called!!!\n");}int main(int argc, char* argv[]){ printf("1\n"); printf("2\n"); printf("3\n"); printf("4\n"); f(); .
2022-01-06 20:20:25
5275
1
原创 Linux之shell编写
管理整个计算机硬件的其实是操作系统的核心(kernel),这个核心是需要被保护的,所以一般使用者就只能通过shell来跟核心沟通,以让核心达到我们想要达到的工作。man, chmod, chown, vi, fdisk, mkfs 等等指令都是独立的应用程序,但是可以通过壳程序(就是命令行界面)来操作这些应用程序,让这些应用程序调用核心来运行所需的工作。壳程序的功能只是提供使用者操作系统的一个接口。第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他就称为 Bourne s
2022-01-01 22:10:36
840
原创 Git概述
git是一种分布式版本管理控制系统●Workspace: 工作区●Index /Stage:暂存区●Repository: 仓库区(或本地仓库)●Remote: 远程仓库Git是分布式版本控制系统,就没有中央服务器,每个人的电脑就是一个完整的版本库。这样工作的时候就不需要联网了,因为版本都是在自己的电脑.上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时只需把各自的修改推送给对方,就可以互相看到对方的修改了。常用命..
2021-12-26 21:16:38
226
原创 数据库系统之sql语言
查询语言(query language)是用户用来从数据库中请求获取信息的语言。这些语言通常比标准的程序设计语言层次更高。查询语言可以分为过程化的和非过程化的。在过程化语言(procedural language)中,用户指导系统对数据库执行一系列操作以计算出所需结果。在非过程化语言(nonprocedural language)中,用户只需描述所需信息,而不用给出获取该信息的具体过程。实际使用的查询语言既包含过程化方式的成分,又包含非过程化方式的成分。有一些“纯"查询语言:关系代数是过程化的,而元组关系
2021-12-25 16:03:44
1585
原创 数据库之MySQL
一、连接池(网络接入层)主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是MySQL所特有的技术。二、查询处理器(服务层)第二层服务层是MySQL的核心,MySQL的核心服务层都在这层。查询解析,SQL执行计划分析,...
2021-12-17 19:58:25
944
原创 数据库系统之索引
存储管理器实现了几种数据结构,作为系统物理实现的一部分:●数据文件(data files), 存储数据库自身。●数据字典(data dictionary),存储关于数据库结构的元数据,尤其是数据库模式。●索引(index),提供对数据项的快速访问。和书中的索引一样,数据库索引提供了指向包含特定值的数据的指针。例如可以运用索引找到具有特定的ID的instruetor记录,或者具有特定的name的所有instructor记录。散列是另一种索引方式,在某些情况下速度更快。物理存储介质一、磁盘磁盘的每
2021-12-12 21:50:30
1855
原创 数据库系统之锁与事务
传统的操作系统所支持的典型的文件处理系统( fle-procsing eystem),永久记录被存储在多个不同的文件中,人们编写不同的应用程序来将记录从有关文件中取出或加入到文件中。在数据库管理系统( DBMS)出现以前,各个组织通常都采用这样的系统来存储信息。在文件处理系统中存储组织信息的主要弊端包括:数据的冗余和不一致;数据访问困难;数据孤立;并发访问异常;安全性问题等,以上问题及一些其他问题促进了数据库系统的发展。数据库是一个以某种有组织的方式存储的数据集合。数据库管理系统( DataBase-
2021-12-06 22:45:13
1017
原创 操作系统之文件与设备管理
文件(File)是操作系统中的一个重要概念。在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位。大多数应用程序的输入都是通过文件来实现的,其输出也都保存在文件中,以便信息的长期保存及将来的访问。当用户将文件用于应用程序的输入、输出时,还希望可以访问文件、修改文件和保存文件等,实现对文件的维护管理,这就需要系统提供一个文件管理系统,操作系统中的文件系统(File System)就是用于实现用户的这些管理要求。所有的计算机应用程序都需要存储和检索信息。由
2021-11-27 22:10:00
1073
原创 操作系统之线程
一、线程简介早期的计算机系统只允许一个任务独占系统资源,一次只能执行一个程序 由于对程序并发执行的需求,引入了多进程。进程的引人可以解决多任务支持的问题,但是也产生了新的问题:每个进程分别分配资源开销比较大,进程频繁切换导致额外系统开销,进程间的通信实现复杂。考虑现实中的场景:一个word程序如果采用多进程 一个进程负责界面交互 一个进程负责后台运算 会相当低效 (进程通信不好实现 进程频繁切换导致额外的系统开销)。一个同时要处理大量请求的网络数据库如果采用多进程,对每个请求都创建一个进程去响应那服.
2021-11-24 17:52:47
1450
原创 操作系统之进程(二)
一、进程调度1.调度算法(1)先来先服务调度算法(FCFS)。先来的先进入内存或占用处理机。对于作业调度,从后备作业队列中选择一个或多个最先进入队列的作业将其调入内存。对于进程调度就是从就绪队列选择最新进入的进程,为之分配处理机。(2)短作业(进程)优先调度算法(SJ(P)F)在选择作业或进程的时候,先估算每个作业、进程的服务时间,选择其中最短的优先获得处理机。(3)高优先权优先调度算法。这种算法给进程加了一个属性优先权。本质就是高优先权的优先调用。优先权有两种类型,一种是静态的,即每
2021-11-20 17:12:17
375
原创 操作系统之进程创建与进程状态
一、进程的创建阻塞状态:正在运行的进程由于某些原因调用阻塞原语把自己阻塞(如果不把自己阻塞的话会一直占用处理机),等待相应的事件出现后才被唤醒,事件完成回到就绪状态。通常这种处于阻塞状态的进程也排成一个队列。有的系统则根据阻塞原因的不同而处于阻塞状态进程排成多个队列。挂起状态是被迫被外界挂起,阻塞是正常流程中的一部分,是自愿阻塞。系统中同时运行着很多进程,这些进程都是从一个进程开始一个一个复制出来的。进程通过fork系列的系统调用(fork、clone、vfork)来创建,内核(或内核模块)也可以
2021-11-19 23:51:21
2694
原创 操作系统之进程间通信
每个进程都有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核。在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程问通信( IPC,InterProcess Communication) 。一、信号软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源。在软件层次上是对中断机制的一种模拟
2021-11-18 22:54:44
2509
原创 操作系统概述之虚拟内存
现代的应用程序都运行在一个内存空间里,在 32 位系统中,这个内存空间拥有 4GB (2 的 32 次方)的寻址能力。大多数操作系统都会将 4GB 的内存空间一部分挪给内核使用,应用程序无法直接访问这一段内存,这一部分内存地址被称为内核空间。Windows 在默认的情况下会将高地址的 2GB 空间分配给内核(也可以配置 1GB)。Linux 默认情况下将高地址的 1GB 空间分配给内核。用户使用的剩下的 2GB 或 3GB 的内存空间称为用户空间。栈由高地址向低地址增长。堆由低地址向高地址增长。Li
2021-11-16 22:17:04
1147
原创 操作系统之进程(一)
进程是对正在运行中的程序的一个抽象,是具有一定独立功能的程序关于某个数据集合的一次运行活动,它是进行系统资源分配、调度的一个独立单位。每个进程占有虚拟地址和页表。一、进程的管理可以用链接方式或者索引方式对PCB(系统为描述和控制进程的运行而为每个进程定义的一个数据结构,记录了操作系统所需关于进程全部的描述和控制信息)进行组织 。链接方式就是把PCB组织成各种队列:就绪队列 阻塞队列等等,索引方式就是用索引表的方式对PCB进行组织:就绪索引表 阻塞索引表等等。在 Linux 中,PCB 是一个名为 .
2021-11-14 21:16:57
1115
原创 操作系统与计算机体系结构概述
一、硬件系统硬件系统指组成计算机基本结构的 5 个部分:运算器、控制器、存储器以及输入设备和输出设备。运算器和控制器通常集成在一个芯片上,成为中央处理器(CPU)。CPU 是执行程序时进行运算和控制的装置,它直接控制着计算机各个部件的工作,是硬件系统的核心。存储器是存放系统中运行的程序和数据的部件。输入输出设备(外围设备)是用于实现计算机系统与外界信息交换的各种硬件设备。硬件是操作系统存在的物质基础。硬件层提供给操作系统的接口是机器的指令系统。操作系统的程序使用指令系统提供的机器指令所具有的功能
2021-11-13 22:02:06
1167
原创 C++面向对象特性之多态
一种对象为了接口重用而呈现的多重形态静态多态有模板重载,根据不同的参数调用函数体不同,这是在编译是就确定的动态多态有父子类中的虚函数,父类的指针或者引用调用的虚函数如果进行了重写则会调用子类的虚函数,这是通过动态连联编运行时确定的静态绑定和动态绑定绑定体现了函数调用和函数本身代码的关联,也就是产生调用时如何找到提供调用的方法入口:静态绑定:程序编译过程中把函数调用与执行调用所需的代码相关联,这种绑定发生在编译期,程序未运行就已确定,也称为前期绑定。动态绑定:执行期间判断所引用对象的实际类型来
2021-11-05 20:48:57
670
原创 C++面向对象特性之继承
继承是类之间的一种层次关系,根部的类称为基类,其他由基类直接间接继承而来称为派生类。基类的成员是所有类共有的成员,派生类定义其特有的成员。作用---代码重用 ,代码扩充一种是基类希望其派生类进行覆盖的函数:另一种是基类希望派生类直接继承而不改变的函数。对于前者,基类通常将其定义为虛函数( virtual)。当使用指针或引用调用虚函数时,该调用将被动态绑定。根据引用或指针所绑定的对象类型不同,该调用可能执行基类的版本,也可能执行某个派生类的版本。基类通过在其成员函数的声明语句之前加上关键字virtual使
2021-11-03 17:16:55
348
转载 面向对象概述
面向对象三大特性? 封装性:数据和代码捆绑在一起,避免外界干扰和不确定性访问。 继承性:让某种类型对象获得另一个类型对象的属性和方法。 多态性:同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为(重载实现编译时多态,虚函数实现运行时多态)。 面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法
2021-10-31 21:54:07
366
原创 C++面向对象特性之封装
一、类的成员变量普通成员变量数据成员初始化的方式有三种:1.默认初始化,类内成员没有被赋初值时执行默认初始化,类类型成员怎么初始化由其本身类型决定;2.类内初始化,即在构造函数之前给其赋初始值,可以用列表初始化或一般初始化;3.构造函数成员列表初始化,当数据成员没有在成员列表中出现时,将执行上面两种初始化方式,成员列表初始化顺序和声明顺序一致,与在列表中出现顺序无关。在构造函数体内对变量赋值不属于初始化,只是初始化后的赋值阶段。像const和引用,如果没有初始化就在构造函数中赋值则会报错。可
2021-10-31 21:14:00
221
原创 C++笔记(五)---动态内存管理与智能指针
一个可执行程序文件在计算机硬件上运行起来,其实质就是静态的文件被加载到内存中的过程,可执行程序文件只是一个程序的载体。一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。静态分配内存:是在程序编译和链接时就确定好的内存。 包括堆区栈区。动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。包括bss段(就是存放未初始化的全局变量与未初始化的静态变量),数据段gvar(数据段存放已初始化的全局变量和静态变量),代码段(存放程序执行代码和字符串常量)。int a..
2021-10-30 16:33:45
403
原创 C++笔记(四)---零碎基础知识
sizeof与strlen的区别1)strlen计算字符串的具体长度(只能是字符串),不包括字符串结束符。返回的是字符个数。2)sizeof计算声明后所占的内存数(字节大小),不是实际长度。3)sizeof是一个取字节运算符,而strlen是个函数。4)sizeof可以用类型做参数,strlen只能用char*做参数,且必须以‘\0’结尾,sizeof还可以用函数做参数;5)数组做sizeof的参数不退化,传递给strlen就退化为指针;一、异常处理语句C++中的异常情况:语法错误(编.
2021-10-28 23:09:21
172
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人