自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 排序算法(七)---- 非比较排序

一.计数排序顾名思义,通过记录原序列中的每个数据出现的次数,然后将其保存在辅助空间的对应位置(位置=当前数据-最小数据),通过分析辅助空间和原序列,可以将原序列变成有序序列算法如下:void CountSort(int arr[],int size){ int i=0; int max=arr[0]; int min=arr[0];

2017-09-04 22:36:51 473

原创 排序算法(六)---- 归并排序

对于归并排序,与快速排序一样,巧妙的应用了分治算法的核心思想,它将整个序列分成若干组子序列,对这些子序列进行排序后,在一步一步进行合并有序子序列,从而使得整个序列达到有序。但针对于归并排序,有着两种不同的排序方式,一是通过整个序列进行着手,将这个序列进行一步一步的划分,自顶向下进行处理,主要步骤包括序列划分,子序列排序,以及合并,而这一方法可以通过递归来实现;与之相对的就是另外一种方式,自底向

2017-09-04 22:31:35 425

原创 排序算法(五)---- 快速排序

对于快速排序,与冒泡排序一样属于交换排序,但是快速排序是在冒泡排序的基础之上的优化,由于冒泡排序需要进行多次的交换,从而导致冒泡排序的效率相对较低,而快速排序应用了分治这一算法思想,通过设定基准值,用序列中的数据与这一基准值进行比较,从而达到将所有大于基准值的数据放到基准值一边,所有小于基准值的数据放到基准值另一边这一目的。从而将原序列以基准值为界,分成大于基准值与小于基准值这两部分,然后对于这分割后的两部分,分别进行之前的操作

2017-09-01 10:06:33 341

原创 排序算法(四)---- 堆排序

利用最小堆/最大堆的性质,将数组中所有元素之间的关系构建成最大堆/最小堆,通过将堆顶元素(即arr[0])与末尾元素进行交换,此时尾部序列即为有序(最大堆为升序,最小堆为降序),然后对前面的元素(排除已进行过排序的末尾元素)重新构建最大堆/最小堆,因为堆顶元素与末尾元素进行了交换,很有可能造成最大堆/最小堆的性质遭到破坏,而由于只有堆顶元素发生了变化,所以这里可以采用从堆顶向下调整的方法,重新构建

2017-08-31 14:38:18 308

原创 排序算法(三)---- 选择排序

基本思想:在序列中找到最大(或最小)的值,将它放到序列区间的起始位置,随即缩小序列区间,进行重复操作,直到序列区间中没有数据注意选择排序与冒泡排序的区别:冒泡排序是交换两个相邻顺序与所求顺序相反的元素,从而将当前序列中的最大(最小)元素放到合适位置;而选择排序则是记录下当前序列中的最大(最小)元素,将其与合适位置的元素进行一次交换,使得最大(最小)元素放在合适位置选择排序的时间复杂度为O(

2017-08-31 14:36:28 217

原创 排序算法(二)---- 希尔排序

希尔排序又叫缩小增量排序,在直接插入排序的基础上,给定了一个增量gap,作为对给定序列的区间划分依据,如上gap=3,将原序列分为{5,4,1},{2,7,3},{9,6,8}三组数据,而对它们分别进行直接插入排序,在对每组完成直接插入排序之后,随即对增量进行缩小,直到gap=1时,此时在完成对应的直接插入排序之后,整个序列随即有序希尔排序的时间复杂度大致为O(N^1.25)~O(1.6N^1

2017-08-31 14:34:42 255

原创 排序算法(一)---- 直接插入排序

基本思想:取序列中的第i个元素,(在取到第i个元素之前,第i个元素前面的序列已经经过排序,成为有序序列,第i个元素及其之后的序列即为无序序列),将第i个元素与之前的有序序列中的元素依次进行比较,并将其插入到合适的位置,由此对原序列中的每一个元素进行上述操作,即可得到有序序列因为在获取待插入元素的时候要对数组进行一次遍历,而每遍历到一个元素又要将其与之前的有序序列中的元素进行比较,又要进行一次遍

2017-08-31 14:27:28 269

原创 终端,作业控制,守护进程

进程组:每个进程有唯一一个进程组ID(PGID),而每一个进程组都有一个组长进程(即进程组ID对应的进程),而组长进程可以创建一个进程组,对于一个进程组而言,只要这个进程组中有一个进程存在,那这个进程组就存在,与组长进程是否存在并没有关系作业:Shell分前后台控制的不是进程,而是进程组/作业,一个前台作业可以由多个进程组成,而一个后台作业同样也是如此,但对于Shell来说,只能同时运行一个前

2017-08-31 14:24:03 238

原创 一个特殊的信号---- SIGCHILD

这里重点提一下SIGCHLD信号(17号信号),对于父进程而言,一般要对它的子进程进行等待,以防止子进程变为僵尸进程,而导致内存泄漏问题,但是对于父进程的等待方式存在两种:阻塞式等待和非阻塞式等待,可以通过wait和waitpid这两个系统调用来实现,对于父进程而言,阻塞式等待让父进程停下自己手头上的事情,专心的等待子进程退出,这严重影响了父进程的工作;而对于非阻塞式等待,父进程每隔一段时间都要轮

2017-08-31 14:21:01 6477 1

原创 浅谈Linux下信号

一.前台进程与后台进程前台进程在shell下运行时(如:./a.out),shell无法运行其他的进程;后台进程在shell下运行时(如:./a.out &),shell可以运行其他进程Ctrl+C,Ctrl+Z等组合键仅可以对前台进程起作用,对于后台进程无效(本质上组合键控制进程均会被解释成信号)ps aux | grep -ER './test'这条命令可以用来查看当前运行的进程(

2017-08-31 14:19:06 214

原创 进程间通信(四)---- 共享内存

共享内存机制是IPC机制中最快的通信方式,允许不同的进程访问同一块物理内存,通过这块内存进行进程间通信,进程的地址空间中有一部分称为共享区,而共享内存机制则是利用了这一部分的虚拟地址,通过使用共享区的虚拟地址,通过页表,MMU进行映射到某一物理内存上,而这块物理内存也通过同样的方法,被另一个进程所看到,这样就能进行进程间通信由于共享内存机制可以直接通过正常的访问物理内存的方式(地址空间上的虚拟

2017-08-31 14:09:25 201

原创 进程间通信(三)---- 信号量

信号量的本质是一种数据操作锁,本身不具有数据交换的功能,而是通过控制其他的共享资源(如共享内存)来实现进程间通信,其本身只是一种外部资源的标识,负责保证进程间通信的同步与互斥机制生命周期不随进程,随内核(与消息队列类似),也存在两个命令ipcs -s(查看系统中的信号量);ipcrm -s semid(释放指定信号量)所谓同步与互斥机制,互斥表示对于某一公共资源(也叫临界资源),在

2017-08-31 14:07:11 316

原创 进程间通信(二)----消息队列

首先,什么是消息队列?消息队列是System V下的IPC通信机制,消息队列提供了一种从一个进程向另一个进程发送一个具有类型的数据块的方法,我们可以通过消息队列避免管道的同步和阻塞问题,但是同管道一样,消息队列也存在长度的限制,每个数据块的大小具有限制,同时每个消息队列的长度也存在限制对于IPC的通信机制(包括消息队列,共享内存,信号量),内核都为其维护了一个IPC对象数据结构struct i

2017-08-31 14:05:04 185

原创 最长回文字符串问题

回文字符串是笔试中常考的题,下面给出回文字符串的一个经典题型:求出一个字符串当中的最长回文字符串长度1.最基本的解法对于这个问题,我们考虑到回文字符串的性质,即回文字符串正读,反读相同,左右对称,这样一来,最基本的方法就是得到所求字符串的所有子串,并判断它们是否是左右对称,方法如下:bool isAym(char *cbegin, char *cend){

2017-07-28 19:02:28 297

原创 进程间通信(一)-----管道

进程间通信的本质:让不同的进程看到一份公共的资源(由于进程之间相互独立,有各自不同的地址空间,所以对于一个进程中的数据,在其他进程中是看不到的,虽然这在一定程度上保证了进程间的独立性,但若两个进程之间想要进行通信,则必须借助内核,在内核中开辟一块缓冲区,两个进程均能看到这块缓冲区,让一个进程将数据从进程的地址空间拷到内核缓冲区中,再由另外一个进程从内核缓冲区中读数据,放到自己的地址空间当中)下

2017-07-18 23:45:18 361

原创 TCP/IP协议下三层协议(二)----传输层协议

1.UDP用户数据报协议首先,说明UDP的几个主要特点:①UDP是无连接的;②UDP尽最大努力交付,但不保证数据可靠性;③UDP是面向报文的;④UDP没有拥塞控制(网络出现拥塞状况并不会导致源主机的发送速率降低);⑤UDP支持一对一,一对多,多对一与多对多的交互通信;⑥首部开销小;UDP的数据段格式很简单,它的报头是定长(因此UDP协议报头信息中无需加入

2017-07-04 11:50:12 5497

原创 TCP/IP下三层协议----网络接口层与网络层

一.网络接口层(链路层):①以太网帧格式:其中目的地址和源地址均是网卡地址(MAC地址),对于每个设备都是唯一的,ifconfig ---->HWaddr即是我们的MAC地址;而对于类型字段,可以有三种值:0800---IP,0806----ARP,8035----RARP;而对于帧末尾则是我们的CRC校验码以太网帧的数据长度最小为46字节,最大为1500字节,也就是封装上

2017-07-04 11:43:10 7971

原创 网络基础总结

TCP/IP协议是一组协议,这些协议组成TCP/IP协议簇,TCP/IP协议自上到下,分四层:应用层,传输层,网络层,网络接口层(链路层)后三层由操作系统内核完成,用于处理通信细节;对于应用层则是由用户进程完成,处理应用进程细节对于不同的协议层,对数据包有不同的称谓:传输层----段,网络层----数据报,网络接口层(链路层)----帧对于OSI协议七层模型,从上到下分别为

2017-07-04 11:25:46 286

原创 路由算法与收敛路由原理

当两台主机在不同的局域网内,它们之间要进行通信,必然要经过路由器,而当一个数据包达到路由器时,路由器会获取这个数据包的目的IP地址,而通过查看路由器的路由表,路由器会判断将这个数据包送往何处首先对于路由表,当中的每一行表示一个路由条目,我们的路由表是由若干个路由条目组成,每个路由条目当中包含了目的网络地址Destination,下一跳地址Gateway,子网掩码Genmask,Flags(Fl

2017-06-30 17:52:12 7770

原创 NAT技术与代理服务器

一.NAT技术NAT技术也叫网络地址转换技术,是一种私有地址转换成合法IP地址的技术,要了解他之前,首先得了解什么是私有地址,什么是合法IP地址,其次为什么要引入这样的技术。①私有地址和合法IP地址如果组建一个局域网,其中的IP地址仅用于局域网内部通信,而不能直接连到Internet外网上的话,那么这些IP地址就是局域网的私有IP地址,理论上所有IP地址均可作为私有IP地址,但是RFC

2017-06-28 16:29:36 577

原创 生产者消费者模型

对于生产者消费者模型,必须满足以下三点:3种关系:生产者与生产者之间互斥,消费者与消费者之间互斥,生产者与消费者之间互斥且同步2种角色:生产者,消费者1种交易场所

2017-06-18 17:33:31 313

原创 线程互斥锁与死锁

在多线程编程中,由于线程间共享地址空间与大部分资源,而当多个线程同时访问共享数据的时候,就很有可能会发生冲突导致错误。如下对于一个共享的全局变量进行累加,线程1与线程2均分别做累加5000次操作:#include#includeint g_a=0;void* funtest(void* arg){ int i=0; for(;i<5000;i++) { int t

2017-06-15 22:05:15 790 1

原创 Linux下线程理解

线程,在操作系统当中这是一个相当重要的概念,线程的存在是为了解决在一个进程当中执行多个执行分支的任务,举一个很简单的例子:当你在用某个下载软件的时候,相当于你在运行该进程,而你在通过该软件进行下载时,很明显你在同一时间并不是只能进行一个下载任务,而且你在下载的时候,你可以使用键盘,鼠标来执行其他任务,而这些任务都是在同一个进程中在跑,这就是多线程的强大之处。

2017-06-10 18:17:31 284

原创 模拟实现shell---“支持重定向功能”

首先,在开始本篇博文之前,我们先得了解什么是shell?我们都知道用户是通过操作系统来对我们的硬件或者软件进行操作的,但是我们平时在使用计算机的时候并没有直接与操作系统进行交流,具体关于操作系统的管理软硬件的层次结构参考前面的文件:http://blog.csdn.net/chenkaixin_1024/article/details/70158065而在Linux下我们会通常通过终端输入

2017-05-29 22:52:38 849

原创 AVL树的旋转操作

首先,在讨论AVL树之前,我们得明白一点,那就是为什么得有AVL树?AVL树与二叉搜索树一样都是用于搜索的二叉树,也可以这么说AVL树是特殊的二叉搜索树,它与二叉搜索树的主要区别在于AVL树中给定了平衡因子(左右子树的高度差),而且明确规定,平衡因子最大不能超过1,最小不能小于-1,因此我们的AVL树中左右子树的高度差只能为0,1,-1,也就是说不会出现一段较长的单支的情况,而对于二叉搜索树而言,单支树的情况完全可能出现。而对于单支树这种情况,我们对于其的搜索就相当于对一个单链表进行搜索,时间复杂度由原

2017-05-23 22:35:06 278

原创 二叉搜索树的实现(查找,插入,删除的递归与非递归)

BST定义:二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值3、它的左右子树也分别为二叉搜索树

2017-05-16 23:16:46 520

原创 二叉树的几道典型例题

1.求二叉树的高度int _GetTreeHight(Node* pRoot) { if(pRoot==NULL) return 0; if(pRoot->_pLeft==NULL&&pRoot->_pRight==NULL) return 1; int left=_GetTreeHight(pRoot->_pLeft)+1; int right=_GetTr

2017-05-02 21:35:33 3089

原创 迷宫算法

迷宫算法的核心思想是对自己当前的位置的前后左右进行判断,判断是否为通路,如果是通路就可以朝对应的方向走,而走到下一步也是进行相同的判断,但对于前后左右均不通的话,那就得往回走(这里我们将走过的路进行标记,防止在判断的时候与未走过的混淆影响判断)对于迷宫地图,我们可以给出一个二维数组,当中的每一个元素代表二维数组中的每一个位置,1----通路,0---障碍物,2----已走过的路,3----已走过并判断出是死路的路径

2017-04-27 11:31:39 2567

原创 递归实现全排列

问题:对一个数组,从第n个数开始对其后面的数进行全排列;思路:我们以1,2,3,4,5,这组数为例,令n=2,也就是对3,4,5进行全排列,而对于这三个数进行全排列,我们可以利用swap这个方法,首先考虑用第一个数3与后面的两个数分别进行交换,得到4,3,5和5,4,3;然后可以对1,2,3的后两位进行交换,得到1,3,2;对于4,3,5和5,4,3也同样交换后两位数,这样就得到了4,5,3,

2017-04-25 21:38:51 1009

原创 C++模板类中的友元声明

对于在一个类中声明一个函数或者一个类的友元,我们应该是十分熟悉了,但是这两天在做题的时候遇到一个问题,就是如何在一个类模板中声明一个模板函数与我们的模板类的友元关系?

2017-04-25 16:13:47 1933 1

原创 递归与尾递归

对于递归,我们都不陌生,简单的来说就是一个函数直接或间接的调用自己,一般来说,我们在使用递归算法的时候都是有条件的:1.首先问题的规模是在不断缩小的,我们可以通过解决子问题从而来解决我们的原问题,而且子问题和原问题的解决方法都是一样的;2.我们使用递归算法,在问题不断演化的过程中,必须有一种情况我们是能够解决,也就是必须得有我们的递归出口

2017-04-20 14:23:23 334

原创 关于时间复杂度与空间复杂度

对于评价一个算法的好坏,我们通常以时间复杂度与空间复杂度来衡量。时间复杂度:算法中执行基本操作语句的总次数。空间复杂度:算法中创建对象的个数。

2017-04-19 16:16:52 469

原创 几道典型的递归算法例题

1.求前N个自然数之和int Sum(int n){ if(n==1) return 1; return n+Sum(n-1);}2.求N的阶乘int Factorial(int n){ if(n==1) return 1; return n*Factorial(n-1);}3.逆序打印单链表struct Node{ Node* _next; int

2017-04-16 22:39:10 2796

原创 浅谈二分查找

对于二分查找,大多数人都是模模糊糊对它有个印象,但具体写起代码来,又是各种问题。首先,来看二分查找这个算法的基本方法:1.在一个有序的连续数组当中(可以是升序,也可以是降序,本文均以升序为例)查找一个数,将这个数组的中间元素和给定数比较,若刚好相等则就找到了这个数,若大于给定数,则向这个数组的较低序列查找,反之则向这个数组的较高序列查找。2.再拿着这个数组的较低或较高序列进行上一步的查

2017-04-14 22:50:54 267

转载 关于系统调用fork()

一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同

2017-04-13 17:51:36 527

转载 关于Linux操作系统层次结构分析

本文转自http://www.jb51.net/LINUXjishu/214104.html首先来看一张图(这是Linux操作系统的大致层次结构):最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等。硬件是物质基础,而应用提供服务。但在两者之间,还要经过一番周折。 还记得Linux启动。Linux首先启动内核

2017-04-13 14:59:58 7483

原创 Linux下进程及其描述task_struct

在谈进程之前,我们先说一说程序:在Linux下,我们想生成一个C程序,必定要通过预处理,编译,汇编,链接这四步,才能得到一个可执行文件也就是我们的C程序,而对于我们操作系统而言,要运行一个磁盘上保存的二进制可执行文件,要进行哪些操作呢?

2017-04-13 14:43:45 372

原创 浅谈shared_ptr与循环引用问题

前面对于智能指针已经大致的提过了,但是关于shared_ptr上一篇文章没有仔细分析,这里把它单独拎出来理一理。前面已经提过由于scoped_ptr(unique_ptr)无法解决让多个对象管理同一块空间的情况,标准库中又追加引用了shared_ptr,而我们的shared_ptr是参考了string类当中的引用计数这个巧妙的方法来解决多个对象管理同一块空间的问题的,而且除此之外我们这里的模拟实现还要考虑跟多一点,就是加入删除器的部分,以适用不同的指针。

2017-04-07 12:21:39 5968 1

原创 浅谈智能指针

智能指针是一个类,用于封装一个普通指针的类,并且在这个类的构造函数中将这个普通指针初始化,并且在析构函数中对这个普通指针进行释放。

2017-04-05 22:28:57 740 3

原创 Linux下粘滞位

我们已经知道对于一个文件,存在文件拥有者,文件所属组以及其他用户,而且这三者对于文件而言,都有可能有读,写,可执行三种权限,而且在Linux下,这些权限也只是常见的基本权限,除此之外,还存在特殊权限。

2017-03-30 13:04:40 345

空空如也

空空如也

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

TA关注的人

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