自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 make_heap 用法

对make_heap(), pop_heap(), push_heap()的用法做个总结: make_heap()生成堆,他有两个参数,也可以有三个参数,前两个参数是指向开始元素的迭代器和指向结束元素的下一个元素的迭代器。第三个参数是可选的,可以用伪函数less()和gre...

2018-09-05 15:10:55 3119

转载 C++ regex

匹配字符串的基本规则1. 匹配固定的字符串regex e("abc");2. 匹配固定字符串,不区分大小写regex e("abc", regex_constants::icase);3. 匹配固定字符串之外多一个字符,...

2018-08-31 18:59:27 744

原创 啊哈算法(8)——更多精彩的算法

1、图的最小生成树(Kruskal算法) 对于一个给定的图,找出其最小生成树,用最少的边让n个顶点的图连通,很显然若要让n个顶点的图连通,最少要n-1条边,最小生成树还需要满足这n-1条边的权重和最小。例如对于如下输入实例:6 92 4 113 5 134 6 35 6 42 3 64 5 71 2 13 4 91 3 2第一行n和m,n表示有n个顶点,m表示有m条...

2018-08-27 21:09:54 631

原创 啊哈算法(7)——神奇的树

1、堆(完全二叉堆)建堆的方法:(自上而下的向上调整)每一次插入一个新节点,并且对其进行向上调整,实现如下:/*建立最小堆,方法一*/#include<iostream>using namespace std;int h[101]; //对于n个节点的堆void swap(int a, int b){ int temp = h[a];...

2018-08-26 14:27:42 337

原创 啊哈算法(6)——最短路径

最短路径 问题:对于一个给定的的图求出任意两点之间的最短路径? 可以通过DFS或者BFS求出两个点之间的最短的路径,在本节介绍其他的算法来求出两个点之间的最短路径。 1、Floyd-Warshall(不能解决带负权环路的图) 思想:若要让两个顶点之间的距离变小,只有通过一个顶点中转,甚至可能经过多个顶点中转,假定输入如下:4 81 2 21 3 61 4 42 3 33 1 ...

2018-08-25 20:57:30 462

原创 啊哈算法(5)——图的遍历

图的深度优先遍历和广度优先遍历 1、深度优先遍历#include<iostream>using namespace std;int e[101][101];//使用邻接矩阵来存储一个图int book[101];int sum, n;void dfs(int pos){ cout << pos << " "; sum...

2018-08-24 15:35:36 552

原创 啊哈算法(4)—万能的搜索

深度优先搜索DFS 深度优先搜索的关键在于解决“当下该如何做”。至于下一步怎么做与当下该如何做是一样的。深度优先搜索的基本模型:void dfs(int step){ 判断边界 尝试每一种可能for(i=1;i<=n;++i) 继续下一步dfs(step+1);}例1:求1到n的全排列,n为1~9之间任意一个数。//求1到n的全排列 想相...

2018-08-24 11:23:41 1073

原创 排序算法总结

冒泡排序时间复杂度为O(n2),最好情况下为O(n),空间复杂度为O(1)。稳定的冒泡排序总结:void swap(int &a,int &b){ int temp=a; a=b; b=temp;}void buble_sort1(int A[],int n){ for(int i=0;i<n-1;++i) { for(int j=i+1;...

2018-08-02 14:08:35 119

原创 进程控制(3)

在进程控制(1)和进程控制(2)中介绍了进程控制的几个基本操作函数,fork、exec系列、exit、wait和waitpid等。在这篇文章中将要介绍与进程相关的ID知识以及进程会计和进程调度。与进程相关的ID有以下几个: 1、实际用户ID 标识进程的执行者。可以看做是我们登录的ID,由login程序在登录时进行设置,一般不改变。只有超级用户可以改变RUID。 2、有效用户ID ...

2018-07-16 14:04:08 149

原创 进程控制(2)

在进程控制(1)中,介绍了创建子进程fork和vfork函数,其实在创建一个进程之后,子进程往往会调用一个exec函数去执行另一个程序。当调用一个exec函数之后,该进程执行的程序完全替换为新程序,而新程序从main函数开始执行。exec函数并不创建新的进程,前后进程ID不变,只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆段和栈段。exec函数#include <un...

2018-07-13 16:26:24 149

原创 进程控制(1)

进程控制在介绍了进程环境之后,这篇文章将进一步介绍进程的控制,包括创建新进程、执行程序和进程终止。进程标识符 每个进程都有一个非负整型表示的唯一进程 ID,称为进程标识符。虽然进程ID是唯一的,但是进程 ID 可以被复用,当一个进程终止时,其进程 ID 就可以用于另一个新的进程。通过采用延迟重用算法,使得赋予新进程的 ID 不同于最近终止的进程所使用的 ID,防止将新进程误认为是使用同一...

2018-07-12 21:05:06 221

原创 进程环境

进程环境

2018-07-11 20:56:19 317

原创 TCP/IP_TCP与UDP

TCP/IP_TCP与UDPTCP/IP中两个具有代表性的传输层协议,他们分别是TCP和UDP。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。 在IP首部中有一个协议字段,用来标识网络层的上一层所采用的是哪一种传输层协议。根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP内容,还是UDP内容。同样传输层的TCP和UDP,为了识别自己所传输的数据部...

2018-07-06 16:33:49 1373

原创 TCP/IP_IP协议辅助协议

TCP/IP_IP协议辅助IP让最终目标主机收到数据包,但是这一过程中仅仅有IP是无法实现通信的,必须还有能够解析主机名称和MAC地址的功能,以及数据包在发送过程中异常处理的功能。此外,还会涉及IP必不可少的其他功能。这篇文章将介绍相关的辅助协议。DNSTCP/IP网络中要求每一个互连的计算机都具有唯一的IP地址,并且基于这个IP地址进行通信。然而,因为IP地址是一串数据序列组成,并不...

2018-07-06 11:25:35 798

原创 TCP/IP_IP协议

TCP/IP_IP协议网络层主要是由IP和ICMP两个协议组成,在这篇文章主要说明IP协议。网络层的主要作用是“实现终端节点之间的通信”。也可以叫做“点对点通信”。数据链路层的主要作用是互联同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输。 网络层与数据链路层的关系: ...

2018-07-05 15:41:36 759

原创 TCP/IP_数据链路层

TCP/IP_数据链路层本篇文章介绍网络的基本内容数据链路层,通过介绍TCP/IP具体的数据链路以太网、无线局域网、PPP等来说明。数据链路相关技术MAC地址 MAC地址用于识别数据链路中互连的节点。 共享介质型网络 共享介质型网络指由多个设备共享一个通信介质的一种网络。在这种方式下,设备之间使用同一个载波信道进行发送和接收。为此,基本上采用半双工通信方式,因此有必要对介质进...

2018-07-04 19:41:47 639

原创 字符串的排列与组合

字符串的全排列 题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 分析:对于这个问题可以把字符串分成两个部分,一部分是字符串的第一个字符,另一部分是剩余部分。即就是两个步骤,1:求后面n-1个字符的全排列;2、把第一个字符与后面字符分别交换。而求后面n-1个字符的...

2018-07-04 15:13:08 322

原创 TCP/IP_网络基础知识

TCP/IP_网络基础知识

2018-07-03 20:40:01 1348

原创 链表问题_删除排序链表中的重复节点

题目:在一个排序链表中删除其中重复的节点,重复的一个不留。 分析:若我们定义的函数无返回值则应该讲函数的参数定义成**phead,因为头结点也可能被删除,具体的实现如下: struct ListNode { int val; struct ListNode *next; ListNode(int x) : val...

2018-07-03 11:25:23 383

原创 链表问题_链表中环的入口节点

题目:一个链表中包含环路,求链表的入口节点。 分析:根据求链表中倒数第K个节点的方法,这个问题可以分为两个步骤:1、判断链表中的节点个数记为K,对于这个可以采用一快一慢两个指针,当两个指针相遇时,则相遇的节点就在环中,然后根据此节点就可以求出环的大小。2、由于已经知道环的个数,就可以使用类似于求链表倒数第K个节点的方法,使用两个指针,他们之间的间隔为K,两个同时在链表上移动,当他们相遇时的节点,...

2018-07-03 09:34:45 245

原创 串匹配算法_KMP、BM、BF效率总览

串匹配算法_KMP、BM、BF效率总览在针对串匹配问题中,依次介绍了蛮力、KMP、基于BC表、综合BC表和GS表等四种算法,这里对其复杂度来做一个总结。1、在BF算法中,知道在最好的情况下蛮力算法的时间复杂度为O(n+m),最坏的情况下时间复杂度为O(n*m),分别如下图所示两种情况: 2、在KMP算法中,知道总体花费的时间为O(n+m)。其中next表的构造花费O(m)的时间。...

2018-07-02 20:17:55 1396

原创 串匹配算法_BM

BM算法KMP算法的思路可以概括为:当前比对一旦失配,即利用此前的比对所提取的信息,尽可能长距离的移动模式串。其精妙之处在于,无需显示地反复保存或更新比对的历史,而是独立于具体的文本串,事先根据模式串预测出所有可能出现的适配情况,并将这些信息浓缩成一张next表。 在这里介绍的BM算法与KMP算法类似,区别仅仅在于预测和利用“历史”信息的具体策略与方法。BM算法中,模式串P与文本串T的位置依...

2018-07-02 19:41:04 888

原创 串匹配算法_KMP

串匹配串匹配问题即是:如何在字符串数据中,检测和提取以字符串形式给出的某一局部特征一般的,即:对基于同一字符表的任何文本串T(|T|=n)和模式串P(|P|=m): 判定T中是否存在某一子串与P相同 若存在(匹配),则报告该子串在T中的起始位置测评标准及策略 如何对任一串匹配算法的性能作出客观的测量和评估,多数人首先会想到采用算法性能的常规口径和策略:以时...

2018-07-01 17:14:56 556

原创 链表问题_两个链表的第一个公共节点

题目:输入两个链表,找出它们的第一个公共结点 分析:对于这个问题有三种思路: 1、蛮力算法,当遍历到一个节点时,就在另外一个链表上顺序遍历,并且判断是否相等,如果想等就是第一个重合的节点,对于两个长度分别为m和n的链表,所需要的时间为O(m*n)。实现如下: struct ListNode { int val; struct ListNode *next;...

2018-06-29 15:55:08 261 1

原创 链表问题_复杂链表的复制

题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空...

2018-06-29 14:54:49 189

原创 链表问题_合并两个排序链表

题目:输入两个递增排序的链表,合并这两个排序链表,使得合并之后的链表仍然使递增排序的。 分析:即是归并排序中的归并操作,有两种具体的实现:1、使用递归的方法,2、迭代版本,逐个合并链表。实现如下:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : va...

2018-06-27 19:31:17 123

原创 链表问题_反转链表

题目:输入一个链表的头结点,翻转该链表之后输出头结点。 分析:翻转一个链表即翻转其连接方向,定义三个指针,pnode表示当前遍历到的节点;p_pre为pnode的前驱,p_succ为pnode的后继,之前的连接方向为p_pre->pnode->p_succ,将其改为p_pre<-pnode<-p_succ即可,在实现的过程中要注意代码的鲁棒性。实现如下: Lis...

2018-06-27 17:06:50 126

原创 链表问题_链表中倒数第K个节点

题目:输入一个链表,输出该链表中倒数第k个节点。尾节点为倒数第一个节点。 分析:可以采用两个指针,记为start和end,先让end在链表上走k-1步,然后两个节点同时开始走,当end到达尾节点时,start即为倒数第k个节点。这相当于做了一个长度为k的标尺一样,虽然很简单,但是在涉及到指针的操作时,一定要注意代码的鲁棒性,具体如下:/*struct ListNode { in...

2018-06-27 16:27:47 153

原创 链表问题_在O(1)时间内删除链表节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该结点。 分析:对于删除单向链表中的节点,通常的思路:删除节点I之前,先从链表的头结点开始遍历到I前面的一个节点h,把h的next节点指向I的下一个节点j,再删除节点I,但是这样做的复杂度为O(n)。这里采用另外一种思路,把节点j的内容复制覆盖节点I,接下来再把节点I的next指向j的下一个节点,之后再删除节点j。...

2018-06-27 15:53:33 276

原创 链表问题_从尾到头打印链表

题目:输入一个链表的头节点,从尾到头打印链表。 分析:有两种思路,1、借助栈,从头到尾遍历链表将值存入栈中,然后输出栈中的值即可。2、可以使用递归,递归的本质就是一个栈结构,但是当链表很长的时候,会导致函数调用的层级很深,从而导致函数调用栈溢出,这里仅给出解法。/*解法1*//*** struct ListNode {* int val;* stru...

2018-06-27 15:02:22 111

原创 数据结构_kd-树

kd-树一维范围查询 如下图所示,许多实际应用问题,都可归结为如下形式的查询:给定直线L上的点集P={P0,….,Pn-1},对于任一区间R=[x1,x2],P中哪些点落在其中。 上述这种查找问题统称为一维范围查询,对于这种问题的解决方法,我们通常有以下几种方法解决: 1、蛮力算法 可以直接遍历点集P,并且逐个的花费O(1)时间判断各点是否落在区间R内,这样总体的运行时间为O(n)...

2018-06-26 15:38:53 479

原创 数据结构_红黑树

红黑树红黑树也是属于一种BBST。在之前介绍的伸展树中,虽然实现简单,分摊复杂度低,但是最坏情况下的操作需要O(n)时间,无法适用于对单次效率敏感的场合。相反的,之前介绍的AVL树尽管可以保证最坏情况下的单次操作,但是要在节点中嵌入平衡因子等标识;更重要的是,删除操作之后可能需要多达O(logn)次旋转。红黑树是针对后一不足的改进。通过为节点指定颜色,合理动态调整。它可以保证:在每一次插入或删...

2018-06-25 20:58:52 891

原创 数据结构_B-树

B-树从严格意义上讲B-数并不是二分查找树,在物理上B-树的每个节点可以包含多个分支,但是从逻辑上讲,它等同于二分查找树。为了了解B-树,首先要了解以下几个方面的内容。1、越来越小的内存 事实上:内存容量的增长速度时要远远小于问题数据规模的增长速度,例如: 典型的数据库规模 / 内存容量 1980:10MB / 1MB = 10 2000:1TB / 1GB =...

2018-06-25 14:40:23 1592

原创 数据结构_平衡二叉搜索树(伸展树 splay tree)

splay tree与之前介绍的AVL树一样,伸展树也是平衡二叉搜索树的一种形式。首先,鉴于数据访问的局部性在实际应用中普遍存在,将按照“最常用者优先”的启发策略,引入并且实现伸展树。尽管最坏的情况下单次操作需要O(n)时间,但其分摊意义仍然在O(log(n))以内。并且相比于AVL树,伸展树无需时刻都严格的保持全树的平衡。局部性 数据的局部性:刚刚被访问过的元素,极有可能很快地在此被...

2018-06-23 15:49:50 779

原创 数据结构_平衡二叉搜索树(AVL树)

平衡二叉搜索树在二叉搜索树中,已经知道search、insert和remove等主要接口的运行时间均正比于树的高度。但是在最坏的情况下,二叉搜索树可能退化成列表,此时查找的效率会降至O(n)。因此,通常通过控制树高,来控制最坏情况下的时间复杂度。 对于节点数目固定的BST,越是平衡,最坏情况下的查找速度越快,如下图所示: 为了理解平衡二叉树,我们首先要理解几个主要概念,理想平衡与适度平...

2018-06-21 21:22:36 8646

原创 数据结构_二叉搜索树

二叉搜索树 所谓的查找,指从一组数据对象中找出符合特定条件者。其中的数据对象,统一的表示和实现为词条(entry)的形式;不同的数据项之间,依照各自的关键码(key)彼此区分。 一般而言词条应以如下形式: template <typename K, typename V> struct Entry { //词条模板类 K key; V value; //关键码、数值...

2018-06-21 10:46:12 449

原创 数据结构_二叉树的遍历

二叉树的遍历树的遍历即是:按照某种次序访问树中各个节点,并且每个节点恰好被访问一次。 遍历的方式有以下几种: 先序:V | L | R 中序:L | V | R 后序:L | R | V 层次/广度优先:自上而下,先左后右。先序遍历 递归版本:/*struct TreeNode { int val; struct TreeNode *left; ...

2018-06-20 15:49:46 509

原创 数据结构_树的定义及存储结构

树树的特点:不是简单的线性结构,但在确定某种次序之后,具有线性特征。对于树,它集成vector和list的优点,既可以快速插入、删除也可以快速查找。 递归定义 树是特殊的图T=(V,E),节点数|V|=n ,边数|E|=e。指定任一节点r属于V作为根后,T即称作有根树。 如: 若指定r=root(T),则 1、称ri 为 r 的孩子;称 r 为 ri 的父亲;r1, r2, ...

2018-06-19 16:36:27 919

原创 二叉树应用_二叉搜索树的第K个节点

题目:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 分析:进行中序遍历,中序遍历序列的数值是递增排序的。 /*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...

2018-06-15 16:15:46 341

原创 二叉树应用_序列化二叉树

题目:实现两个函数,实现序列化和反序列化二叉树。 分析:我们可以从前序遍历和中序遍历序列构造出一个二叉树。我们可以先把一颗二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后进行构造。但是这个思路有两个缺点,一个是要求两个序列中所有数据都读出后才能开始反序列化,另外要求不能有数值重复的节点。 我们可以根据前序遍历的顺序来序列化二叉树,前序遍历是从根节点开始的。当在遍历二叉树碰到NULL指针时...

2018-06-15 10:59:05 120

空空如也

空空如也

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

TA关注的人

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