自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 资源 (1)
  • 收藏
  • 关注

原创 堆、堆排序、堆应用

堆”(Heap),原地排序、时间复杂度O(nlogn)的排序算法。堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或者小于等于)其子树中每个节点的值;

2022-11-27 23:50:11 371 1

原创 排序算法简述

常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序、桶排序、基数排序,这些排序各自有各自的特点。按照时间时间复杂度可以分为O(n^2):冒泡、插入、选择排序;O(nlogn):归并、快速排序;O(n):桶排序、计数排序、基数排序;

2022-11-27 13:47:23 420

原创 递归和排序算法的应用

然后取mid=(a+b)/2,然后把每个文件按照mid分割,取所有前面部分之和,如果小于1g就可以读入内存快排生成中间文件,否则继续取时间戳的中间值分割文件,直到区间内文件之和小于1g。快速排序是由上到下处理问题,利用原地分区,所以空间复杂度是O(1),不是稳定的排序算法。例如对十万个电话号码进行排序,借助与稳定的排序,从高位向低位开始进行排序,排序11次即可。基数排序对要排序的数据是有要求的,需要可以分割出独立的“位”来比较,且位之间有递进的关系,如果数据a的高位比数据b高位大,那剩下的就不用比较了。

2022-11-27 13:43:13 540

原创 TCP常见问题

所以如果客户端已使用端口 64992 与服务端 A 建立了连接,那么客户端要与服务端 B 建立连接,还是可以使用端口 64992 的,因为内核是通过四元祖信息来定位一个 TCP 连接的,并不会因为客户端的端口号相同,而导致连接冲突的问题。的工具,就是基于上面这样的方式实现的,它会主动发送 SYN 包获取 SEQ/ACK 号,然后利用 SEQ/ACK 号伪造两个 RST 报文分别发给客户端和服务端,这样双方的 TCP 连接都会被释放,这种方式活跃和非活跃的 TCP 连接都可以杀掉。

2022-11-27 13:42:24 2098

原创 QUIC简介

一、概述、QUIC(Quick udp Internet connection):快速UDP互联网协议。

2022-11-23 19:29:29 849

原创 跳表和散列表

因此需要维护一个常用密码的字典表,将字典中的密码进行哈希计算再哈希,针对字典攻击,可以引入盐(salt),和用户密码组合在一起,增加密码的复杂度。,动态扩容需要重新通过散列函数计算数据的存储位置,所以会导致在动态扩容的时候时间复杂度变为O(n),为了避免动态扩容时导致耗时过长,可以选择将扩容后的数据迁移操作分散开,每次插入只迁移部分数据,这样平均下来每次时间复杂度也是O(1)。链表要存储指针,存储较小对象时,比较消耗内存,另外链表中的节点时零散的,对CPU的缓存不友好。,这样可以进行区间和范围查找。

2022-11-21 23:05:56 552

原创 TCP连接的相关参数

TCP连接中有许多操作系统提供的调节参数,在不同的使用场景中修改对应的参数,可以TCP性能。TCP三次握手的性能提升。TCP数据传输的性能提升。TCP四次挥手的性能提升。

2022-11-13 12:58:35 1046

原创 TCP半连接队列和全连接队列

在TCP连接的服务端,linux内核会维护两个队列SYN队列,也成半连接队列accept队列,全连接队列服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列,等待进程调用 accept 函数时把连接取出来。

2022-11-12 15:30:29 1191

原创 TCP重传机制、滑动窗口、流量控制、拥塞控制

重传机制、滑动窗口、流量控制、拥塞控制

2022-11-09 22:10:03 1048

原创 TCP三次握手和四次挥手基本知识

TCP是面向连接、可靠的、基于字节流的传输层通讯协议。目的IP目的端口源IP源端口。

2022-11-08 21:31:32 587

原创 count(1)、count(*) 与 count(列) 的区别?

先说结论:count(*) = count(1) > count(索引列) > count(字段)

2022-11-05 22:15:14 3431

原创 数据库的索引简述

数据库索引结构采用的是B+树,总的来说B+树具有的好处就是树的高度相对低查找高效、磁盘IO次数少、可以范围查找。

2022-11-05 19:13:42 307

原创 MySQL优化策略

优化主要分为:架构优化、连接优化、SQL优化和表/库的设计优化

2022-11-05 10:41:43 296

原创 队列和栈的实现和应用

队列:先进先出栈:先进后出。

2022-11-02 16:21:58 251

原创 MySQL日志redo log、undo log、bin log简介

undo log:回滚日志,原子性,实现事务回滚和MVCC,引擎层实现redo log:重做日志,崩溃恢复,持久性 ,引擎层实现bin log:主从复制,数据备份,Server层实现。

2022-10-15 17:58:07 1628 1

原创 MySQL缓冲池Buffer Pool

MySQL的预读机制。当从磁盘中访问数据附近的数据,在未来有很大的概率也会被访问到,所以MySQL在加载数据时会把相邻的数据也会加载进来,这样可以很大概率的减少磁盘I/O。如果这些提前加载进来的数据没有被访问,这个预读操作相当于白做了,这就叫“预读失效”。使用简单的LRU算法会把预读的数据页加载放到链表头部,Buffer pool空间不足时还需要把原来末尾的数据淘汰掉。这些预读数据如果一直没有访问,而且还占用缓冲空间,就会大大降低缓存命中率。如何才能避免预读失效呢?

2022-10-11 23:27:39 1377

原创 MySQL隐式锁和插入意向锁

当事物需要加锁时,如果这个锁不可能发生冲突,InnoDB会跳过加锁环节,这种机制称为隐式锁。隐式锁时InnoDB实现的延时加锁机制,只有当可能会产生冲突的时候才会加锁,减少锁的数量,提高系统的性能。在Insert过程中不加锁,遇到特殊情况,将隐式锁转为显示锁。插入意向锁时特殊的间隙锁,不同于间隙锁的是,该锁只用于并发操作。尽管属于间隙锁,但是两个事物不能在同一时间一个拥有间隙锁一个拥有插入意向锁(两个有相同的区间)

2022-10-10 00:24:56 1314

原创 MySQL之死锁

互斥:一个资源只能被一个进程(事务)使用;请求与条件保持:一个进程(事务)在等待请求的资源过程中,自身已经占有的资源不可释放;不剥夺条件:进程(事务)在运行活跃时候,已经获得的资源未使用完之前,不可强行剥夺;循环等待条件:若干个进程(事务)形成首尾相接的循环等待关系;一般来说业务基本上就是对商品进行新增、修改和查询等操作,我们在对商品进行新增操作前,先通过select … for update操作进行查询,然后再进行相应的业务逻辑处理,所以当业务量很大时,就有可能出现死锁。

2022-10-09 20:25:42 1980

原创 MySQL行锁加锁规则

行级锁加锁规则比较复杂,不同场景加锁形式不同,对记录加锁时,加锁的基本单位是next-key lock(左开右闭),其在不同的场景下会退化成间隙锁或者记录锁。通过以下实验来看看不同的场景具体是什么锁。行级类型主要有三类:Record Lock:记录锁,只在一条记录上机上锁;Gap Lock:间隙锁,锁定某一个范围,不包含记录本身,左开右开;Next-Key Lock:记录锁和间隙锁的组合,包含记录本身,左开右闭;//共享锁 select . . . for update;//独占锁。

2022-10-07 10:43:38 1326 4

原创 MySQL之锁

在MySQL中,根据加锁的范围可以分为全局锁、表级锁和行锁,InNoDB引擎支持表级锁也支持行级锁。

2022-10-06 22:24:19 319 1

原创 数据库事务的隔离级别

MySQL提出了四种隔离级别来规避这些现象:- 读未提交(read uncommitted):一个事物还没有提交时,它做的变更就可以被其他事务看到; - 读提交(read committed):一个事物提交后,它做的变更才可以被其它事务看到; - 可重复度(repeatable read):一个事务在执行过程中看到的数据,一直和这个事务启动时看到的数据是一致的。MySQL InNoDB引擎的默认隔离级别; - 串行化:会对记录加上锁,在多个事务对记录进行读写操作时,如果发生了冲突,后一个访问的事务必

2022-10-06 16:14:51 407

原创 linux 可打开的文件描述符数

一个进程可同时打开的文件个数是有限的,这个限制是在/etc//security/limits.conf文件中设置的。程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdo

2018-01-28 21:50:29 228

原创 引用传递、值传递和指针传递

一、值传递 将要传递的值作为副本传递。传递过程中被调函数的形参作为被调函数的局部变量处理,在内存堆栈中开辟新空间以存放主调函数传过来的实参值,从而成为实参的副本二、引用于值传递的区别 1、引用传递传递的是引用对象的内存地址,被调函数的形参存放主调函数传递进来实参变量的地址,即通过堆栈中存放地址访问主调函数中的实参变量三、指针传递和引用传递的区别 指针和引用都是

2018-01-25 15:13:18 463 1

原创 《STL源码剖析》-序列式容器(二)list容器

list概述: 相较于vector的连续线性空间,list就有点复杂了,但复杂有复杂的好处,每次插入或删除一个元素,就配置或释放一个元素。因此list不存在浪费空间的问题。而且对于任何位置插入或释放元素,时间是常值。 list的迭代器 首先list的节点(node)是一个双向链表。另外list不能像vector以普通指针作为迭代器,因为其节点不保证在空间中连续。所以li

2017-08-13 00:09:37 397 1

原创 《STL源码剖析》-序列式容器(一)vector容器

对于STL而言,其中最重要的就是容器了,容器也是许多人对STL的第一印象。STL跟据容器的不同,分为序列式容器(array, vector, heap, priority-queue, list, slist, deque, stack, queue)和关联式容器(set, map, multiset, multimap, hashtable, hash_set, hash_map, hash_mu

2017-08-12 23:04:00 286

原创 《STL源码剖析》-序列式容器(一)vector容器

对于STL而言,其中最重要的就是容器了,容器也是许多人对STL的第一印象。STL跟据容器的不同,分为序列式容器(array, vector, heap, priority-queue, list, slist, deque, stack, queue)和关联式容器(set, map, multiset, multimap, hashtable, hash_set, hash_map, hash_mu

2017-08-12 00:21:57 385

原创 TCP/IP协议总结(一)-TCP首部格式和TCP建立连接和释放连接

平时我们谈到TCP/IP协议时总会自然的想到三次握手、四次挥手、面向字节流和可靠传输等等。但是我们要知道TCP/IP协议不仅仅是一个简单的协议,而是一个TCP/IP协议族,里面包括TCP、UDP、IP和ARP等等许多协议。但是这里我们主要详细介绍传输控制协议TCP。首先,在TCP/IP协议族中进行了分层(流水线工作,专一迅速而高效),由上到下分为以下四层: 应用层:包含HTTP(超文传输协议)

2017-07-31 23:39:27 2291

原创 《STL源码剖析》-内存适配器(二)配置器剖析

了解内存配置后的对象构造行为和内存释放前的对象析构行为后(参见博文:http://blog.csdn.net/peng_shakalaka/article/details/75452224(构造和析构),我们来学习对象构造前的空间配置和对象析构后的空间释放 对象构造前的空间配置和对象析构后的空间释放,SGI的设计思想如下: *向system head 要求空间。 *考虑多线程状态。 *考虑内

2017-07-20 08:56:00 508 1

原创 《STL源码剖析》-空间配置器(一)构造和析构

简介:SGI STL的配置器与标准规范不同,名称为alloc而不是allocator,而且不接受任何参数。SGI标准的空间配置器std::allocator和SGI特殊的空间配置器std::alloc。其中allocator配置器,SGI从来没用过它,因此也不建议我们使用。原因主要是因为效率不佳。仅仅只是把C++的 ::operator new 和 ::operator delete 做一层小包装而

2017-07-19 22:41:00 353

原创 复制操作符“operator=”注意事项

以下所述都是根据《Effective C++》中条款10、11和12总结所得。一、令operator=发挥一个reference to *this 连锁形式赋值:int x, y, z;x = y = z = 15;//复制采用右结合律,以上赋值被解析为:x = (y = (z = 15));为了实现“连锁赋值”,复制操作符必须返回一个reference指向操作符的左侧实参。当然这只

2017-07-12 22:34:58 290

原创 C++默默编写并调用了哪些函数

什么时候空类不在是一个空类呢? 答案是当C++处理过它之后。创建了一个类,如果自己没有声明,编译器会为这个类声明一个复制构造函数、一个默认构造函数、一个析构函数和一个赋值函数。所有这些函数都是public且是inline的。但是对于默认声明的的函数不是每种情况都可以调用的。例如像下面:template<class T>class Nmae{public: Nmae(std::

2017-06-20 22:38:35 242

原创 常见的C++字符&字符串输入输出

一、每次输入一个字符 1.使用原始的cin进行输入: char ch; cin >> ch; 特点: cin在读取char值时,与其他基本类型一样,cin将忽略空格和换行符,因此输入的空格不会被回显,也不会被包括在计数内。发送个cin的输入被缓冲,只有按下回车键后,输入才会被发给程序。 2.使用cin.get(

2017-05-02 22:22:11 4507

转载 多重继承

首先我们考虑一个(非虚拟)多重继承的相对简单的例子。看看下面的C++类层次结构。class Top { public: int a; }; class Left : public Top { public: int b; }; class Right : public Top { public: int c; }; class Bottom : public Left, pu

2017-04-22 21:45:41 198

原创 C++has-a关系

一、包含关系 简单地说就是“对象中的对象”,一个类中包含是一个类成员。class Student{ private: string name; //一个string类对象 valarray<double> scores; //一个valarray<double>类对象 ...};在包含关系中通过对象名来调用被包含类对象的公

2017-04-22 21:32:16 944

原创 抽象基类

一、简介 C++通过使用纯虚函数(pure virtual function,ABC)提供为实现的函数。纯虚函数声明的结尾处为=0。 当类声明中含有纯虚函数时,则不能创建该类的对象。包含纯虚函数的类只用作基类。要成为真正的ABC,必须至少包含一个纯虚函数。二、C++为什么要定义抽象基类? 纯虚函数只提供了接口,并没有具体实现。抽象类不能被实例化,通常是作为基

2017-04-21 11:23:08 445

原创 虚函数表和虚函数表指针

编译器处理虚函数的方法是:给每个对象添加一个隐藏成员。隐藏的成员保存了一个指向地址数组的指针。这个数组被称为虚函数表(virtual function table,vtbl)。虚函数表中存储了为对象进行声明的虚函数的地址。 而虚函数表指针就是每个对象隐藏的成员,这个成员就是一个指针,指向虚函数表的开头。#includeusing namespace std;#pragma p

2017-04-20 15:02:45 618

原创 静态联编与动态联编

将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编(binding)。 静态联编(static binding):在编译过程中进行联编。 动态联编(dynamic binding):使用虚函数,编译器在运行时选择正确的虚方法的代码。一、指针和引用类型的兼容性 指向基类的引用或指针可以引用派生类对象,而不必进行显示的转换。例如: A是一个基类,B是A

2017-04-20 11:48:21 286

原创 C++类的虚成员函数

一、简介 虚函数就是类的成员函数前面加上virtual关键字的函数。虚函数的作用就是为了实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。使用了virtual程序将根据引用或指针指向的类型来选择方法,如果没有使用virtual程序将根据指针类型或引用类型来选择方法。二、虚函数简单演示 在多态

2017-04-19 21:12:12 4075

原创 C++类成员函数存储方式

*类的成员函数是不占类空间的。 当我们实例化一个对象的时候,因为这个对象是用类定义的,那么它理所当然拥有了这个类的数据和函数。但是,一般情况下,不同的对象,他们的的数据值不同,但是函数的代码都相同。所以,为了节约存储空间(想象一下我们如果定义了100个对象,那么用100段内存空间存储相同的代码,岂不是很浪费?),我们让成员函数的代码共享。所以类的成员函数,对于类来讲。一方面是逻辑上的“属于”,一方

2017-04-18 22:42:26 886

原创 C++默认参数

一、默认参数严格按照从左向右的顺序,不可跳跃。 void Fun(int a , int b = 2, int c) //这样是错误的,如果从某处开始使用默认值,则右边所有其他参数也必须有默认值二、参数默认值只能在含糊声明或函数定义时一处指出,不可同时指定。三、默认参数与函数重载的二义性问题. 假如有函数 void Fun(int one, int two = 2);

2017-04-18 22:22:02 1784

智能寻迹小车

个人第一个作品,简单易懂!

2016-09-12

空空如也

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

TA关注的人

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