- 博客(55)
- 资源 (1)
- 收藏
- 关注
原创 Git常用指令
git init : 在当前目录下初始化一个仓库git add "文件名":将文件添加到仓库git commit -m "文件描述" :把文件提交到仓库commit可以一次提交很多文件, 可以多次add不同的文件,比如: $ git add file1.txt $ git add file2.txt $ git add file3.txt...
2018-11-06 14:48:00
212
原创 I/O复用之poll
poll和select相似,也是通过轮询文件描述符,以测试其中是否有就绪者。一、poll系统调用的API:1. poll函数原型如下:2. 参数1)fds参数是一个poolfd结构类型的数组,它指定所有我们感兴趣的文件描述符上发生的可读、可写和异常等事件。pollfd结构体定义如下:其中,fd指定文件描述符;events告诉poll监听fd上的哪些事件,它是
2016-08-03 11:26:34
490
原创 I/O复用之select
I/O复用使程序能够同时监听多个文件描述符 ,能够提高程序的性能。一、需要使用I/O复用的情况:1. 客户端程序要同时处理多个socket。2. 客户端程序要同时处理用户输入和网络连接。3. TCP服务器要同时处理监听socket和连接socket。4. 服务器要同时处理TCP请求和UDP请求。5. 服务器要同时监听多个端口,或者处理多种任务。Linux下实现I/O复用
2016-07-30 23:01:47
470
原创 死锁的产生及避免
1. 死锁死锁可以被定义成一组竞争系统资源或互相通信的进程间相互的“永久”阻塞。当一组进程中的所有进程都在等待一个事件,而只有在进程集合中的其他阻塞的进程才可以触发该事件,这时就称一组进程死锁。2. 产生死锁的四个必要条件 (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 占有且等待条件:一个 进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件(非抢
2016-07-14 14:20:29
492
原创 Linux信号
一、信号的基本概念用kill -l 命令可以查看系统定义的信号列表:1~31号为普通信号,34~64号为实时信号二、产生信号的条件1. 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号。 2. 硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向
2016-07-13 15:13:25
414
原创 wait和waitpid函数
当一个进程正常或异常终止时,内核就向其父进程发送一个SIGCHLD信号。因为子进程终止是一个异步事件,所以发生这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种信号的系统默认动作是忽略它。调用wait或waitpid的进程可能会发生的情况: 1.如果其所有子进程都还在运行,则阻塞 2.如果一个子进程已终止,正等待父进程获
2016-07-09 17:30:12
519
原创 fork与vfork函数
一、fork函数pid_t fork(void); 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1。一个现有进程可以调用fork创建一个新进程。 子进程是父进程的副本。例如:子进程获得父进程数据空间、堆和栈的副本(主要是数据结构的副本)。父子进程不共享这些存储空间部分。父子进程共享正文段。 由于fork之后经常归属exec,所以现在很多实现并不执行一
2016-06-28 21:23:46
462
原创 二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,。因此如果输入9,该函数输出2。方法一:首先将n和1做与运算,判断n的最低位是否为1,接着将1左移1位,继续和n做与运算,这样反复左移,每次都能判断n其中的一位是不是1。实现代码: int NumberOf1(int n) { int coun
2016-06-14 10:11:17
369
原创 旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。方法一:从头到尾遍历数组,就可以找到,时间复杂度为O(n)。实现代码: int minNumberInRotateArray(vector rotat
2016-06-12 11:10:15
517
原创 Python项目之万能的XML
这个项目介绍的是如何使用XML来表示多种数据,以及如何使用适合XML或SAX的简单API来处理XML文件。这个项目的目标是通过一个描述各种网页和目录的XML文件生成一个完整的网站。XML文件至少需要包括网站、目录、页面、名称、标题和内容。下面是XML文件,website.xml: Welcome to my Home page Hi, there. My name is
2016-06-10 12:52:44
1309
原创 设计模式之行为型模式
行为型模式:模板方法模式(Template Method)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、职责链模式(Chain of Responsibility)、命令模式(Command)、访问者模式(Visitor)、调停者模式(Mediator)、备忘录模式(Memento)、迭代器模式(Iterator)、解释器模式(Interpreter)。
2016-06-09 14:20:15
331
原创 设计模式之结构型模式
结构型模式:外观模式(Facade)、适配器模式(Adapter)、代理模式(Proxy)、装饰模式(Decorator)、桥接模式(Bridge)、组合模式(Composite)、享元模式(Flyweight)。
2016-06-09 12:26:53
318
原创 设计模式之创建型模式
设计模式:是指在软件开发中,经过验证的,用于在特定环境下、重复出现的、特定问题的解决方案。创建型模式:抽象了对象实例化过程,用来帮助创建对象的实例。包括简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)。1.
2016-06-09 09:29:23
336
原创 Linux进程概论
一、进程概念 程序的一个执行实例/正在执行的程序/能分配处理器并由处理器执行的实体。 内核观点:担当分配系统资源(CPU时间,内存)的实体。进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关联的数据集。进程是一种动态描述,但是并不代表所有的进程都在运行。(进程在内存中因策略或调度需求,会处于各种状态)。二、进程控制
2016-06-08 14:01:21
1304
原创 进程调度
一、进程调度的基本状态:1.等待态:等待某个事件的完成2.就绪态:等待系统分配处理器以便运行3.运行态:占有处理器正在运行运行态→等待态: 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。等待态→就绪态 :则是等待的条件已满足,只需分配到处理器后就能运行。运行态→就绪态 :不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如
2016-06-08 11:42:11
777
原创 gcc的使用以及编写简易的Makefile
一、gcc的用法gcc的编译流程:预处理---->编译--->汇编--->链接1. 预处理(进行宏替换,生成.I的预处理文件):预处理功能主要包括宏定义,文件包含,条件编译三部分。分别对应宏定义命令, 文件包含命令,条件编译命令三部分实现。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进⾏行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
2016-06-01 21:34:04
3064
原创 面向对象编程的基本原则
面向对象的基本设计原则有:单一职责原则,开放-封闭原则,依赖倒转原则,里氏代换原则,迪米特法则。1.单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。也就是说,当能够想到多余一个动机去改变一个类,那么这个
2016-06-01 14:41:40
2006
原创 Python项目之画幅好画
这个项目是《Python基础教程》后面的项目之一。这个项目主要是用来学习如何在Python中创建图形,具体说就是利用图形创建一个PDF文件,使从文本中读取的数据可视化。要想实现,就得先下载图像生成包,可以在http://www.reportlab.org下载安装包,然后安装在Python所在路径中即可使用。初步版本:实现了基本内容。
2016-05-24 14:05:54
3073
2
原创 图的遍历、最小生成树以及单源最短路径
图的遍历主要分为两种:深度优先遍历(DFS)和广度优先遍历(BFS)DFS:深度优先遍历:和树的前序遍历相似,首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上
2016-05-22 17:03:12
4146
原创 二叉树相关笔试题(三)
1.按之字形顺序打印二叉树题目:请实现一个函数,按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二行按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,以此类推。分析:可以用两个栈,在打印某层结点时,把下一层的子结点保存到相应的栈里。如果当前层是奇数层,则先保存左子节点再保存右子结点到第一个栈中,如果是偶数层,则先保存右子结点再保存左子节点到第二个栈中。
2016-05-22 11:35:12
519
原创 find命令详解
Linux下的find命令的查询功能十分强大,下面详细介绍find的大多数用法:工作方式:沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。1.根据文件时间搜索atime(access time,访问时间):即上次访问这个文件的时间mtime(modification time,修改时间):即文件内容上次发生改变的时间ctime(change time,改变时间)
2016-05-19 11:15:29
2441
原创 Python项目之即时标记
这个项目是《Python基础教程》后面的项目之一。主要是应用Python出色的文本处理能力——使用正则表达式将纯文本文件改写成语言(如HTML)中的标记,要做的工作基本上是将各种文本元素分类,比如标题和被强调的文本,然后明确地标记它们。使用的方法:1.对文件进行读写,从标准注入读取(sys.stdin),利用print输出等。2.对所输入的行进行迭代。3.使用了一些字符串方法。
2016-05-17 19:12:18
1405
原创 shelve模块
shelve:是一种简单的数据存储方案,他有一个有趣的函数就是open(),这个函数接收一个参数就是文件名,会返回一个shelf对象,你可以用他来存储内容,可以简单的把它当作一个字典,当你存储完毕的时候,调用它的close方法来关闭。简单的使用shelve模块的数据库应用程序:
2016-05-17 12:41:35
1888
原创 图的存储
图 : 是一种线性结构,由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构。图的存储:临接矩阵:将所有的顶点的信息组织成一个顶点表,然后利用矩阵来表示各顶点之间的临接关系,称为临接矩阵。邻接表:使用数组存储顶点集合,使用链表链接边的关系。图的邻接矩阵存储实现代码:#pragma once#includetemplateclass GraphMatrix{
2016-05-17 10:44:35
1607
原创 八皇后问题
题目:有一个棋盘和8个要放到上面的皇后。唯一的要求是皇后之间不能构成威胁。也就是说,必须把它们放置成每个皇后都不能吃掉其他皇后的状态, 怎样才能做到?皇后要如何放置?分析:这是一个典型的回溯问题,首先尝试放置第一个皇后(在第1行),然后放置第二个,
2016-05-15 19:35:48
333
原创 并查集的实现
并查集(UnionFind):将N个不同的元素分成一组不相交的集合。 开始时,每个元素就是一个集合,然后按规律将两个集合进行合并。 应用场景:假如已知有n个人和m对好友关系(存于数组r),如果两个人是直接的或间接的好友关系(好友的好友的好友....)
2016-05-13 22:17:51
673
原创 二叉树相关笔试题(二)
1.二叉树中和为某一值的路径题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整树的所有路径。从树的根节点开始往下直到叶节点所经的结点形成一条路径。分析:由于路径是从根节点出发的,所以选择前序遍历,当访问到一个结点时,把该结点添加到路径,并累加该结点的值,如果该结点为叶子结点并且路径中结点值的和刚好等于输入的整数,则该路径符合要求,如果当前结点不是叶子结点,则继续访问它的子节点
2016-05-13 11:59:14
1835
原创 二叉树相关笔试题(一)
1.根据二叉树的前序遍历和中序遍历的结果重建二叉树分析:二叉树的前序遍历顺序是根->左->右,中序遍历顺序是左->根->右,由此可以看出在前序遍历中的第一个数字为二叉树的根节点,接着扫描中序遍历的结果就可以得到根结点的位置,在根节点左边的数为左子树结点的值,位于根节点右边的为右子树结点的值,接下来可以用递归的方法分别构建左右子树。
2016-05-11 11:41:37
586
原创 栈与队列相关笔试题
1.用两个栈实现队列分析:队列的特点是“先进先出”,而栈的特点是“后进先出”,入队列时让所有的元素进到stack1中,出队列时先判断stack2是否为空,不为空直接pop即可,若为空,将stack1中所有的元素“倒入”stack2中,这样就用两个栈实现了队列。实现代码:class Solution{public: void push(int node) {
2016-05-10 15:07:55
1609
原创 布隆过滤器的简易实现
布隆过滤器(Bloom Filter): 是由布隆(Burton Howard Bloom)提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器用于检索一个元素是否在一个集合中。底层是利用哈希表来实现的,它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是
2016-05-08 16:41:22
3172
4
原创 链表相关笔试题(二)
1.复杂链表的复制题目:请实现函数,复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个pSibling指向链表中的任意结点或者NULL。方法一:先复制原始链表上的每一个结点,并用next链接起来,然后设置每个节点的pSibling指针。假设原始链表中的某个结点N的pSibling指向结点S,由于S的位置在链表中可能在N的前面也可能在N的后面,所以要定位
2016-05-07 12:45:18
673
原创 B树的实现
B树:1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树。(有些地方写的是B-树,注意不要误读 成"B减树") 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:1. 根节点至少有两个孩子 2. 每个非根节点有[ (M/2)向上取整 ,M]个孩子3. 每个非根节点有[ (M/2)向上取整 -1,M-
2016-05-07 11:41:35
2046
原创 链表相关笔试题(一)
1.从尾到头打印单链表方法一:可以用栈实现,遍历链表,每经过一个结点,把该结点放入栈中,当遍历完整个链表后,从栈顶开始逐个输出结点的值,此时输出的结点的顺序就反转过来了实现代码:
2016-05-01 12:55:25
421
原创 替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入"We are happy."则输出"We%20are%20happy."。分析:方法一:创建新的字符串并分配足够多的内存,在新的字符串上进行替换。方法二:从头到尾扫描字符串,每碰到一个空格的时候进行替换,并把空格后面的所有字符后移两个字节。方法二的实现代码如下:void Replace(char st
2016-04-30 11:24:10
302
原创 红黑树的实现
红黑树:红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单 路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡。性质:1. 每个节点,不是红色就是黑色的 2. 根节点是黑色的 3. 如果一个节点是红色的,则它的两个子节点是黑色的
2016-04-30 10:11:55
530
原创 AVL树的实现
AVL树: AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度 平衡,尽量降低二叉树的高度,减少树的平均搜索长度。性质:1. 左子树和右子树的高度之差的绝对值不超过1 2. 树中的每个左子树和右子树都是AVL树 3. 每个节点都有一个平
2016-04-29 22:54:11
483
原创 C++项目之文件的压缩及解压缩
项目描述:实现文件的压缩机解压缩。 开发平台:VS2013 开发技术:堆,Huaffman树,文件输入输出函数 项目特点:1. 统计文件中字符出现的次数,利用数据结构堆建造Huffman树,出现次数多的编码短,出现次数少的编码长。 2. 根据建造好的Huffman树形成编码,以对文件进行压缩。 3.将文件中出
2016-04-19 15:54:24
5847
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人