- 博客(51)
- 收藏
- 关注
原创 我的PM(产品经理)之路 -----起航
在写这篇文章的时候是我放弃研发,走产品之路的第二个月。在这里,我将对俩个月的学习和思考进行一个总结和介绍。以方便于我今后的PM之路上的复盘和学习,同时希望阅读到文章的前辈给予指导和建议。 我为什么想成为一个产品经理? 在讨论这个问题的时候,我想先介绍介绍我自己。我是一个软件工程专业的应届毕业生,和我的大学同学一样,在大学期间学习学校课程,刻板的认为自己毕业就是一个程序员。为
2018-01-03 01:18:06
2100
转载 select编程
多路:多条独立的i/o流,即读是一条流(称之为读流,比如输入流),写是一条流(称之为写流,比如输出流),异常也是一条流(称之为异常流),每条流用一个文件描述符来表示,同一个文件描述符可以同时表示读流和写流。select:系统提供select函数来实现多路复用输入/输出模型。select系统调用是⽤用来让我们的程序监视多个文件句柄的状态变化的。 程序会停在select这里等待,直到被监视
2017-08-12 23:25:21
747
原创 进程的概念及编程1
进程的概念: 进程是程序的一个执行实例,正在执行的程序。进程的两个基本元素是程序代码(可能被执⾏行相同程序的其他进程共享)和代码相关联的数据集。进程是⼀一种动态描述,但是并不代表所有的进程都在运⾏行。(进程在内存中因策略或调度需求,会处于各种状态)内核的观点:担当分配系统资源(CPU时间,内存)的实体。其中子进程id(PID) 父进程id(PPID)进程的描述:
2017-08-12 13:46:38
495
原创 Linux编程5中IO模型
5种IO模型阻塞I/O 非阻塞I/O I/O复用 信号驱动I/O 异步I/O 1.阻塞I/O模型 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。如果数据蔑准备好,一直等待。数据准备好了,从内核拷贝到用户空间。IO函数返回成功指示。2.非阻塞I/O模型 我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返
2017-08-12 13:39:09
302
原创 多线程编程1
线程的概念:我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,在一个进程的地址空间中执行多个控制流程的时候,就用到线程了,如:实现一个图像界面的下载软件,需要和用户交互,等待处理用户的鼠标键盘事件,又需要同时下载多个文件,等待和处理多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另几个线程每
2017-08-12 13:38:01
289
原创 shell之正则表达式
引言&&grep以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义。其实grep还可以找出符合某个模式(Pattern)的子类字符串。例如找出所有符合xxxxx@xxxx.xxx模式的字符串(也就是email地址),要求x字符可以是字母、数字、下划线、和数点或减号,email地址的每一部分可以有一个或多个x字符,例如abc.d@ef.com、1_2@987-
2017-08-01 17:30:25
442
转载 我是一个进程
我听说我的祖先们生活在专用计算机里, 一生只帮助人类做一件事情,比说微积分运算 了、人口统计了 、生成密码、甚至通过织布机印花 ! 如果你想在这些专用“计算机”上干点别的事儿,例如安装个游戏玩玩, 那是绝对不可能的, 除非你把它拆掉, 然后建一个全新的机器。 而我这些祖先们勉强可以称为“程序”。后来有个叫冯诺依曼的人, 非常了不起, 他提出了“存储程序”的思想, 并且把计算机分为五大部
2017-08-01 17:23:28
253
原创 shell脚本语法篇
条件测试:1.条件测试test或[命令test或[测试一个条件是否成立,测试为真为0测试为假为1[传递给各参数之间应该用空格隔开,命令test或[参数形式是相同的,只不过test不需要]参数,常见的命令如下:[ -d DIR ] : 如果DIR存在并且是一个目录则为真[ -f FILE ] : 如果FILE存在且是一个普通文件则为真[ -z STRING ] : 如果STR
2017-07-07 23:43:47
369
原创 shell脚本符号篇
hell执行脚本#!/bin/bashEcho “这是一个shell脚本”;shell脚本中用#表示注释,如果#位于第一⾏开头,并且是则例外,它表⽰该脚本使⽤后⾯指定的解释器/bin/sh解释执⾏。 第一种执行方式:chmod +x script.shShell会fork一个子进程并调⽤用exec执行./script.sh这个程序,exec系统调用应该把子进程的代码段替
2017-07-07 23:22:57
383
原创 生成树和最小生成树
树:在图中,常常将树定义为一个无回路连通的无向图。只选定图中某个顶点做根,以树根为起点对每条边定向,就能将他们变成通常的树。树中悬挂的顶点称为树叶,其他顶点称为分支点,一个非连通图,如果它的各个连通分量都是树,则这种非连通图称为森林。树是森林的特殊情况,树中无回路,因此树中必然没有自身环也无重边,否则就出现回路不是树了。 生成树和生成森林: 生成树:连通图的一个子图如果是一棵包含所有顶
2017-07-05 12:20:34
1162
原创 图的广度优先搜索遍历
广度优先搜索遍历的原理:广度优先搜索算法遍历类似于树的按层次遍历。设图G的初态是所有顶点均未访问过,在G中任选一顶点vi为初始出发点,则广度优先搜索的基本思想是:首先访问出发点vi,接着依次访问vi的所有邻接点,再接着访问邻接着的所有未曾访问过的顶点,依次类推,直至图中所有和初始出发点vi有路径相通的顶点都已访问到为止。 图的广度优先搜索遍历的算法: 设vi
2017-07-05 12:10:21
1281
原创 图的深度优先遍历
图的深度优先遍历的原理:深度优先搜索遍历类似于树的前序遍历。假设给定图G的初态是所有顶点未曾访问过的,在G中任选一顶点vi为初始出发点,则深度优先搜索可定义如下:首先,访问出发点vi,并将其标记为已访问过,然后,依次从vi出发搜索vi的每一个邻接点vi,若未曾访问过,则以vi的新的出发点继续进行深度优先搜索。 对图进行深度优先搜索遍历时,按访问顶点的先后次序所得到的顶点序列,称为该图的深度优先搜
2017-07-05 12:06:57
1630
原创 图的表现和实现2(邻接矩阵表表示法)
邻接表: 顶点表的每个元素存储顶点信息,由俩个域成,data(数据域)和adjlink(与顶点关联的边对应的单链表)边链表中的结点由3个域组成,dest.weight和next,其中dest域根据无向图或者有向图而不同,weight域在非带权图中将被省略。 无向图的邻接表表示: 在边表中,第i行单链表存储所有与顶点vi相关联的边,每个边结点存储从
2017-07-05 11:58:20
772
原创 图的表示和实现1(图的矩阵表示法)
邻接矩阵:邻接矩阵是用矩阵来表示顶点之间的相邻关系的一种方法。A[i,j]=1则是图的边。若A[i,j]=0,则不是图的边。若G是网络则A[i,j] = wij; wij表示边上的权值,若A[i,j]=0或无穷则计算机允许的大于所有边上权值的数。邻接矩阵表示带权图类:除了采用二维数组存储用于表示顶点间相邻关系的邻接矩阵外,通常还需要用一个顺序表来存储顶点信息。verte
2017-06-19 22:13:37
6968
原创 图的定义和术语
图:图是由俩个集合V和E组成,记为G=(V,E),其中V是顶点的有限非空集合,E是V中顶点的边的有限集合。通常,也将图G的顶点集和边集分别为V(G)和E(G)。E(G)可以是空集,若E(G)为空,则图只有顶点而没有边有向图:若图G中每条边都是有方向的,则称G为有向图。在有向图中,一条有向边是由俩个顶点组成的有序对,有序对通常用尖括号表示。有向边也称为弧,起点称为弧尾,终点称为弧头
2017-06-19 21:55:04
554
转载 linux下线程原理及实现
什么是线程池? 诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务。构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务。但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大。所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象
2017-06-03 15:05:27
710
转载 TCP的转载机
连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和CLOSED。CLOSED表示没有连接。各个状态的意义如下: (1)LISTEN - 侦听来自远方TCP端口的连接请求; (2)SYN-SENT
2017-06-03 10:00:52
253
原创 二叉线索树
二叉树的定义: 由于在二叉树的链式存储结构中,每个结点存储了指向其左右孩子结点的链,而没有存储指向某种线索性次序下的前驱或者后继结点的链。当需要获得结点在一种遍历序列中的前驱或者后继结点时。有俩中解决方案: (1)再进行一次遍历,寻找前驱或后继结点。这需要花费较多的时间,效率较低。 (2)采用多重链表结构,每个结点增加俩条链,分别指向前驱和后继结点。需要花费较多的
2017-05-24 21:58:52
1723
原创 二叉树的查找、二叉树高度、二叉树获得双亲结点、构造二叉树、二叉树的广义表表示法、二叉树的插入删除、二叉树的非递归实现
二叉树的查找:#include#include"DoubleNode.h" //双链表结点类#include"SeqStack.h" //顺序栈#include"LinkedStack.h" //链式栈#include"SeqQueue.h" //顺序循环队列using namespace std;template
2017-05-19 23:44:05
1474
原创 二叉树的遍历
先序遍历:1.访问根结点 2.先序遍历根结点的左子树 3.先序遍历根结点的右子树中序遍历:1.中序遍历根结点的左子树 2.访问根结点 3.中序遍历根结点的右子树后序遍历: 1.后序遍历根结点的左子树 2.后序遍历根结点的右子树 3.访问根结点 二叉树的顺序存储结构: 二叉树的顺序存储结构是用一组连续的存储单元存
2017-05-18 21:41:23
526
原创 什么是二叉树?及二叉树的性质
二叉树的定义: 二叉树是个有限元素的集合,该集合或者为空、或者由一个称为根的元素及俩个不相交的、被分别称为左子树和右子树组成。当集合为空时,称为空二叉树。在二叉树中,一个元素又称作一个结点。 二叉树是有序的,即若将其左、右子树颠倒,就成为另一棵不同的二叉树。即使树中结点只有一颗子树,也要区分是左子树还是右子树。因此二叉树具有5种基本形态。二叉树的性质:
2017-05-18 17:26:23
1012
原创 树的存储结构,及链表实现
树的存储结构: 孩子链表:在一颗度为K的树中,若一个结点x已有k个孩子,再插入一个结点作为x的孩子,由于孩子链已满,需要扩充,对于只支持静态数组的程序设计语言,则不能实现此种情况下的插入操作。C++语言提供动态数组,若将孩子的结点域children设计为一个可变长顺序表,则可实现插入操作的扩充功能。 有时占用较多存储空间。若树有n个结点,度为k,总链数
2017-05-18 17:02:01
1994
原创 什么是树?及相关术语?
树的定义:树是n(n>0)个有限数据元素的集合。当n=0时,称这棵树为空树。树的特点:1.树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点。2.树中所有结点可以有0个或多个后继结点3.树中没有封闭的环存在。因为如果存在封闭环,则至少有一个结点将有大于一个的前驱结点树的相关术语:结点的度:结点所拥有子树的个数称为该结点的度叶子结点:度
2017-05-18 16:57:38
488
原创 矩阵的实现(矩阵相加)
#include using namespace std;class Matrix{private:int rows,columns; //矩阵行数列数int **element; //动态二维数组void InitiaMatrix(int rows,int columns); //申请并初始化指定行数列数的空矩阵public:Matrix(int rows=4
2017-05-15 17:37:00
5137
原创 二维数组的动态存储(遍历方阵,求各元素的和)
#define _CRT_SECURE_NO_WARNINGS #includeusing namespace std;int **InitialArray(int row,int column) //动态创建数组并初始化{int **matrix = new int *[row]; // 申请row个整型指针的一维数组 int i,j,n=1; f
2017-05-12 22:32:11
862
原创 顺序队列(循环队列)+链式队列+打印杨辉三角
概念:队列是限定只能在表的一端进行插入在另一端进行删除操作。在表中,允许插入的一端称为“队列尾”,允许删除的另一端称为“对列尾”顺序队列: 定义:概念:队列的顺序存储结构为顺序队列,顺序队列实际上是运算受限的顺序表 顺序队列的表示:1.和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素
2017-05-07 11:30:43
2364
原创 栈实现迷宫
栈的类型定义:栈是一种特殊的线性表,限定只能在表的一端进行插入和删除操作的线性表。在表中,允许插入删除的一端称为“栈顶”,不允许插入删除的另一端称为“栈底”,没有元素的栈称为空栈,插入元素称为入栈,删除元素称为出栈,称为先进后出。 顺序栈类型的定义:顺序栈的存储方式是数组,需要事先为他分配一个可容纳最多元素的存储空间,“栈顶指针”意为指示栈顶元素在栈中的位置,在栈的长度已
2017-05-03 18:53:02
595
原创 串(Bruet-Force算法)
串的顺序存储: 概念:顺序串是用一组地址连续的存储单元来存储串中的字符序列,顺序串具有随机存取功能,缺点是插入删除元素时需要移动串中的有关元素 1.串空间的大小在编译时就已经确定,是静态的。难以适应插入、链接等操作 2.除了直接使用定长的字符数组存放串内容外,一般使用一个不会出现在串中的特殊字符放在串值的末尾来表示串的结束。所以串空间最大值为n时,最多只能放n-1个字符,所以
2017-04-27 12:09:53
537
原创 单链表(合并单链表)
链式结构由于每个结点只有一个指向直接后继的指针域,因此当访问过一个结点后,只能接着访问它的后继结点,而无法访问它的前驱结点,这样的单项链表称为单向链表。 单链表遍历: 单链表遍历是从单链表头指针head开始访问,沿着next指针所指示的方向依次访问每一个结点,且每个结点只能访问依次,直到最后一个结点为止。遍历时注意,不要改变head指针的指向。因此一般设置另外的一个指针变量
2017-04-25 22:26:22
823
1
原创 顺序表(约瑟夫环)
概念:线性表的顺序存储结构称为顺序表,顺序表中的每一种数据类型属于同构,你要知道第一个数据元素的起始地址,就可以计算出其任一元素的地址 lOC(ai)=Loc(a0)+i*c 其中c=sizeof(T) 1.顺序表的各个数据元素的逻辑顺序与其储存的物理顺序一致 2.顺序表的数据元素即可进行顺序访问,也可以进行随机访问 1.三个成员必须是私有属性,防止错误操作引发的错
2017-04-25 22:21:50
2673
原创 二叉搜索树
概念:二叉排序树也叫二叉搜索树,1.若它的左子树非空,则左子树上所有结点的值均大于根结点的值。2.若它的右子树非空,则右子树上所有结点的值均大于根结点的值 3.它的左右子树也叫二叉排序树二叉排序树的查找: 二叉排序树中value的结点。1.从根结点开始,设p指向根结点。2.将value与p结点的关键字进行比较,若俩者相等,则查找成功;若value值较小,则在p
2017-04-25 22:17:09
285
转载 Linux之task_struct
在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构。然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理。因此了解task_struct的结构对于我们理解任务调度(在linux
2017-02-19 13:37:19
234
原创 vim的配置
简单的vim配置:在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,通常已经存在一个.vimrc文件,那么我们可以在自己的工作目录下建立一个“.vimrc”文件将配置vim的命令写进去来配置我们的vim。
2017-02-18 15:34:09
466
原创 linux下执行进度条和写makefile
1.在Linux环境下实现进度条,其原理是:用sleep函数或usleep函数控制每隔多长时间输出一次,每次输出字符会比上次输出字符多一个。在此代码中,用\r而不用\n的原因:\n表示换行,即光标移到光标所在行的下一行行首位置处。\r表示回车,即光标回到光标所在行行首位置处。fflush(stdout):立刻清空缓冲区并把缓冲区内容输出。代码实现如下:2
2017-02-17 11:50:55
726
原创 llinux学习之find和touch指令
1.a/c/mtime的意义,如何使用touch更改: . linux的touch命令不常用,一般在使⽤用make的时候可能会用到,用来修改⽂件时间戳,或者新建一个不存在的文件。而每个文件在linux下面都会记录许多时间参数,其实是有三个主要的变动时间。 (1).a:access time (atime)当“该文件的内容被取用”时,就会更新这个读取时间。举例来说,我们使用cat去读
2017-02-16 09:27:45
1129
原创 C++之函数模板
一.什么是函数模板 在介绍函数模板前先看段代码: 对,就是函数重载,我们知道函数重载基于不同数据类型实现类似操作,那么如果数据类型比较多的时候怎么办呢?只要有新类型出现,就要重新添加对应函数,而且代码函数体都相同,但代码复用率却不高。那么可不可以使用预处理指令,可以,但是安全性却不高。所以我们引入函数模板。那什么是函数模板?函数模板:代表了一个函数家族,该函数与
2016-11-18 16:29:25
412
原创 C++之多态和虚函数
一.什么是多态 多态与封装,继承一起构成了面向对象的3大特性。多态指向不同对象发送同一消息,不同的对象会产生不同的行为。也就是说每个对象用自己的方式去响应共同的消息。C++有俩中形式的多态。如上课铃打了,不同班级的同学走向不同的教室。编译时的多态性,即静态联编:程序在编译之前就可以确定的多态性,通过重载机制来实现的,可以是函数重载,也可以是运算符重载。运行
2016-11-13 22:24:30
313
原创 C++继承与派生
1.什么是继承 在C++类中包含了若干个数据成员和成员函数,在不同的类中数据成员和成员函数是不相同的,但有时俩个类的内容基本相同或有一部分相同。 例如:“公马”继承了“马”的全部特性,加上“雄性”的特性。“白公马”继承了“公马”的全部属性。所以继承是已存在类的基础上建立一个新的类。“马”为“基类”或“父类”,而新建立的类为“派生类”或“子类” 继承的定义格式:class s
2016-11-07 21:55:50
394
原创 C语言实现三子棋
三字棋是C语言学习阶段一个有趣的项目,就分享给大家了#include#include#includechar a[4][4]={0};int size= 9;void dayinqipan() //打印棋盘{int i=1;printf(" | | \n");for(i=1;i{printf("_%c_|_%c_|_%c_\n
2016-11-04 21:43:00
433
原创 C++之顺序表
顺序表的实现 #define _CRT_SECURE_NO_WARNINGS #include#include#includeusing namespace std;typedef int DataType;class SeqList{ public:SeqList();SeqList(DataType arr[], size_t size
2016-11-03 20:17:40
295
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人