自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 资源 (2)
  • 收藏
  • 关注

原创 二叉树中任意两个节点的距离

题目:一个普通二叉树,如何找到两个给定节点之间的距离? ,其中二叉树中每个结点的值都不相同代码1:#include <iostream>#include <vector>#include <queue>using namespace std;struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),

2020-11-17 14:50:51 758 1

原创 漫画:什么是红黑树?

————————————————————————二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为...

2020-11-17 14:31:50 95

原创 七大查找算法

时间、空间复杂度比较查找算法 平均时间复杂度 空间复杂度 查找条件 顺序查找 O(n) O(1) 无序或有序 二分查找(折半查找) O(log2n) O(1) 有序 插值查找 O(log2(log2n)) O(1) 有序 斐波那契查找 O(log2n) O(1) 有序 哈希查找 O(1) O(n) 无序或有序 二叉查找树(二叉搜索树查找) O(log2n) .

2020-11-17 10:19:17 366 1

原创 排序算法总结

前言查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。通常查找和排序算法的

2020-11-15 15:09:38 2182 1

原创 TCP中的RTT和RTO

一、RTT和RTO的概念TCP作为一个面向连接的、可靠的传输协议,内部实现了一个重传计时器来保证数据能传输到对方。每发送一个数据包,就给这个数据设置一个重传计时器。如果在计时器超时之前收到了针对这个数据包的ack,就取消这个计时器。如果没有收到,则开始发起重传。计时器超时的时间被称为RTO,这个时间的确定取决于RTT。关于两者详细的解释:RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值; RTO(Retransmission Time Out

2020-11-12 14:41:11 8678

原创 TCP滑动窗口和拥塞控制机制

产生的原因∑对资源的需求>可用资源∑对资源的需求>可用资源注意单纯的增加网络资源无法解决问题例如:把结点的存储空间扩大,更换更高速率的链路,提高结点处理机的运算速度,不仅不能解决问题,而且可能使网络性能更坏。原因:网络拥塞是许多因素引起的,单纯的解决一个可能会使上述情况得到一些缓解,但是会把拥塞转移到其他地方。扩大结点存储空间——>由于输出链路的容量和处理机的速度并未提高,增大排队等待时间,超时重传,浪费资源。更换更高速率的链路——>可能会缓解,,有可能造成各部分

2020-11-12 13:47:14 2717

原创 TCP三次握手详解及释放连接过程

TCP头部: 其中 ACK SYN 序号 这三个部分在以下会用到,它们的介绍也在下面。暂时需要的信息有:ACK: TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。FIN(finis)即...

2020-11-12 10:12:41 1262

原创 C++多态的实现原理

一、在编译期间实现多态多态是指在不同的条件下表现出不同的状态,C++中通过重载函数的方法可以在编译期间实现多态。在编译时编译器会根据参数列表的不同寻找合适的函数。int Add(int left, int right){ return left + right;}double Add(double left, int right){ return left + right;}int main(){ Add(10, 20); Add(10.0,

2020-11-12 09:15:41 3409 1

原创 条件变量为什么要和互斥锁一起使用

mutex体现的是一种竞争,我离开了,通知你进来。cond体现的是一种协作,我准备好了,通知你开始吧。互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起配合使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来

2020-11-12 08:46:12 5817 1

原创 线程间同步的几种方法--互斥锁,条件变量,信号量,读写锁

一、互斥锁(mutex)  锁机制是同一时刻只允许一个线程执行一个关键部分的代码。1 . 初始化锁int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性。互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同

2020-11-12 08:43:29 496

原创 malloc 背后的系统知识(虚拟内存地址)

面试的时候经常会被问到 malloc 的实现。从操作系统层面来说,malloc 确实是考察面试者对操作系统底层的存储管理理解的一个很好的方式,涉及到虚拟内存、分页/分段等。下面逐个细说。1. 虚拟内存首先需要知道的是程序运行起来的话需要被加载的物理内存中,具体到计算机硬件就是内存条。操作系统启动的时候先把自己加载到物理内存的固定位置(一般为底部),物理内存的其他位置就用来运行用户程序。程序就是一堆指令,程序运行可以简单抽象为把指令加载到内存中,然后 CPU 将指令从内存载入执行。1. 为什么需要

2020-11-11 16:23:15 591

原创 C语言内存字节对齐小结

在C语言面试和考试中经常会遇到内存字节对齐的问题。今天就来对字节对齐的知识进行小结一下。首先说说为什么要对齐。为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位,计算机基础知识,别说不知道)。字节对齐有什么好处?以int型数据为例,如果它在内存中存放的位置按4字节对齐,也就是说1个int的数据全部落在计算机一次取数的区间内,那么只需要取一次就可以了。如图a-1。如果不对齐,很不巧,这个int数据刚好跨越了取数的边界,这样就需要取两次

2020-11-11 15:17:14 412 1

原创 (经典)tcp粘包分析

这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下:一 .两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收。2.短连接 Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.二 .什么时候需要考虑粘包问题?...

2020-11-11 15:06:53 293

原创 线程安全与可重入函数

线程安全:一个函数被称为线程安全的(thread-safe),当且仅当被多个并发进程反复调用时,它会一直产生正确的结果。如果一个函数不是线程安全的,我们就说它是线程不安全的(thread-unsafe)。我们定义四类(有相交的)线程不安全函数。第1类:不保护共享变量的函数将这类线程不安全函数变为线程安全的,相对比较容易:利用像P和V操作这样的同步操作来保护共享变量。这个方法的优点是在调用程序中不需要做任何修改,缺点是同步操作将减慢程序的执行时间。第2类:保持跨越多个调用的状态函数一个伪随机数

2020-11-11 14:58:55 894 1

原创 C 中 static 的常见作用

C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分。1.全局静态变量...

2020-11-11 14:35:31 531 1

原创 delete 和 delete [] 的真正区别

c++中对new申请的内存的释放方式有delete和delete[]两种方式,到底这两者有什么区别呢?1.我们通常从教科书上看到这样的说明:delete 释放new分配的单个对象指针指向的内存delete[] 释放new分配的对象数组指针指向的内存那么,按照教科书的理解,我们看下下面的代码:int*a=newint[10];deletea;//方式1delete[]a;//方式2肯定会有很多人说方式1肯定存在内存泄漏,是这样吗?...

2020-11-11 14:33:38 133

原创 指针与引用的区别

★ 相同点:1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。★ 区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终” ^_^4. 引用没有 const,指针有 const,const 的指针不可变;5. 引用不能为空,指针可以为空;6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本

2020-11-11 14:21:17 274

原创 浅拷贝与深拷贝的区别

简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经bai存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!我列举一个例子来说吧:你正在编写C++程序中有时用到,操作符的重载。最能体现深层拷贝与浅层拷贝的,就是‘=’的重载。看下面一个简单的程序:class string{ char *m_str;public: string(char *s)

2020-11-11 13:56:55 154

原创 C++ 程序内存泄漏检测方法

一、前言在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准。而在Windows平台,服务器和客户端开发人员惯用的调试方法有很大不同。下面结合我的实际经验,整理下常见定位内存泄漏的方法。注意:我们的分析前提是Release版本,因为在Debug环境下,通过VLD这个库或者CRT库本身的内存泄漏检测函数能够分析出内存泄漏,相对而言比较简单。而服务器有很多问题需要在线上并发压

2020-11-11 13:41:35 328

原创 c++ 运行时类型识别RTTI

通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型。c++通过下面两个操作符提供RTTI。(1)typeid:返回指针或引用所指对象的实际类型。(2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。当具有基类的指针或引用,但需要执行派生类操作时,需要动态的强制类型转换(dynamic_cast)。这种机制的使用容易出错,最好以虚

2020-11-11 13:31:15 522 1

原创 实现一个memcpy函数

MEMCPY(3) BSD Library Functions Manual MEMCPY(3)NAME memcpy -- copy memory areaLIBRARY Standard C Library (libc, -lc)SYNOPSIS #include <string.h> void * memcpy(void *restrict dst, const v...

2020-11-10 16:33:06 280

原创 C++中vector容器为什么扩容时按照2倍或者1.5倍进行扩容

扩容机制首先在VS2013底下,vector的扩容操作是每次扩容*1.5;在GCC环境下是2倍。GCC下的扩容方式是以二倍形式扩容。 VS2013下是以1.5倍进行扩容 所以可能会有疑问: 问题一:为什么非要以倍数的形式增长,而不是以个数的形式增长。 问题二:为什么每次增长是1.5倍或者2倍形式,而不是3倍或者4倍形式增长。详解问题一倍数方式空间拷贝数据次数假设总共有n个元素,以m倍的形式增长。(比如现在举例n=100, m=2),所以,vector的push_back的操作次数可

2020-11-10 16:15:45 1865

原创 分布式锁设计与实现

分布式锁的实现由多种方式,但是不管怎样,分布式锁一般要有以下特点:•排他性:任意时刻,只能有一个client能获取到锁•容错性:分布式锁服务一般要满足AP,也就是说,只要分布式锁服务集群节点大部分存活,client就可以进行加锁解锁操作•避免死锁:分布式锁一定能得到释放,即使client在释放之前崩溃或者网络不可达除了以上特点之外,分布式锁最好也能满足可重入、高性能、阻塞锁特性(AQS这种,能够及时从阻塞状态唤醒)等,下面就话不多说,赶紧上车~分布式锁方案对比 redis zo.

2020-11-10 15:02:42 183 1

原创 接口设计原则

1、单一原则一个类只负责一个功能领域的相应职责,或者可以定义为,就一个类而言,应该只有一个引起它变化的原因。 单一原则的实现,完全取决于你这么抽象的看待这个问题,你抽象的合适,那么它可以很棒,如果抽象的不够,它可能就是臃肿的类,抽象的过多,有可能创造出一大把寄生类。 单一职责原则这话就像我们常听的那句"做人要坚持"。听起来无懈可击,但是要坚持什么呢,如果这事情看起来不靠谱,做着难受,我还该不该坚持呢,所以'做人要坚持'是句营养不是很足的废话。 单一职责这话也有那么点意思...

2020-11-10 13:41:47 494

转载 二叉查找树与平衡二叉树

本文转自:https://blog.csdn.net/qq_25940921/article/details/82183093二叉查找树  二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 任意节点的左、右子树也分别为二叉查找树;(4) 没有键值相等的节点。  如上

2020-11-10 13:27:57 663

原创 堆排序的时间复杂度分析

堆排序包括两个阶段,初始化建堆和重建堆。所以堆排序的时间复杂度由这两方面组成,下面分别进行分析。先post一个实现代码,便于分析。#include <stdio.h>void swap(int *a, int *b);void adjustHeap(int param1,int j, int inNums[]);void HeapSort(int nums, int inNums[]);//大根堆进行调整void adjustHeap(int param1, int j, i

2020-11-10 13:19:22 13703 1

原创 什么是堆(Heap)

堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。堆的常用方法:构建优先队列 支持堆排序 快速找出一个集合中的最小值(或者最大值) 在朋友面前装逼堆属性堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方式。在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。例子:这是一个最大堆,,因为每一个父节点的值

2020-11-10 13:17:48 3929

原创 二叉树的最长的路径长度&&最大路径和

题目  给定一个二叉树,任意两个节点之间必然是有一条路径相通的,假定父节点和它的孩子节点的距离为单位1,求二叉树中相距最远的两个节点间的路径长度分析  这是一个简单的动态规划问题,假设某个节点node,到它的最低叶节点的长度为len(node),所求的最长路径必然经过一个最高节点high_node,则它到最低叶节点的长度为len(high_node)=max(len(high_node->left),len(high_node->right))+1,路径长度为sum=len(hi

2020-11-10 09:21:22 1466

原创 二叉树的遍历 (递归和非递归实现)

二叉树的遍历 (递归实现)用C++实现二叉树的“先根遍历”存储。用C++实现二叉树的“先根遍历”、“中根遍历”、“后根遍历”分别输出二叉树中结点的数据。#include <iostream>using namespace std ;struct BiNode{ char data ; BiNode *lchild , *rchild ;} ;BiNode *BiTree ;int NodeID ;BiNode *CreateBiTree (cha

2020-11-10 09:18:17 137

原创 圆环回原点问题

问题描述一个环上有10个点,编号为0-9,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过n步又回到0点有多少种不同的走法举例:如果n=1,则从0出发只能到1或者9,不可能回到0,共0种走法如果n=2,则从0出发有4条路径:0->1->2, 0->1->0, 0->9->8, 0->9->0,其中有两条回到了0点,故一共有2种走法1 2 3思路(动态规划)我们可以想到,再回到0点可以从右面回来,也可以从

2020-11-09 21:35:09 2026

原创 数字n,按字典排序,找出第k小的数字

(1)首先列出所有的字典序,然后选择第k个class Solution {public: bool static compare(int a,int b) { return std::to_string(a) < std::to_string(b); } int findKthNumber(int n, int k) { vector<int> Pool(n, 0); for (int...

2020-11-09 21:31:45 599

原创 使用钉钉接收gitlab仓库的推送消息

一,在钉钉中的操作1,创建一个群组点击群机器人,然后添加gitlab机器人选择好后点击gitlab机器人设置复制webhook此处钉钉的操作完成下面是gitlab上的操作二,gitlab的操作1,新建一个仓库‘my-test’(你必须是仓库的创建人才有权限操作webhook)2,进入项目里面,my-test>>>settings>>>Integrations如下页面然后提交,commit -- push 新的东西到该仓库

2020-11-04 14:37:31 1124

PROC与OCI编程

正本书讲述如何进行PROC和OCI编程设计,很好,个人觉得。

2011-04-18

空空如也

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

TA关注的人

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