- 博客(96)
- 收藏
- 关注
原创 文件压缩(小项目)
Huffman树,又称为最优二叉树,是加权路径最短的二叉树。Huffman树的构建利用到贪心算法。【贪心算法】 贪心算法是指在问题求解时,总是做出当前最好的选择,也就是说贪心算法做出的不一定是全局的最优解,但是某种意义上的局部最优解。贪心算法不一定能够求得整体的最优解。使用贪心算法构建哈夫曼树:/*主要原理:将每个字符与哈夫曼编码相对应
2016-08-10 16:43:22 536
原创 ‘信号’基本概念总结
生活中有许许多多的信号,能够反映给人类,人类能够产生相应的行为。当我们使用键盘给计算机一个信号,计算机也会相应的产生一系列的行为。在linux系统中,使用kill -l命令能够查看系统中所有的信号如下:650) this.width=650;" title="无标题.png" alt="wKioL1eXWkjAIKI3AACLfuXkW8I273.png" src="http://s5.51cto
2016-08-09 21:44:14 581
原创 数据结构—各类‘排序算法’实现(上)
数据结构中的排序算法分为比较排序,非比较排序。比较排序有插入排序、选择排序、交换排序、归并排序,非比较排序有计数排序、基数排序。下面是排序的具体分类: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 449
原创 大数运算(小项目)
大数运算我们都知道变量都有一个数据类型,每个数据类型都有自己所表示的范围,若当数据超过这个类型所表示的范围,就会出现错误,我们称这种现象叫做“溢出”。当然这样就要求每个变量的地址中所存储的数据不能够超过数据类型所表示的范围。整形int的表示范围是-128~127,数据类型表示范围最大的就属long long型,表示范围为:0x7FFFFFFFFFFFFFFF~0x8000000000000000。
2016-08-09 21:43:06 311
原创 智能指针(模拟实现AutoPtr、ScopedPtr、SharedPtr)
模拟实现AutoPtr、ScopedPtr、SharedPtr 智能指针实际上就是能够智能化的管理动态开辟空间的内存释放问题,C++中引入智能指针,很大一方面是当我们在动态开辟空间时,由于一些疏忽,或者说是对于一些代码,执行的顺序不是我们预期能够想到的,导致一些内存泄露的问题,使得程序健壮性不够,可维护性降低。 智能指针的基本特点: 1)智能指针
2016-08-09 21:42:43 480
原创 Ruby和Test::Unit单元测试框架
1.Test::Unit Framework框架(1)断言==预期的结果注:包含require 'test/unit'表示可以进行单元测试(测试用例),然后分解成较为底层的形式,测试用例通常包括和某个特定功能或特性相关的所有测试。规定:表示测试的类必须是Test::Unit::TestCase的子类,含有断言的方法名必须以test开头。主要是因为Test::Unit使用反射来查找需要运行的测试。只...
2018-05-15 19:50:14 2982
原创 Win32OLE提供的Excel操作
首先创建excel的WIN32OLE对象:excel= WIN32OLE.new('Excel.Application')1. 打开excel文件: workbook =excel.Workbooks.Open('c:\examples\spreadsheet.xls') 2.创建sheet:workbook = excel.Workbooks.Add() 3.删除sheet:exc...
2018-05-15 19:39:54 3162 1
原创 Ruby中self的作用
Ruby中有一个奇怪的关键词self,这个关键词非常的灵活,在不同的场景下,self代表着不同的含义。 学过C++的同学,可以这样理解,self其中的一个作用类似于C++类中的this指针的使用,表示的就是当前对象或者默认对象,类似于C++中的this指针,但是又不大相同。this和self的区分: 相同点:this指的是当前对象,然后self在类中方法中的含义也指的是
2018-01-29 22:23:33 3372
原创 网络相关协议要点
TCP协议:(3次连接,4次释放) TCP协议是面向连接,可靠的传输层协议,是基于全双工通信,并且是基于字节流的。(1)保证传输数据可靠性机制: a:定时器:当TCP发出一个报文段,会启动一个定时器,等待目的端确认收到报文段,若一段时间之后,没有收到确认信息,就会重传报文段。 b:确认:当TCP收到发自TCP连接另一端的数据,将会发送一个确认信息。
2016-12-15 22:04:59 435
原创 C语言是怎样实现封装、继承、多态的?
我们都知道封装、继承、多态是c++面向对象中的基本特征。C语言是面向过程的语言,自身没有这些特性,那如何使用C语言来模拟C++的封装、继承、多态等面向对象的基本特征。下面就要讨论一下封装、继承、多态等面向对象在c语言中是如何实现的。一、封装 封装:C++中的封装是利用public,protected、private来进行实现的,来隐藏一些不想让别人能够看到的一些东西,只留一些接口给
2016-09-07 10:55:01 3974
原创 管道、消息队列、共享内存之间的区别与联系
管道和消息队列的区别管道(PIPE) 管道通信方式的中间介质是文件,通常称这种文件为管道文件。两个进程利用管道文件进行通信时,一个进程为写进程,另一个进程为读进程。写进程通过写端(发送端)往管道文件中写入信息;读进程通过读端(接收端)从管道文件中读取信息。两个进程协调不断地进行写、读,便会构成双方通过管道传递信息的流水线。管道分为
2016-08-30 16:40:03 16413 2
原创 进程间通信——消息队列
前面的两篇博客分别介绍了两种进程间通信的方式:匿名管道、命名管道。下面在介绍一种方式——消息队列。1.基本概念 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为是一个类型,接收者进程接收的数据块可以有不同的类型值。并且消息队列是随内核的,也就是说进程已经退出了,如果不自主释放资源,消息队列是会悄无声息的存在着。所以较管道来说,消息队列的生命
2016-08-12 16:49:43 480
原创 进程间通信——命名管道
前面介绍的管道属于匿名管道,只能够用于有血缘关系的进程间通信,比如父子进程之间的通信。下面主要讨论另一种管道——命名管道。 在命名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过F
2016-08-11 21:36:52 777
原创 进程等待&程序替换
一个进程在终止时会关闭所有的文件描述符,释放在用户空间分配出来的内存,但它的PCB还保留着,而且内核中还保存着一些信息,如果是正常终止,则保存着退出状态,如果是异常终止,则保存着导致该进程终止信号是哪个,。这个进程的父进程可以调用wait和waitpid获取这些信息,然后彻底清除这个进程。 一个进程的父进程是shell进程,当它终止时shell就会调用wait或者waitpid得到它的
2016-08-10 18:50:29 429
原创 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 365
原创 ‘生产者-消费者’模型与‘读-写者’模型
★生产者-消费者模型 首先,我们先分析一下生产者与消费者模型:生产者与消费者是模型中不可缺少的2种角色,当然模型中肯定需要一个保存数据的场所,能够将生产者生产的数据进行存储。同时,模型必须要满足生产者产生出数据后,消费者才能够进行使用,即就是消费者必须位于生产者之后,当然生产者生产的数据最多将场所放置满就不能继续生产,下面有简单的图示:650) this.width=650;" titl
2016-08-09 21:44:23 663
原创 系统调度—‘线程’
在前面的博文中讨论了进程的相关概念,这里重新引入一下‘线程’的概念。进程有各自独立的地址空间,所以进程间的通信是比较麻烦的,只能借助管道等才能够实现进程间通信。而linux系统中,多个线程共享进程的地址空间(也可以说是进程是一个独占资源的线程),所以线程之间的通信是非常方便的。注:以下只针对linux系统。★进程与线程的比较 在linux系统中,线程和进程之间的区分不是特别明显,但是它们之
2016-08-09 21:44:19 376
原创 进程间通信—‘匿名管道’
进程间通信:每个进程都有各自的地址空间,所以进程之间交换数据就需要通过内核,将数据拷贝到内核中,然后另一个进程进行读取,这种方式成为进程间通信。★创建管道 include int pipe(int filedes[2]); 其中,参数filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。
2016-08-09 21:44:17 311
原创 再谈‘进程’
★进程标识符 每个进程都有非负的整形表示唯一的进程ID。下面是一些标识符: pid:调用进程的ID(获取方式getpid) ppid:调用进程的父进程ID(获取方式getppid) uid:调用进程的实际用户ID(获取方式getuid) euid:调用进程
2016-08-09 21:44:11 278
原创 论‘进程’相关操作
★进程相关概念 (1)进程:是一个能够分配处理器并由处理器执行的,能够携带资源的活动实体。 (2)进程控制块(PCB):每一个进程中都有唯一的一个进程控制块来保存进程的相关信息,实际PCB就是一个task_struct的结构体。具体的见http://10740590.blog.51cto.com/10730590/1785457 (3)进程状态:进程是一个
2016-08-09 21:44:08 274
原创 图—并查集(解决朋友圈问题)
图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构。图可以分为两种,无向图和有向图。★图的定义: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 3021
原创 多路平衡树—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 685
原创 二叉搜索树—RBTree(红黑树)
红黑树又称二叉搜索树,它主要是通过红和黑两种颜色(red、black)来标识节点。通过对任何一条从根节点到叶子节点路径上的节点颜色进行约束,红黑树保证最长路径不超过最短路径的两倍,所以说:红黑树是近似于平衡的。■下面是红黑树的主要特点: (1)红黑树的根节点是黑色的。 (2)红黑树中若一个节点是红色的,则它的两个子节点必须是黑色的。 (3)红黑树中从该节点
2016-08-09 21:44:00 403
原创 平衡搜索树—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 240
原创 数据结构--‘搜索二叉树’
‘二叉树’是数据结构中比较重要的一部分,这里主要讨论一下‘搜索二叉树’,针对‘搜索二叉树的插入、删除和查找节点进行分情况讨论,希望能够帮助读者更加的理解搜索二叉树的原理。◆搜索二叉树的性质: 1.每个节点都有一个一个作为搜索依据的关键码,所有节点的关键码都不相同。 2.左子树所有的关键码(key)都小于根节点的关键码(key)。 3.右子树所有的关键码(key)都
2016-08-09 21:43:54 331
原创 几种进程调度算法总结
一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法(FCFS) 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个
2016-08-09 21:43:51 15890
原创 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 584
原创 linux中的‘make’和‘makefile’
在提及‘make’和‘makefile’之前有必要先理清楚程序编译的过程,在windows操作系统下,我们一般使用的编写程序的软件有vs、vc等,这些都是集成软件,当编写完程序之后,直接点击进行编译和链接,那么编译器是怎样将程序进行编译的呢?◆编译过程(1)预处理阶段 将程序编辑完成之后,在编译之前,编译器会先对程序进行一下预处理,预处理阶段一般的工作是将程序的注释去掉,将头文件在
2016-08-09 21:43:45 344
原创 Centos中‘vim配置’有多强大?
在linux的系统上安装vim编辑器后,发现vim的页面设置还是不太习惯,没有显示的行号,也没有自动的缩进,页面的背景也不是很好看,但是vim编辑器是可以进行配置的,我们可以打造属于自己的vim风格。下面主要讨论一下简单的vim配置问题:1.简单的页面设置(附有效果图) 首先,使用cd /etc命令进入etc的目录下,然后输入vim vimrc 进入vim的配置文件中,查看的效果图如下
2016-08-09 21:43:43 741
原创 怎样在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 1532
原创 面试题—链表的‘部分’翻转
问题: 给出一个单链表(不带头节点)和一个数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 2230
原创 C++‘异常’处理机制
在C++的发展过程中,为了实际的需要,引入了异常处理机制。程序中常见的错误:语法错误和运行错误,语法错误一般都是在编译时候发现的,编译器基本上都会报出错误的具体位置,因此这类错误一般都是比较好修改,运行错误一般不容易进行调试,比如说,程序崩溃(一般是由于栈溢出),运行结果错误(一般是算法的逻辑结构有问题)、程序非正常终止等现象。C++中引入异常处理(对运行时出现的差错进行处理),能够极大地提高程序
2016-08-09 21:43:34 346
原创 数据存在?-‘布隆过滤器’
布隆过滤器是一种能够在大量数据中判断数据是否存在的算法。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。在介绍‘布隆过滤器’之前,先介绍一下‘位图’的思想: 这里有这样一个问题:给40亿个没有排序、不重复的无符号整数,如何快速的判断一个数据是否在这40
2016-08-09 21:43:32 350
原创 数据结构—各类‘排序算法’实现(下)
在上一篇博客中,主要是实现各种的排序算法,并针对一些算法进行了优化的处理,下面主要讨论一下非比较排序的算法(计数排序、基数排序),同时并对各种排序算法的性能、时间复杂度、空间复杂度、优缺点、以及适用场景做总结分析。1.计数排序 主要思想:主要是需要统计次数,使用直接定址法,统计最大数和最小数,开辟两个数相差的空间大小,对于重复数据,使用count用来计数,时间复杂度O(N+范围个数
2016-08-09 21:43:29 226
原创 linux系统中‘find’的详细用法
“find”指令是linux系统下较为常用的指令,它常见的用法我们也需要掌握,下面主要是对‘find’指令的常见用法作一下总结,希望能够对其他人有所帮助。 在linux系统下用"ls"指令查看目录如下: 650) this.width=650;" title="无标题.png" alt="wKioL1c_EEeiBsI_AAAt1uO7Reg362.
2016-08-09 21:43:24 10864
原创 面试题—宏、函数、宏函数、inline函数的区别与联系
--宏和函数: 。宏其实主要是进行字符串的替换(只是进行字符串的替换,不涉及类型参数),而函数是通过参数的传递,参数是有数据类型的。 。编译器在预处理阶段就会进行宏的替换,不会进行参数的检查,而函数调用是将值传递给形参(值传递、引用传递、指针传递),在编译阶段之后,执行函数是会对参数进行检查的。解释:例如:#define MAX 1000 这个宏在程序的预处
2016-08-09 21:43:21 833
原创 线索化二叉树
二叉树的遍历运算是将二叉树中节点按一定规律线性化的过程,当二叉链表作为存储结构时,只能找到节点的左、右孩子信息,而不能直接得到节点在遍历序列中的前驱和后继信息。线索化二叉树能够解决这样的问题,将二叉链表中的空指针域填上相应节点的遍历前驱或后继节点的地址,而前驱和后继的地址只能在动态的遍历过程中才能得到。可以按照不同的遍历次序进行线索化,先序遍历、遍历过程中的节点的前驱、后继信息保存下来。下面是线索
2016-08-09 21:43:18 238
原创 数据结构--二叉树
“二叉树”作为特殊的树,适合于计算机处理,所以二叉树是研究的重点。我们通常将满足下列的条件称为二叉树,每个节点的度都不大于2,每个节点的孩子节点次序不能任意颠倒。也就是说,一个二叉树中的每个节点只能含有0,1或2个孩子,而且每个孩子有左右孩子之分,位于左边的孩子称为左孩子,位于右边的孩子称为右孩子。说到二叉树:就需要提到“满二叉树”和“完全二叉树”。 满二叉树:在满二叉树中,每层节点
2016-08-09 21:43:15 254
原创 广义表(非线性结构)
广义表 广义表是一种非线性的数据结构,是一种较为简单的数据结构,是线性表的扩展,是一个由n个元素组成的序列。实现广义表主要是利用递归,将其分为子问题来进行解决。下面是一些常见类型的广义表:1)A = (); 常称为“空表”2)B = (a,b); 一般的广义表3)C = (a, b, (c, d)) 具有子表的广义表4)D = (a
2016-08-09 21:43:12 3282
原创 面试题——栈与队列的应用(下)
栈与队列的应用 在“栈与队列的应用(上)”中,通过讨论两个队列实现一个栈和两个栈实现一个队列这两个问题,我们对栈和队列也有了更深的了解,下面我们主要来讨论以下两个面试中常常会遇到的问题:1)一个数组实现两个栈2)实现一个栈,能够push、pop、min(求栈中最小的数据)问题一: 对于一个数组,我们如何能够使其成为两个栈?根据数组和栈的特点,我们不难发现可以将数组的两端作为栈
2016-08-09 21:43:09 429
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人