自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 快速排序简述

快排是不稳定的排序。复杂度介于nlogn ~n*n 之间(均摊nlogn)。当每次取值恰好能取到中位数时,复杂度最小,即为n*logn。当每次取值取到极值时,当待排序数据的重复性很高时,时间复杂度最大,即为n*n对于无序数据,快排均摊复杂度为n*logn 且常数系数很小,为八大排序中最快。快排的特性就是快。//能处理重复数据的快速排序pair<int,int...

2019-04-15 15:38:13 284

原创 虚拟内存简述

在远古时期,内存极小,程序也不大,程序直接装载到内存运行。但是随着程序越来越复杂,理所应当的出现了这个问题,如果程序所需内存比可用内存大,程序该如何运行?为了解决这个问题,当时提出了一种覆盖装入的技术,就是需要程序员自己把程序分割成若干个不相干的程序块,块与块之间分别装载运行。举个很简单的例子,程序里面有两个主要函数A和B,这两个函数之间没有相互调用关系,当需要A函数运行的时候,就把A函数...

2019-04-01 11:02:32 585 1

原创 面试常见排序算法实现

1.快速排序//快速排序void quick_sort(vector<int> &nums){ quick_sort(nums,0,nums.size()-1); return;}void quick_sort(vector<int> &nums,int start,int end){ //元素<=1个退出 ...

2019-03-28 16:30:41 172

原创 堆之二项堆

二项堆:不同度二项树的根结点从小到大链起来就是二项堆二项树:如图所示,4颗树分别为度为0,1,2,3的二项树度为3的二项树:有一个根结点,(0,1,2)的二项树分别是它的叶子节点。度为n的二项树:有一个根节点,(0,1...n-1)的二项树分别是它的叶子节点同度二项树合并:直接将根结点值较小的二项树挂到根结点较大的二项树的根结点下就行。二项堆合并:二项堆合并就是...

2019-02-25 20:02:57 310

原创 堆之左偏树

左偏树(左偏堆),优势:两个左偏树合并效率高O(logn)外结点:一个结点的孩子数不满两个,就称之为外结点。距离(dist):每个节点上有个距离(dist)的属性,dist的值为该结点到最近的外结点所经过的边的个数。外结点的dist=0。空结点的dist=-1。左偏树定义:1.是一颗二叉树。2.是个堆。3.每个节点的左节点的dist &gt;=右结点dist 根据定...

2019-02-14 12:40:16 191

原创

堆是一颗特殊的树。常用于优先队列的实现符合以下定义,即为堆:1.是一颗树2.树中的每个节点全都大于它的子节点(最大堆),或者每个节点全都小于它的子节点(最小堆)堆的合并:(最小堆为例)方法1,随意从任意一个堆叶子节点中取下一个节点,将两个堆的根结点作为这个节点的左右子节点,这个节点就是新的根结点,然后,对堆进行一次维护方法2://将堆顶更小的堆的右节点(堆)和另...

2019-02-12 20:58:55 181

原创 堆之二叉堆&堆排序

二叉堆是特殊的完全二叉树。定义,符合一下两点即为二叉堆:1.是个堆2.是个完全二叉树因为是完全二叉树,所以一般用数组存储。在数组中,f是父节点下标,l是左节点下标,r是右节点下标,son是子节点下标(l或者r)。因为是完全二叉树,所以已知任何节点都能推断出它的关联节点:(下标从0开始)f = (son-1)/2r = 2*f +1l = 2*f +2r ...

2019-02-12 14:33:53 238

原创 红黑树笔记

红黑树学习 rb1:根结点必须是黑色,空叶子结点视为是黑色rb2:不能有两个相邻的红色节点(父节点和子节点不能同时为红色)rb3:从根结点到任意空叶子结点的路径的黑色结点数相等。衍生推论:1.红黑树从根结点起,最长路径比最短路径节点数比,不会超过2:12.以红黑树任意黑色节点为根,都是一颗红黑树3.任意节点到外部节点的所有路径中,黑色节点数是一致的。 术语:...

2019-02-12 11:01:07 347

原创 protobuf笔记

protobuf只是一个编码,解码工具,它和网络传输过程是没有关系的。protobuf使用流程如下:    1.写test.proto文件,通过protoc命令生成test.pb.cc 和test.pb.h文件。    2.把生成的代码文件添加到代码里,直接调用protobuf生成的API使用即可。    3.编译的时候链接 -lprotobuf 库。过程描述:    1.发送端先把要发送的信息通...

2018-06-25 16:26:54 175

原创 逆波兰表达式

    1 + 2 - (4 - 2 * 3 /2)  * 5正常的中缀表达式(运算符左右是参与计算的两个值),符合两条运算规则    1.运算符优先级高的先计算。    2.运算符优先级相同则左到右依次计算。 第一条运算规则是高于第二条的。如果严格按照这个定律的话,中缀表达式在正常处理上,是比较跳脱的,步骤如下:    1.需要先找到最高优先级的运算符,参与计算。...

2018-06-24 14:36:43 205

原创 Leetcode 137. Single Number II

题意:给定一个数组,已知这个数组中有一个数出现了一次,其它数都出现三次。找出这个数解法:有个很好理解的解法,因为int有32位,所以开一个数组bit[32],遍历32次,把每个位出现的次数分别存入数组中,最后bit[32]分别对3取模,得到的结果,只出现一次的数。这个算法的时间复杂度为O(32*N),相当的高。从别的地方you看到另一种解法,复杂度为O(N),乍一看看不懂,

2016-09-17 15:44:00 297

原创 STL priority_queue 优先队列

优先队列是用堆实现的疯等丰富的

2016-09-03 15:14:42 256

原创 Leetcode 148. Sort List

题意:链表排序,要求复杂度n*logn;思路:这道题用了好长时间 ,我先用快速排序做的,结果超时了,发现样例中重复数据很多,看来有意不让用快拍。于是乎想到了归并排序,这应该是我第一次写完整的归并排序,特意分模块优美了一些。一下就是链表的归并排序ListNode* sortList(ListNode* head) { ListNode *p;

2016-09-02 22:09:34 319

原创 Leetcode 124. Binary Tree Maximum Path Sum

题意:跟一个二叉树,求最大路径和。(路径和被定义为,从一个节点到另一个节点的值得和,注意:不一定是叶子节点)思路:1,最长路径和,必定是以某个节点为根,以此节点左子树的根到某个节点的最大路径,以此节点右子树的根到某节点的最大路径,的和。2.对于一个节点,只存在3种情况,此节点是最长路径和的根,最长路径和的根在此节点的左子树,最长路径和的根在此节点的右子树3.可以用递归解决,

2016-08-31 12:50:39 283

原创 Leetcode 94. Binary Tree Inorder Traversal

题意:中序遍历二叉树,要求非递归思路:设置一个栈,给每个节点设置一个标号,代表是否展开过。若未展开过,前序遍历就按right left root ,中序遍历就按 right  root left,后序遍历就按root right left压入栈。发现展开过,就直接放入vector中。循环,至栈为空,得到的vector就是遍历后的结果/** * Definiti

2016-08-28 19:05:49 340

原创 Leetcode 101. Symmetric Tree

题意:给定一棵树,判断它是否沿中轴线对称思路:每次把同时遍历根的左右子树,分别对比就行了/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int

2016-08-27 17:05:26 708

原创 Leetcode 114. Flatten Binary Tree to Linked List

题意:给一棵树,按前序遍历的顺序将依次放在右子树上思路:1,第一眼看上去的思路是,前序遍历tree,节点依次加入队列,遍历完之后,出队,并连接成题目要求时间复杂度O(N)  空间复杂度O(N)2.想了想,一定有空间复杂度O(logN)的对于一棵树,我要把它变成题中的链表状。需要1把左子树变成如题的链表状;2.把右子树变成链表状;3.根->链状左子树,链状左子树的最后一个

2016-08-27 16:41:56 636

原创 Leetcode 8. String to Integer (atoi)

题意:实现atoi();思路:题目简单,坑不好趟,改了好久atoi()规则如下:1.忽略首空格2.如果碰见不合法的输入,以最大能匹配的合法输入计算:比如123abc 会输出 123234T32 会输出 234否则返回03.支持加号4.如果上溢出,则输出最大值;如果下溢出,则输出最小值代码如下:(不建议看,写的太乱了)int myAtoi(string str) { // i...

2016-08-19 19:22:49 282

原创 Leetcode 7. Reverse Integer

先判断反转后是否溢出,再反转

2016-08-19 11:11:18 500

原创 shell爬虫

curl 访问一个urlgrep -o 精准匹配 字符串 netcat 构造http报文发送

2016-05-09 21:58:06 914

原创 system V 消息队列的用法

system消息队列,说白了就是内核维护的队列,这个队列的元素是进程发出的一些字符串。通过消息队列,可以实现进程间消息的传递。对于每个消息队列,内核都维护了下面这个数据结构struct msqid_ds { struct ipc_perm msg_perm; //存一些权限,创建信息之类的 struct msg* msg_first; //ptr to first messag

2016-04-07 21:20:10 530 1

原创 用信号实现进程同步

#include#include#include#include#include#include#include#include#includestatic volatile sig_atomic_t sigflag;static sigset_t newmask,oldmask,zeromask;static void sig_usr(int signo){ sigf

2016-02-15 13:36:33 411

原创 函数指针与函数名

首先函数指针的定义,如果指向无参函数,定义的时候后面一定要加(),否则编辑器无法分辨这是指向函数的指针void (*f); //指向void * 的指针void (*f)(); //指向void (*)(void)函数的指针int (*f)(); //指向int (*)(void)函数的指针写这个主要是因为今天突然想到,函数名,函数指针,到底都是啥?先看代码:#i

2016-02-11 13:37:46 505

转载 linux信号处理

1、可靠信号和不可靠信号       "不可靠信号"        Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在 早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠

2015-08-20 20:13:03 523

转载 termios结构体

termios结构体内容:成员 描述-------------------------------------------c_cflag 控制模式标志c_lflag 本地模式标志c_iflag 输入模式标志c_oflag 输出模式标志c_line line disciplinec_cc[NCCS] 控制字符c_ispeed 输入波特率c_ospeed 输出波特率 在

2015-06-02 14:37:32 757

原创 linux命令实现:write

write:用于终端之间的用户通信。write [username] [终端]代码实现#include#include#include#include#include#include#include#include#define PATH "/var/run/utmp"#define PREPATH "/dev/"char BUF[4096];char *

2015-05-26 20:31:41 939

原创 设置vim的键盘映射

因为没有IDE所以写起代码很蛋疼,或者不小心按错了,手就需要向右拉到方向键上,然后再拉到退格键上,然后食指再回到‘j'上,如此循环,慢的一比。突然想到既然normal模式下可以通过hjkl移动,我也可以在插入模式下通过ctrl +[ ] 来实现。查了一下,果然可以设置$vim ~/.vimrc写入:imap                                

2015-05-25 17:04:11 3669

原创 linux命令实现:pwd

pwd命令:显示当前的工作目录。这个命令实现起来很简单,分分钟就写好了。这里主要注意一点,chdir()这个系统调用,是改变当前程序的工作目录,不是改变bash的工作目录,这是不一样的。还有,改动是立即生效的,在需要用到工作目录(其实就是一个路径名)的时候,程序就会读取某个地方的信息,当调用chdir()时,直接把这个信息更改,后续的读取到的工作目录就会改变,在本程序中,输出的时候用到

2015-05-22 21:27:21 1972

原创 gcc编辑错误提示

incompatible implicit declaration of built-in function    1dereferencing pointer to incomplete type   2conflicting types for 3too few arguments to functiong  4原因:1.函数缺少头文件

2015-05-18 14:27:00 1029

原创 linux命令实现:ls

对ls命令的简单实现有-[al]选项

2015-05-12 15:43:32 1001

原创 linux获取终端大小

在shell下可以直接用$LINES和$COLUMNS两个变量,$LINES是屏幕高,$COLUMNS是屏幕宽,单位都是字符数。在程序中获取:1.可以通过读取$LINES与$COLUMNS对应的文件之类的,这里不做赘述。2.可以通过ioctl()系统函数得到#include#include#include#include#includeint main()

2015-05-12 13:32:32 2136

原创 linux命令实现:cp

cp用于复制文件之类的操作用法:cp [参数] file newfile (把file复制到newfile)  或:cp [参数] file1 file2 file3 ... dirname(把文件file1 file2 file ...复制到dirname目录下)参数:-a   :相当于 -pdr 。-d   :若来源文件为连结文件的属性(link file),则复制该链接文

2015-05-07 10:26:03 546

原创 linux命令实现:whoami

#whoami-->root要实现的就是这个命令,很简单,稍微分析一下:1.通过系统调用getuid取得执行该程序的UID2.检索/etc/passwd文件,通过UID寻找到对应的USER_NAME.(/etc/passwd格式   "USER_NAME:x:UID:GID:DESCRIPTION:HOME_DIR:SHELL ")3.打印USER_NAME整个过程没什么复

2015-05-06 18:02:10 2176

转载 Real user ID, Effective userID , Set user ID 之间的关系

前段时间一直没搞明白这几个ID之间的关系,今天看到一篇博文,这才拨云见日,才有所了解了.real user ID:实际用户ID,指的是进程执行者是谁effective user ID:有效用户ID,指进程执行时对文件的访问权限saved set-user-ID:保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv use

2015-05-04 22:02:24 512

原创 linux下的文件操作

这一章给出了诸多的文件操作的函数,我把这些函数总结一下open() creat()close() read()write() lseek()fstat() stat()mmap()   nummap()fcntl()  ioctl()1.open()//函数原型 int open(const char *pathname , int flags);int o

2015-04-18 16:10:21 450

原创 树状数组 插点问线 插线问点

markhttp://dongxicheng.org/structure/binary_indexed_tree/http://blog.csdn.net/greyant/article/details/7548564

2015-04-03 14:39:03 630

原创 牛顿迭代法

牛顿迭代法(英文名Newton’s Iteration)是用来求函数的根的高效算法。递推公式为                     图1大概思想:            如图所示,取一个点(xn,f(xn)),过该点作切线交x轴于(xn+1,0)很容易得到稍微变形,就可以得到最开始给出的公式。这大概是一个无限逼

2014-12-29 20:55:54 916

原创 MD5的实现

闲着没事干,索性实现一下MD5具体的东西,说白了,就是把原始数据+补充数据共分割成N个64位的小段,每个小段又分成16个小节,然后每个小段参与一次四轮运算,用ABCD这四个数关联起他们,保证数据有丝毫变动,得到的MD5码,会完全变动。F=(x&y)|((~x)&z)G=(x&z)|(y&(~z))H=x^y^zI=y^(x|(~z))

2014-12-27 14:25:32 501

原创 KMP算法

  求一个字符串T的子串S的位置一般算法是int len=T.len-S.len,j,i;for(i=0;i&lt;len;i++){ for(j=0;j&lt;S.len;j++) if(T[i+j]!=S[j]) break; if(j==S.len) break;}这种算法写起来很简单,复杂度最大为O(T.len*S.len)例如T[]="aaaa...

2014-12-25 17:15:44 404

转载 c语言位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位

2014-12-25 16:48:44 324

空空如也

空空如也

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

TA关注的人

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