- 博客(64)
- 收藏
- 关注
原创 Mysql和B+数
基本搜索结构:B-树的插入分析:B+树相比B树的变化:B+树是B树的变形,也是一种多路搜索树,其定义基本与B树相同,除了:1、一个节点中关键字的数量和孩子的数量相等(规则简洁)。2、所有值都要出现在叶子节点上,非叶子节点中的值只是充当路径索引,并且叶子节点要链接起来(方便遍历),非叶子节点由叶子节点的最小值构成。3、为所有叶子节点增加一个链指针。4、所有关键字都在叶子节点出现。5、非叶子节点的子树指针p[i],指向关键字值属于【k[i], k[i+1]】的子树。
2020-09-09 22:46:44
677
原创 哈希总结
一:哈希结构1.1、哈希概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O((log2(N)),搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该
2020-08-17 16:36:50
480
原创 二叉搜索树、AVL树、红黑树总结
一、二叉搜索树1.1、二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一颗空树,或者是一颗具有以下性质的二叉树: (1) 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。 (2) 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。 (3) 它的左右子树也分别为二叉搜索树。1.2、二叉搜索树的操作 (1) 二叉搜索树的查找 (2) 二叉搜索树的插入 插入的具体过程如下: a. 数为空,则直接插入 b. 数不为空,按二叉搜索树性质
2020-08-17 09:41:03
363
原创 项目:基于自主web服务器的在线大整数乘法运算
一、项目背景 http协议被广泛使用,从移动端到pc端浏览器,http协议无疑是打开互联网应用窗口的重要的协议,http在网络应用层中的地位不可撼动,是能准确区分前后台的重要协议。做这个项目可以进一步加深对http协议的理解,并且帮助我理解常见互联网应用行为,从零开始完成web服务器的开发,进一步熟悉网络编程。二:项目准备1、项目实现目标 (1) 从零开始完成web服务器开发 (2) 基于所开发的web服务器实现在线大整数乘法运算功能2、开发环境 (1) CentOS 7 (2
2020-08-12 12:40:41
457
原创 项目:低配版Everything
一、项目背景 在任何操作系统中,搜索工具都是必不可少的,不管我们多么认真的对文件进行整理,当文件数量非常多时,都可能需要我们花很长时间来找某个文件。搜索工具可以让我们从大量文件中快速找到我们所需文件的位置,大大节省了查找时间。 文件搜索工具的功能如此实用,那它是用什么方法从那么多的文件中来找我们想要的一个特定文件的呢?我们到底可以用什么方法来实现文件搜索的功能呢? 带着疑惑和好奇,我通过从网上找各种资源终于实现了一个低配版的文件搜索工具。实现这个项目同时让我巩固了自己所学的C++基础
2020-07-30 11:29:42
1138
原创 十大经典排序算法总结
1、冒泡排序1、对前n个元素从头到尾两两进行比较,如果第一个比第二个大,就交换他们两个,最后得到的最后一个元素就是前n个元素的最大值。2、然后对前n-1个、前n-2个…,一直到前两个元素进行第一步操作,依次得到他们里面的最大值。3、进行n-1次第一步的操作后就将元素排序好了。平均时间复杂度:O(n^2)最差时间复杂度:O(n^2)空间复杂度:O(1)数据对象稳定性:稳定(相同的元素排序后相对位置不改变)#include <stdio.h>#include <iostrea
2020-07-25 22:59:30
252
原创 分析STL中的sort算法
而在目前的排序中,快排平均情况下是性能最好的一种排序,但是快排也有其自身的短板,比如说:元素接近有序、元素量比较大的情况下,直接使用快排时,堪称一场灾难。因此STL中sort算法并没有直接使用快排,而是针对各种情况进行了综合考虑。sort函数提供了两个版本:sort(first, last):默认按照小于方式排序,排序结果为升序,一般用于排内置类型数据。sort(first, last, comp):可以通过comp更改元素比较方式,即可以指定排序的结果为升序或者降序,一般以仿函数对象和函数指针的
2020-07-25 22:02:37
272
原创 stringstream的使用方法
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,可以使用下面的方法:1、使用itoa()函数2、使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。#include <iostream>using namespace std;int main(){ int n = 123456789; char s1[32]; itoa(n, s1, 10);//最后
2020-07-10 17:14:34
14290
原创 库函数的模拟实现
模拟实现strlen://方法1:计数器方式int my_strlen(const char *str){ int count = 0; assert(str); while (*str) { ++count; ++str; } return count;}//方法2:不能创建零时变量计数器int my_strlen(const char *str){ assert(str); if (*str == '\0') return 0; else return m
2020-07-06 22:19:20
185
原创 vector的resize()和reserve()方法的区别
今天在写代码的时候发现了一个奇怪的现象,当vector对象使用resize()方法之后再使用insert()插入元素,vector对象的size会在使用resize(n)后的n基础上增加,而使用reserve()方法后,insert()方法插入元素不会在使用reserve(n)后的n基础上增加。经过研究,我发现:resize()同时改变了capacity()和size(),而reserve()只是增加了vector的capacity(),但是它的size()没有改变。例如:#include <
2020-05-28 12:39:06
352
原创 三分法解决假币问题
今天遇到一道题,第一眼就想到了用二分法来解决,可是二分法却没有通过,后来才知道三分法才是解决找假币最快的方法,题目描述如下:思路:当硬币的个数只有一个时,需要0次。当硬币个数为2时,需要1次。当硬币个数大于等于3时,我们按下面方法将硬币分为3堆:n%3=0,分为n/3、n/3、n/3三堆。由于要求最坏情况,我们先用天平对n/3和n/3检测,失败后再对n/3个硬币做三分法。n%3=1,分...
2020-04-02 20:59:40
4793
原创 两个超级大的整数做加法
最近做题经常碰到题目中说输入两个超级大整数,然后让童鞋对这两个超级大整数做运算,一开始我还因为题目有问题,哪有整形可以放得下这么大的整数,后来看了前人的做题思路后发现是我无知了,以下面这道题对这种方法做一个记录。题目描述:思路:用两个字符串来存放两个整数,然后用字符串模拟加法的运算,这样就可以对超级大的整数做加法运算了。#include <iostream>#include ...
2020-04-01 23:22:50
386
原创 不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:1、10进制的加法三步走(175+69)(1) 先不考虑进位,175+69得到134。(2)计算进位值,个位上5+9的进位为1,十位上的7+6的进位为1所以进位为11*10=110 (要乘以10是因为进一位相当于乘10)。(3)重复(1),(2),直到没有进位制产生,就结束了。(134+110=24...
2020-04-01 23:04:30
101
原创 linux中的压缩解压命令(centos 7)
1、zip命令zip命令将目录或文件压缩成zip格式,使用格式如下:通过zip压缩文件的目标文件可以不写指定扩展名,默认扩展名为zip。在这里插入代码片压缩文件:zip -r(必须加此参数) 目标文件 源文件解压文件:unzip -d 解压后目录文件 压缩文件注意:目标文件可加zip也可不加,-d后面跟解压到的目的地,没有-d默认为当前目录zip参数:-r 递归处理,将指定目录下...
2020-04-01 21:30:05
1210
原创 Linux标准输入、标准输出和标准错误重定向
文件描述符Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕;标准错误是命令错误信息的输出,默认指向屏幕。标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。标准错误是文件描述符2。这...
2020-03-28 20:39:31
616
原创 求最大公约数以及最小公倍数
最大公约数(greatest common divisor因子, GCD)。最小公倍数(least common multiple倍数, LCM)。1.群举法首先给出两个数a和b,从两数较小的数开始,找到满足a和b同时可以被其整除的最大的约数。#include <stdio.h>int gcd(int a, int a){ int temp = 0; temp = (a...
2020-03-27 20:19:37
2036
原创 分析“函数返回一个对象”的情景
写看如下代码:#include <iostream>using namespace std;class B{public: B() { cout << "default constructor" << " "; } B(int i) : data(i) { cout << "constructed by parameter...
2020-03-25 20:39:46
251
原创 分析为什么加锁和解锁操作是原子的
临界资源:多线程执行流共享的资源就叫做临界资源。临界区:每个线程内部,访问临界自娱的代码,就叫做临界区。互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种...
2020-03-24 15:34:05
917
原创 让我头疼的手套问题
题目描述:在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组l...
2020-03-21 18:16:11
225
原创 程序地址空间
上图也可以进一步细分:1.栈区: 栈又叫堆栈,通常存放程序临时创建的非静态局部变量(即函数大括号中定义的局部变量)以及函数调用时的参数,调用后的返回值等。由编译器自动分配释放。栈是向下增长的。 栈具有“小内存、自动化、可能会溢出”的特点。栈顶的地址和栈的最大容量一般是系统预先规定好的,通常不会太大。由于栈中主要存放的是局部变量,而局部变量的占用的内存空间是其所在的代码段或函数段结束时由系...
2020-03-21 11:36:50
348
原创 C++中不能被重载的运算符总结
在C++中,有5个不能被重载的运算符,为了方便记忆和查看,总结如下:1、.(点运算符,成员访问运算符)2、::(域运算符)3、.*(点星运算符,成员指针访问运算符)4、?:(条件运算符)5、sizeof(长度运算符)...
2020-03-20 22:33:24
819
原创 定义一个long long类型,用%d打印的结果
这几天复习了一下整形提升,正好发现一个令我非常困惑的问题:#include <stdio.h>int main(){ long long a = 1, b = 2, c = 3; printf("%lld %lld %lld\n", a, b, c); printf("%d %d %d\n", a, b, c); return 0;}输出结果:那么问题来了,%l...
2020-03-20 14:15:52
7556
2
原创 C语言整形提升
这几天做题发现整形提升的问题忘掉了,所以在这里总结一下。整形提升是C程序设计语言的一项规定: 在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型,然后执行表达式的运算(CPU是对补码进行运算的)。整型提升的意义在于: 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度...
2020-03-20 11:55:59
291
转载 编译和链接的过程
转载链接:https://blog.csdn.net/guaiguaihenguai/article/details/81160310本来想总结一下的,后来发现这篇博客讲的非常好,还是转载一下吧。程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接。接下来通过几个简单的例子来详细讲解一下这些过程。对于上边用到的几个选项需要说明一下。使用 gcc 命令不跟任何的选项的话,会默认执...
2020-03-18 20:42:37
1581
原创 深度剖析数据在内存中的存储
数据类型介绍类型的基本归类:整形家族:char unsigned char signed charshort unsigned short (int) signed short (int)int unsigned int signed intlong unsigned long (int) signed long (int)//小括号中的内容表示可以省略浮点数家族...
2020-03-18 15:54:33
258
原创 求一个整数在内存中的二进制形式所包含的1的个数(汉明重量)
1.最容易想到的方法:#include <stdio.h>int main(){ int num = 10; int count = 0;//计数 while (num) { if (num % 2 == 1) { ++count; } num = num / 2; } printf("二进制中1的个数 = %d\n", count); ret...
2020-03-18 11:32:23
197
原创 main函数的三个参数
我们平时写程序时main函数是省略参数的,或者是省略部分参数,其实main函数是有三个参数的。int main(int argc, char *argv[], const char *envp[])argc:int 类型,用于存放命令行参数的个数(包括函数名)。argv[]:char数组型,每个元素都是一个字符指针,指向一个字符串,即命令行中的每一个参数。envp:char数组型,这个数...
2020-03-16 20:33:55
876
原创 32位系统和64位系统各数据类型对应的字节数
一)64位系统和32位有什么区别?1、64bit CPU拥有更大的寻址能力,最大支持到2^64内存,而32bit只支持4G内存当然2^64只是理论值,实际中不可能用到这么大的内存,目前64位windows系统最大只支持128G,而当前主流主板只能加到16G。2、64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的...
2020-03-16 19:46:27
3145
原创 结构体内存对齐
计算结构体大小是一个非常热门的考点:结构体内存对齐。先来看下面这段代码:#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>struct S1{ char c1; int i; char c2;};struct S2{ char c1; char c2; int i;};struct S3{ do...
2020-03-16 18:26:27
104
原创 动态规划编程题总结
1、跳石板小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。例如:N = 4,M = 24:4->6-&...
2020-03-16 14:23:21
300
原创 判断一个数是不是素数
要判断一个数n是不是素数,我们将这个数除[2,sqrt(n)]中的数,如果有一个数可以整除,则说明这个数不是,如果所有的都不能整除,也就是余数不为0,则说明这个数是素数。#include <iostream>#include <cmath>using namespace std;bool isPrime(int n){ for (int i = 2; i &l...
2020-03-13 23:13:31
145
原创 二叉树的最近公共祖先节点
1、搜索二叉树(二叉搜索树)**概念:**一颗二叉树可以为空,如果不为空,满足以下性质:1、非空左子树的所有键值小于其根节点的键值。2、非空右子树的所有键值大于其根节点的键值。3、左右子树都是二叉搜索树。若二叉树是一个二叉搜索树,方法如下所述:从树的根节点开始和两个节点作比较,如果当前节点的值比两个节点的值都大,则这两个节点的最近公共祖先节点一定在该节点的左子树中,则下一步遍历当前节点...
2020-03-13 21:09:47
512
原创 自己编程实现kill命令(环境:centos7)
实现代码如下:mykill.c#include <stdio.h>#include <signal.h>int main(int argc, char *argv[]){ if (argc != 3) { printf("Usage: %s pid sigid\n", argv[0]); return 1; } //atoi(argv[1])将需要...
2020-03-09 11:29:19
618
原创 getline()、cin.get()和cin.getline()的使用方法
一:getline()#include <iostream>#include <string>int main (){ std::string name; std::cout << "Please, enter your full name: "; std::getline (std::cin,name); std::cout <&...
2020-03-08 13:03:01
696
1
原创 模拟实现优先队列(仿函数的介绍)
自从学过数据结构中的堆以后每次想到大堆和小堆的代码就很头疼,最近学了优先队列(priority_queue)后,发现模拟实现优先队列正好用到了大堆小堆的知识,在这里记录一下加深记忆,同时方便以后查看。模拟实现代码如下:namespace my_space{ template<class T> struct less { bool operator()(const T&a...
2020-03-05 19:43:29
286
原创 C++:explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。class Date{public: Date(int year) :_year(year) {}private: int _year; int _month: int _day;};int main(){ Date d1(2018); // 用一个整形变量给日期类型对象赋值 // 实...
2020-03-04 15:19:43
86
原创 因没有安装静态库报错:/bin/ld: cannot find -lc
linux默认使用的是动态链接,当我们使用-static参数时可能会因为没有安装静态库而报错,如下图所示:解决方法:用下面的命令安装静态库sudo yum install glibc-static安装完成后,编译运行代码:...
2020-03-03 16:15:32
537
原创 动态库和静态库
静态库:程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个动态链接的可执行文件仅仅包含它用到的函数的入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。动态库可以在多个进程间共...
2020-03-03 16:00:30
259
原创 用命名管道实现server和client之间的通信
匿名管道只能用于具有亲缘关系的进程之间进行通信,通常,一个管道由一个进程创建,然后该进程调用fork,此后父子进程之间就可以用管道通信了。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件(管道类型)。1、Makefile.PHONY:allall:client serverclient:client.c gcc...
2020-03-02 17:20:29
1674
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人