自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 文件压缩(小项目)

Huffman树,又称为最优二叉树,是加权路径最短的二叉树。Huffman树的构建利用到贪心算法。【贪心算法】      贪心算法是指在问题求解时,总是做出当前最好的选择,也就是说贪心算法做出的不一定是全局的最优解,但是某种意义上的局部最优解。贪心算法不一定能够求得整体的最优解。使用贪心算法构建哈夫曼树:/*主要原理:将每个字符与哈夫曼编码相对应

2016-08-10 16:43:22 514

原创 ‘信号’基本概念总结

生活中有许许多多的信号,能够反映给人类,人类能够产生相应的行为。当我们使用键盘给计算机一个信号,计算机也会相应的产生一系列的行为。在linux系统中,使用kill -l命令能够查看系统中所有的信号如下:650) this.width=650;" title="无标题.png" alt="wKioL1eXWkjAIKI3AACLfuXkW8I273.png" src="http://s5.51cto

2016-08-09 21:44:14 516

原创 数据结构—各类‘排序算法’实现(上)

数据结构中的排序算法分为比较排序,非比较排序。比较排序有插入排序、选择排序、交换排序、归并排序,非比较排序有计数排序、基数排序。下面是排序的具体分类:650) this.width=650;" width="651" height="364" title="无标题.png" style="width:651px;height:281px;" src="http://s4.51cto.com/wyf

2016-08-09 21:43:26 425

原创 大数运算(小项目)

大数运算我们都知道变量都有一个数据类型,每个数据类型都有自己所表示的范围,若当数据超过这个类型所表示的范围,就会出现错误,我们称这种现象叫做“溢出”。当然这样就要求每个变量的地址中所存储的数据不能够超过数据类型所表示的范围。整形int的表示范围是-128~127,数据类型表示范围最大的就属long long型,表示范围为:0x7FFFFFFFFFFFFFFF~0x8000000000000000。

2016-08-09 21:43:06 285

原创 智能指针(模拟实现AutoPtr、ScopedPtr、SharedPtr)

模拟实现AutoPtr、ScopedPtr、SharedPtr        智能指针实际上就是能够智能化的管理动态开辟空间的内存释放问题,C++中引入智能指针,很大一方面是当我们在动态开辟空间时,由于一些疏忽,或者说是对于一些代码,执行的顺序不是我们预期能够想到的,导致一些内存泄露的问题,使得程序健壮性不够,可维护性降低。       智能指针的基本特点:              1)智能指针

2016-08-09 21:42:43 454

原创 管道、消息队列、共享内存之间的区别与联系

管道和消息队列的区别管道(PIPE)     管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息的流水线。管道分为

2016-08-30 16:40:03 16234 2

原创 进程间通信——消息队列

前面的两篇博客分别介绍了两种进程间通信的方式:匿名管道、命名管道。下面在介绍一种方式——消息队列。1.基本概念      消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为是一个类型,接收者进程接收的数据块可以有不同的类型值。并且消息队列是随内核的,也就是说进程已经退出了,如果不自主释放资源,消息队列是会悄无声息的存在着。所以较管道来说,消息队列的生命

2016-08-12 16:49:43 430

原创 进程间通信——命名管道

前面介绍的管道属于匿名管道,只能够用于有血缘关系的进程间通信,比如父子进程之间的通信。下面主要讨论另一种管道——命名管道。    在命名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过F

2016-08-11 21:36:52 753

原创 进程等待&程序替换

一个进程在终止时会关闭所有的文件描述符,释放在用户空间分配出来的内存,但它的PCB还保留着,而且内核中还保存着一些信息,如果是正常终止,则保存着退出状态,如果是异常终止,则保存着导致该进程终止信号是哪个,。这个进程的父进程可以调用wait和waitpid获取这些信息,然后彻底清除这个进程。     一个进程的父进程是shell进程,当它终止时shell就会调用wait或者waitpid得到它的

2016-08-10 18:50:29 397

原创 C/C++的小知识

1.static关键字的作用和使用场景?    。static的作用——隐藏,变量所有未加static前缀的全局变量和函数都具有全局可见性,假设有两个文件,其中一个文件中定义全局变量a,int a = 10;如果在另一个文件中声明extern int a;则a = 10,在这个文件中可以对其进行使用。但是如果定义的全局变量前加上static,即就是:static int a = 1

2016-08-10 16:33:27 345

原创 ‘生产者-消费者’模型与‘读-写者’模型

★生产者-消费者模型      首先,我们先分析一下生产者与消费者模型:生产者与消费者是模型中不可缺少的2种角色,当然模型中肯定需要一个保存数据的场所,能够将生产者生产的数据进行存储。同时,模型必须要满足生产者产生出数据后,消费者才能够进行使用,即就是消费者必须位于生产者之后,当然生产者生产的数据最多将场所放置满就不能继续生产,下面有简单的图示:650) this.width=650;" titl

2016-08-09 21:44:23 617

原创 系统调度—‘线程’

在前面的博文中讨论了进程的相关概念,这里重新引入一下‘线程’的概念。进程有各自独立的地址空间,所以进程间的通信是比较麻烦的,只能借助管道等才能够实现进程间通信。而linux系统中,多个线程共享进程的地址空间(也可以说是进程是一个独占资源的线程),所以线程之间的通信是非常方便的。注:以下只针对linux系统。★进程与线程的比较     在linux系统中,线程和进程之间的区分不是特别明显,但是它们之

2016-08-09 21:44:19 357

原创 进程间通信—‘匿名管道’

进程间通信:每个进程都有各自的地址空间,所以进程之间交换数据就需要通过内核,将数据拷贝到内核中,然后另一个进程进行读取,这种方式成为进程间通信。★创建管道         include          int pipe(int filedes[2]);     其中,参数filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。  

2016-08-09 21:44:17 290

原创 再谈‘进程’

★进程标识符           每个进程都有非负的整形表示唯一的进程ID。下面是一些标识符:               pid:调用进程的ID(获取方式getpid)                 ppid:调用进程的父进程ID(获取方式getppid)                 uid:调用进程的实际用户ID(获取方式getuid)                 euid:调用进程

2016-08-09 21:44:11 250

原创 论‘进程’相关操作

★进程相关概念        (1)进程:是一个能够分配处理器并由处理器执行的,能够携带资源的活动实体。        (2)进程控制块(PCB):每一个进程中都有唯一的一个进程控制块来保存进程的相关信息,实际PCB就是一个task_struct的结构体。具体的见http://10740590.blog.51cto.com/10730590/1785457        (3)进程状态:进程是一个

2016-08-09 21:44:08 255

原创 图—并查集(解决朋友圈问题)

图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构。图可以分为两种,无向图和有向图。★图的定义:650) this.width=650;" width="525" height="243" title="无标题.png" style="width:525px;height:235px;" src="http://s2.51cto.com/wyfs02/M01/84/8B/wKio

2016-08-09 21:44:06 2988

原创 多路平衡树—BTree(B树)

B树属于多叉树,也称多路平衡树。有些地方也将B树称为'B-树',这里‘-’不表示减号。■B树的主要性质:              (1)根节点至少有两个孩子。              (2)每个非根节点为[[M/2], M]个孩子,这里[M/2]表示向上取整。              (3)每个非根节点都有[[M/2], M-1]个关键字,并且以升序排列。              (4)K

2016-08-09 21:44:03 615

原创 二叉搜索树—RBTree(红黑树)

红黑树又称二叉搜索树,它主要是通过红和黑两种颜色(red、black)来标识节点。通过对任何一条从根节点到叶子节点路径上的节点颜色进行约束,红黑树保证最长路径不超过最短路径的两倍,所以说:红黑树是近似于平衡的。■下面是红黑树的主要特点:        (1)红黑树的根节点是黑色的。        (2)红黑树中若一个节点是红色的,则它的两个子节点必须是黑色的。        (3)红黑树中从该节点

2016-08-09 21:44:00 374

原创 平衡搜索树—AVLTree

AVL是平衡搜索二叉树,它的主要特点在于:(1)左子树和右子树的高度差绝对值      下面就是一个AVL树:650) this.width=650;" title="无标题.png" src="http://s5.51cto.com/wyfs02/M00/84/50/wKiom1eMsebCRlryAAAQLcWj2kc433.png" alt="wKiom1eMsebCRlryAAAQLcWj

2016-08-09 21:43:57 223

原创 数据结构--‘搜索二叉树’

‘二叉树’是数据结构中比较重要的一部分,这里主要讨论一下‘搜索二叉树’,针对‘搜索二叉树的插入、删除和查找节点进行分情况讨论,希望能够帮助读者更加的理解搜索二叉树的原理。◆搜索二叉树的性质:      1.每个节点都有一个一个作为搜索依据的关键码,所有节点的关键码都不相同。       2.左子树所有的关键码(key)都小于根节点的关键码(key)。       3.右子树所有的关键码(key)都

2016-08-09 21:43:54 310

原创 几种进程调度算法总结

一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法(FCFS)      先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个

2016-08-09 21:43:51 15760

原创 PCB(进程控制块)--‘task_struct’

在介绍PCB(进程控制块)前,先实现一个‘进度条’,然后根据编写的程序,分析PCB的具体实现原理。‘进度条’的功能是能够在一行中显示出来,同时进度条中有动态的增长变化,能够知道进度条中的比率,同时也需要能够将显示的知道程序是否正在执行。 ◆下面是编写的程序:650) this.width=650;" title="9.png" src="http://s3.51cto.com/wyfs02/M00

2016-08-09 21:43:48 540

原创 linux中的‘make’和‘makefile’

在提及‘make’和‘makefile’之前有必要先理清楚程序编译的过程,在windows操作系统下,我们一般使用的编写程序的软件有vs、vc等,这些都是集成软件,当编写完程序之后,直接点击进行编译和链接,那么编译器是怎样将程序进行编译的呢?◆编译过程(1)预处理阶段         将程序编辑完成之后,在编译之前,编译器会先对程序进行一下预处理,预处理阶段一般的工作是将程序的注释去掉,将头文件在

2016-08-09 21:43:45 325

原创 Centos中‘vim配置’有多强大?

在linux的系统上安装vim编辑器后,发现vim的页面设置还是不太习惯,没有显示的行号,也没有自动的缩进,页面的背景也不是很好看,但是vim编辑器是可以进行配置的,我们可以打造属于自己的vim风格。下面主要讨论一下简单的vim配置问题:1.简单的页面设置(附有效果图)       首先,使用cd /etc命令进入etc的目录下,然后输入vim vimrc 进入vim的配置文件中,查看的效果图如下

2016-08-09 21:43:43 692

原创 怎样在Centos中配置gcc、g++、和gdb?

linux中使用gcc来编译C程序,使用g++来编译C++程序,使用GDB来调试程序,这些使用工具都需要自己进行安装,那么应该怎样配置这些工具呢?        首先,在命令行中输入vi查看一下vim的信息如下:650) this.width=650;" width="397" height="246" title="1.png" style="width:397px;height:232px;"

2016-08-09 21:43:40 1507

原创 面试题—链表的‘部分’翻转

问题:         给出一个单链表(不带头节点)和一个数K,请翻转此单链表?例如:1->2->3->4->5       k = 0;   翻转过后:1->2->3->4->5          1->2->3->4->5       K = 2;   翻转过后:2->1->4->3->5          1->2->3->4->5       K = 10; 翻转过后:5->4->3->2

2016-08-09 21:43:37 2202

原创 C++‘异常’处理机制

在C++的发展过程中,为了实际的需要,引入了异常处理机制。程序中常见的错误:语法错误和运行错误,语法错误一般都是在编译时候发现的,编译器基本上都会报出错误的具体位置,因此这类错误一般都是比较好修改,运行错误一般不容易进行调试,比如说,程序崩溃(一般是由于栈溢出),运行结果错误(一般是算法的逻辑结构有问题)、程序非正常终止等现象。C++中引入异常处理(对运行时出现的差错进行处理),能够极大地提高程序

2016-08-09 21:43:34 299

原创 数据存在?-‘布隆过滤器’

布隆过滤器是一种能够在大量数据中判断数据是否存在的算法。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。在介绍‘布隆过滤器’之前,先介绍一下‘位图’的思想:       这里有这样一个问题:给40亿个没有排序、不重复的无符号整数,如何快速的判断一个数据是否在这40

2016-08-09 21:43:32 328

原创 数据结构—各类‘排序算法’实现(下)

在上一篇博客中,主要是实现各种的排序算法,并针对一些算法进行了优化的处理,下面主要讨论一下非比较排序的算法(计数排序、基数排序),同时并对各种排序算法的性能、时间复杂度、空间复杂度、优缺点、以及适用场景做总结分析。1.计数排序         主要思想:主要是需要统计次数,使用直接定址法,统计最大数和最小数,开辟两个数相差的空间大小,对于重复数据,使用count用来计数,时间复杂度O(N+范围个数

2016-08-09 21:43:29 200

原创 linux系统中‘find’的详细用法

“find”指令是linux系统下较为常用的指令,它常见的用法我们也需要掌握,下面主要是对‘find’指令的常见用法作一下总结,希望能够对其他人有所帮助。        在linux系统下用"ls"指令查看目录如下:                  650) this.width=650;" title="无标题.png" alt="wKioL1c_EEeiBsI_AAAt1uO7Reg362.

2016-08-09 21:43:24 10764

原创 面试题—宏、函数、宏函数、inline函数的区别与联系

--宏和函数:       。宏其实主要是进行字符串的替换(只是进行字符串的替换,不涉及类型参数),而函数是通过参数的传递,参数是有数据类型的。       。编译器在预处理阶段就会进行宏的替换,不会进行参数的检查,而函数调用是将值传递给形参(值传递、引用传递、指针传递),在编译阶段之后,执行函数是会对参数进行检查的。解释:例如:#define  MAX    1000     这个宏在程序的预处

2016-08-09 21:43:21 798

原创 线索化二叉树

二叉树的遍历运算是将二叉树中节点按一定规律线性化的过程,当二叉链表作为存储结构时,只能找到节点的左、右孩子信息,而不能直接得到节点在遍历序列中的前驱和后继信息。线索化二叉树能够解决这样的问题,将二叉链表中的空指针域填上相应节点的遍历前驱或后继节点的地址,而前驱和后继的地址只能在动态的遍历过程中才能得到。可以按照不同的遍历次序进行线索化,先序遍历、遍历过程中的节点的前驱、后继信息保存下来。下面是线索

2016-08-09 21:43:18 218

原创 数据结构--二叉树

“二叉树”作为特殊的树,适合于计算机处理,所以二叉树是研究的重点。我们通常将满足下列的条件称为二叉树,每个节点的度都不大于2,每个节点的孩子节点次序不能任意颠倒。也就是说,一个二叉树中的每个节点只能含有0,1或2个孩子,而且每个孩子有左右孩子之分,位于左边的孩子称为左孩子,位于右边的孩子称为右孩子。说到二叉树:就需要提到“满二叉树”和“完全二叉树”。        满二叉树:在满二叉树中,每层节点

2016-08-09 21:43:15 231

原创 广义表(非线性结构)

广义表        广义表是一种非线性的数据结构,是一种较为简单的数据结构,是线性表的扩展,是一个由n个元素组成的序列。实现广义表主要是利用递归,将其分为子问题来进行解决。下面是一些常见类型的广义表:1)A = ();          常称为“空表”2)B = (a,b);          一般的广义表3)C = (a, b, (c, d))         具有子表的广义表4)D = (a

2016-08-09 21:43:12 3132

原创 面试题——栈与队列的应用(下)

栈与队列的应用       在“栈与队列的应用(上)”中,通过讨论两个队列实现一个栈和两个栈实现一个队列这两个问题,我们对栈和队列也有了更深的了解,下面我们主要来讨论以下两个面试中常常会遇到的问题:1)一个数组实现两个栈2)实现一个栈,能够push、pop、min(求栈中最小的数据)问题一:      对于一个数组,我们如何能够使其成为两个栈?根据数组和栈的特点,我们不难发现可以将数组的两端作为栈

2016-08-09 21:43:09 404

原创 面试题——栈与队列的应用(上)

栈和队列的应用     ”栈和队列“这方面的面试题是挺多的,栈和队列之间的应用也是面试中常常会见到的问题,下面我们就来讨论以下的这两个问题:1)两个栈实现一个队列2)两个队列实现一个栈问题一:       栈最主要的特点就是“先进后出”,而队列的特点是“先进先出”。那么我们应该怎样用两个栈实现一个队列?给定两个栈s1和s2,s1只用于插入数据,当s2和s1中都没有数据时,则队列为空。若s1中有数据

2016-08-09 21:43:04 476

原创 判断出栈顺序的合法性(面试题)

判断出栈顺序的合法性      ”栈“是一种限制性线性表,是将线性表的插入、删除操作限制为仅在表的一端进行,一般将能够插入、删除的一端称为栈顶,表的另一端称为栈底。当栈中没有元素时称为空栈。即就是将每次进栈的元素放在栈顶元素之上而称为新的栈顶,而每次出栈的是当前栈中“最新”的元素。因此就需要对一些出栈顺序的合法性进行判断。这个也是面试会经常问到的问题。◆主要思路:       首先,需要一个栈s,

2016-08-09 21:43:01 1680

原创 对称矩阵、稀疏矩阵的压缩存储

对称矩阵、稀疏矩阵的压缩存储1)对称矩阵的压缩存储       对称矩阵顾名思义就是符合行和列的个数相同,并且矩阵中存储的数据上三角和下三角中对应位置上的元素值是相等的。为了能够减少存储的空间,我们可以只存储上三角矩阵、或者下三角矩阵中的元素,这样就能够极大地节省空间的浪费。下面是对称矩阵的示列:650) this.width=650;" title="无标题.png" src="http://s

2016-08-09 21:42:58 831

原创 迷宫问题(栈)

"迷宫问题(栈)"       “栈”是一种简单的数据结构,它的主要特点就是"先进后出",即就是先压入栈中的数据需要最后出栈。相当于栈是一个杯子,最先放进栈中的东西,只能够最后拿出来。下面对“栈”的特点用图形象的表示出来。        650) this.width=650;" width="570" height="263" title="无标题.png" style="width:361px

2016-08-09 21:42:55 441

原创 菱形继承与菱形虚拟继承

“菱形继承与菱形虚拟继承”             “继承”是c++面向对象语言的特点之一,对于一个类,我们如果想对这个类的功能进行扩充,这就可以通过"继承"的方式重新增添或删除这个类中的某些功能。C++语言支持单继承和多继承,如果不大清楚单继承和多继承的知识,不妨先看一下我以前的博客。正是因为c++支持这两种继承方式,所以才会出现菱形继承的方式。菱形继承顾名思义就是将单继承和多继承进行结合,形成

2016-08-09 21:42:52 583

空空如也

空空如也

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

TA关注的人

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