自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 task_struct结构体及僵尸、孤儿进程

为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块(PCB)。 在Linux中就是task_struct结构 Linux中的进程可以分有多种状态: R(runing):运行状态 S(sleeping):浅度睡眠状态 D(disk sleep):磁盘睡眠状态 T(stopped)

2017-12-11 15:36:38 237

原创 二叉树面试题

1. 前序/中序/后序遍历(非递归) 前序void PrevOrderNonR() { stack<Node*> s; Node* cur = _root; while (cur || !s.empty()) { while (cur) { cout

2017-12-02 23:15:00 172

原创 排序

首先我们看一下排序的种类,排序有比较排序和非比较排序,今天我们主要探讨一下常用的几个排序。 插入排序 插入排序是一种简单直观的排序。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 步骤: 1。从第一个元素开始,该元素可以认为已经被排序 2。取出下一个元素,在已经排序的元素序列中从后向前扫描 3。如果该元素(已排序)大于新元素,将该元素

2017-11-28 21:58:40 358

原创 海量数据处理题目小结

解决这类题目的思路一般为 (1)能否用特殊的数据结构解决:位图,布隆,堆。 (2)哈希切分 1。给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址 思路分析: 1.要进行哈希切分编号,log file可以看做是字符串,利用哈希字符串转换算法进行转换,转换成整型后,利用哈希函数进行映射,同一IP地址肯定映射到同一编号中, 2.这里我们使

2017-11-20 19:03:30 264

原创 平衡搜索树-BTree

B树是一种适合外查找的树,是一种平衡 的多叉树。 一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质: 1。根节点至少有两个孩子 2。每个非根节点有[M/2,M]个孩子 3。每个非根节点有[M/2-1,M-1]个关键字,并且以升序排列 4。每个节点孩子的数量比关键字的数量多一个。 5。 key[i]和key[i+1]之间的孩子节点的值介于key[i]、ke

2017-11-20 17:33:20 551

原创 容器map与set的增删查改

set的特性是所有元素都会根据元素的键值自动被排序。set的键值就是实值,set不允许两个元素有相同的键值。 标准的STL即以RBTree作为底层机制。 下面我做一个简单的sret测试//#include<stdio.h>//#include"RBTree.h"//#include<windows.h>//int main()//{// TestRBTree();// sys

2017-11-08 16:11:49 302

原创 linux下的重要目录

这里主要介绍一下几个/proc, /sys, /selinux, /bin, /usr/lib, /usr/local, /var, /tmp /proc(process): 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间. proc文件系统是一个伪文件系统,它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得

2017-11-07 16:46:42 203

原创 CentOs下安装gcc/g++/gdb

Centos支持使用yum安装,安装软件一般格式为yum install …….,注意安装时要先成为root用户,且在联网的状态下。使用yum安装gcc:yum install gcc 即可。 使用:which gcc 查看是否安装成功使用yum安装g++:yum install gcc-c++ 即可。 使用:which g++ 查看是否安装成功gdb安装使用yum安装:yum insta

2017-11-07 16:42:55 187

原创 RB-tree 红黑树

除AVL树外,还有RBtree也是经常用到的平衡二叉搜索树 RBtree必须满足以下四条规则: 1.每个节点不是红色就是黑色 2.根节点为黑色 3.如果一个节点是红色,则它的 子节点是黑色的(即没有连续的红节点) 4.任一节点至NULL(树尾端)的任何路径,所含黑节点数必须相同 那AVL和RBtree有什么区别 AVltree 是严格平衡的二叉搜索树,其复杂度接近lgN,旋转多,维护起

2017-11-04 19:09:12 247

原创

堆是一个用数组表示的完全二叉树,并满足以下两个特性: 1)父节点的键值总是大于或等于(小于等于)其子树上的任意结点 2)每个结点的左子树和右子树都是个堆。 如果父节点的键值总是大于等于任何一个子节点的键值,那么这时称之为最大堆或者大顶堆。 如果父节点的键值总是小于等于任何一个子节点的键值,那么这时称之为最小堆或者小顶堆。#pragma once#include<iostream>#

2017-10-16 21:05:22 255

原创 二叉树线索化

二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只 能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。 为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。 enum PointerTag {THREAD, LINK}; template struct

2017-10-16 20:11:35 201

原创 二叉树

非递归是利用栈桢来实现的,而非递归则是用Stack来实现,递归相比较非递归来说,缺陷在栈桢储存在栈上,有可能发生栈溢出。 二叉树代码如下#pragma once#include <queue>#include <stack>template<class T>struct BinaryTreeNode{ BinaryTreeNode<T>* _left; BinaryTree

2017-10-02 15:58:11 212

原创 回溯法求迷宫

首先我们先“创建”一个迷宫,把其放在Mazemap.txt文件中。 0代表可以走的路,1表示不通的路。首先定义一个结构体,用来存储坐标template<size_t M, size_t N>class Maze{public: Maze(int maze[M][N]) { for (size_t i = 0; i < M; ++i) {

2017-10-02 09:08:12 213

原创 一个数组实现两个栈

一个数组实现两个栈,共有三个思路 1.奇偶法 2.从中间分别向两边压栈 3.从两边向中间压栈 将数组的起始位置看做第一个栈的栈底,将数组的尾部看做第二个栈的栈底,压栈时,栈顶分别向中间位置移动,直到两个栈顶相遇,则扩容。 第三种 最节省空间,不会造成空间浪费,所以代码实现只实现这一种#include <iostream> #include <Win

2017-09-25 21:11:15 497

原创 判断元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列

该题依旧考察的是栈的先进后出原则 思路如图 出栈时候先判断S2是否为空,不为空则从S2栈顶元素逐个取出,再从S1中取出剩下的元素 代码实现如下#include<iostream> #include <assert.h> #include <stack>using namespace std;typedef int T; class Stack { public:

2017-09-25 20:27:44 1255

原创 两个队列实现一个栈

队列是先进先出,为了实现栈的先进后出原则,我们依旧采用两个队列来实现。 代码实现如下template<class T>class Stack{public: void Push(const T& x) { if(q1.size() > 0) q1.push(x); else if(q2.size() > 0)

2017-09-25 19:49:49 155

原创 使用两个栈实现一个队列

首先理一下思路 s1:用于入栈。 s2:用于出栈。 (1)入队列:直接将元素压入s1; (2)出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部倒到s2中,再弹出s2的栈顶元素。

2017-09-24 16:36:54 150

原创 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)

首先理一下思路,我们可以建两个栈,一个_data,用来存放每一个入栈的数据,另一个_mindata,用来存放数据栈中当前最小的数据。 (1)当data入栈时,首先将data入栈到_data数据栈中,让data与_data的栈顶元素进行比较,当插入的元素小于等于_data的栈顶元素,则将其入栈到_mindata数据栈中。 (2)当元素出栈时,让_data与_mindata的栈顶元素做比较,如果栈顶

2017-09-24 11:04:26 347

原创 实现基本栈和队列

首先我们来看一下基本实现栈 #pragma once// 静态栈//template<class T, size_t N = 100>//class Stack//{//public:// void Push(const T& x)// {// if (_size == N)// {// throw out_of_range("stack

2017-09-23 21:49:24 187

原创 STL ——list和vector

首先简单模拟实现List的普通迭代器#include<iostream>#include<assert.h>using namespace std;template<class T>struct __ListNode{ T _data; __ListNode<T> *_prev; __ListNode<T> *_next; __ListNode(const T

2017-09-21 22:04:31 296

原创 用模板实现顺序表和带头结点的双向循环链表

链表可分为带结点和不带结点,单向和双向以及循环和不循环 双向循环链有指向前一个数的指针和指向后一个数的指针。 如下图 #include<iostream> #include<assert.h>#include<windows.h>using namespace std; template<class T> struct ListNode { T _data;

2017-08-03 20:42:09 241

原创 C++中多态与多态对象模型

一、什么是多态?多态,其实就是多种形态——动态形态和静态形态(即重载)。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。通俗的说,就是两个函数同名,但参数列表不同,然后根据参数不同实现不同的功能, 即“一个接口,多种方法”。 构成多态条件有:虚函数的重写(覆盖) 父类(基类)的指针或者引用指向对象 在进行多态的单/多继承

2017-08-01 18:37:17 301 1

原创 用C++实现双向链表

#include<iostream>#include<assert.h>using namespace std;typedef int DataType; struct ListNode{ ListNode* _next; ListNode* _prev; DataType _data; ListNode(DataType x) :_data

2017-07-27 20:33:09 210

原创 C++实现顺序表和单链表

顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。 确定了起始位置,就可通过公式计算出表中任一元素的地址:LOC(ai)=LOC(a1)+(i-1)*L  1≤i≤n (L是元素占用存储单元的长度) 顺序表的实现一般是实现连续开辟一段空间,然后在进行数据的增删查改(静态顺序表) 其代码实现如下:#include#in

2017-07-27 14:17:51 504

原创 String——写时拷贝

在前面的文章中我们总结了深拷贝的传统写法和现代写法,这次我们来总结一下写实拷贝。 当我们遇到需要大量拷贝构造,析构同样的空间的情况,传统写法和现代写法不断的开辟空间,析构空间,效率太低,这时,我们就可采用写实拷贝:当一个对象被拷贝构造多次,在不改变内容的情况下,多个对象共用同一个空间。如果某个对象要改变内容,就要另外开辟一块相同的空间,然后改变这个对象的_str指针,再进行写操作。 引用计数的写

2017-07-24 20:10:25 244

原创 String——增添查改

对String类进行操作,其中包括构造函数、拷贝构造函数、赋值运算符重载、析构函数以及对String类的增删查改。#include<iostream>#include<assert.h>using namespace std;class String{public: String(char*str="")//默认情况下处理为一个空字符串 //构造 {

2017-07-23 18:29:56 252

原创 C++ String的传统和现代写法的深拷贝

传统写法#include<iostream>using namespace std;class String {public://构造函数 String(char*str=""); :_str(new char[strlen(str)+1]) { strcpy(_str, str); }//拷贝构造 String(cons

2017-07-20 21:45:04 460

原创 信号量

一、什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操

2017-06-17 19:41:10 230

原创 生产者消费者模型

生产者消费者模型可以被称为“三二一原则” “三”是指有三个原则,这三个原则分别是: (1)生产者与生产者之间是互斥的关系。 (2)生产者与消费者之间是同步与互斥关系。 (3)消费者与消费者是互斥的关系。 “二”是指两种角色:生产者和消费者 “一”是指一个交易场所 基于单链表实现的生产者与消费者模型:#include <stdio.h>#include <pthread.h>#i

2017-06-17 19:25:21 259

原创 死锁

死锁 死锁指的是两个或两个以上的进程在执行过程中,由于资源竞争或者由于彼此通信(如进程切换)而造成的一种阻塞现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态,这些永远在互相等待的进程成为死锁进程。 死锁产生的原因 (1)因为系统的资源不足,不能满足进程的资源请求,会导致多个线程同时争夺一个资源 (2)进程运行推进的顺序不合适 (3)资源分配不当,和第一个一样,有的进程

2017-06-17 18:43:52 219

原创 共享内存

一、共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问

2017-06-17 18:36:39 305

原创 二分查找在C++中的实现

首先我们谈一下时间复杂度,时间复杂度即函数、函数计算执行的 基本操作次数。 时间复杂度函数:F(N)=N^2+2N+10 二分查找的时间复杂度为O(lgN) O(N^2) 二分查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 二分查找要求: 1.必须采用顺序存储结构

2017-04-26 14:47:25 664

原创 C++中的异常处理

C++中的异常处理机制通常的异常抛出和处理主要使用下面这三个关键字:try,throw,catch throw:异常检查部分使用throw表达式来表示它遇到了无法处理的问题,即throw引发了异常。 catch:捕获异常,处理异常。 try:异常处理部分使用try语句块处理异常,try语句块中代码抛出的异常通常会被某个catch子句处理。 注意:1、一个异常如果没有被捕获,则它将终止当前的程

2017-04-26 14:34:19 276

原创 智能指针—AutoPtr,ScopedPtr,SharedPtr的模拟实现

智能指针: 所谓智能指针就是智能/⾃动化的理指针所指向的动态资源的释放 AutoPtr:最简单的智能指针 首先我们先提一下RAII,资源获得即初始化(利用类的构造函数来进行初始化和析构函数释放资源) 下面我们来模拟实现以下AutoPtr//智能指针AutoPtrtemplate <class T>class AutoPtr{pubilc: AutoPtr (T * ptr)

2017-04-19 13:06:09 303

原创 Linux下结构体task_struct

long state 任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)。   long counter 任务运行时间计数(递减)(滴答数),运行时间片。   long priority 运行优先数。任务开始运行时counter = priority,越大运行越长。   long signal 信号。是位图,每个比特位代表一种信号,信号值=位偏移值+1。   struct s

2017-04-12 18:58:23 254

原创 linux中vim的配置

在Linux中配置文件的位置 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。 首先,我们先执行ls-al查看是否有.vimrc文件,如果没有,则在当前用户的主工作目录下创建一个.vimrc文件 cd进入当前用户主工作目录,输入vim .vimrc进行vim配置。

2017-04-09 15:37:58 296

原创 LINUX中find指令的相关用法

Linux下find命令在目录结构中搜索文件,并执⾏行指定的操作。下面我们来了解一下各种具体的操作。 1.命令格式: find pathname -options [-print -exec -ok …] 2.命令功能: ⽤用于在⽂文件树种查找⽂文件,并作出相应的处理(可能访问磁盘。 3.命令参数: pathname: find命令所查找的目录路径。 -exec: find命令对匹配

2017-03-29 16:15:59 189

原创 linux下文件的access time 、change time、modify time三个时间点

想要区分这三个时间点, 首先我们需要理解这三个的概念 Access time:最后一次访问文件或目录的时间 Modify time:最后一次修改文件或目录的时间 Change time:最后一次改变文件或目录的时间 在Linux下使用stat命令来查看文件信息 如图 会出现以下三个时间点 access time:表示最后一次访问(仅仅是访问,没有改动)文件的时间 modify

2017-03-22 13:59:05 1573

原创 预处理 宏及编译

熟悉预处理标识符#include#include#define PRINT \ printf("%s,%d,%s,%s\n",__FILE__,__LINE__,__DATE__,__TIME__)int main(){ PRINT; system("pause"); return 0;}宏和函数的区别宏宏概念:C++ 宏定

2016-11-04 19:05:46 341

原创 编写代码,演示多个字符从两端移动,向中间汇聚。

#include #include #include #include #include void print(char *str,int n) { int i=0; for(i = 0;i < n;i++) {

2016-10-11 12:30:21 239

空空如也

空空如也

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

TA关注的人

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