自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

如风

坚持做自己懒得做但是正确的事情,你就能得到别人想得到却得不到的东西。

  • 博客(39)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux下实现一个进度条

本文的题目就是实现一个进度条,进度条的应用在软件中无处不在,拷贝一个文件需要一个进度条,加载一个文件也需要一个进度条,来标志完成与否。    那么 ,一个进度条有哪些元素呢:一个不断向右生长的容器(直观的看出当前的进度)一个数据化反映进度的百分比。一个标志(这个标志反映这个进度条是否在工作,还是卡死)在这里有一些小小的知识点:C语言中缓冲区的刷新方式是以行缓冲刷新的。也就是说,

2016-05-31 19:39:11 615

原创 linux下的进程控制块task_struct详解

背景:为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块。在linux系统中,这就是task_struct结构,在include\linux\sched.h文件中定义。每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,在任何时候操作系统都能

2016-05-30 23:25:40 689

原创 怎样配置Linux下的vim编辑器

vim编辑器是一个强大的文本编辑器。对于一个C/C++初学者来说,可以利用vim编写自己喜欢的代码出来。但是习惯于使用windows下的IDE,初次体验vim真的是糟透了,不同于VS的编程习惯,使用起来及其的不方便,编写代码的效率很低很低。在网上有很多网友都有分享自己的vim配置,以下就是博主根据自己的变成习惯配置的vim编辑器:操作系统环境:CentOS 6.7    (64位)  不同

2016-05-26 13:11:10 868

原创 Linux下的find指令详解

在Linux下有很多查找指令:locatewhereiswhichfind  在这些查找指令中功能最强大的当属find指令了。find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。即使系统中含有网络文件系统,find命令在该文件系统中同样有效。所以在本片博客中主要讨论find命

2016-05-24 17:33:07 505

原创 Linux下C程序的链接过程

今天看到一个很有意思的小程序,它让我对Linux下C程序的编译链接有了一个全新的认识!   这个程序的就是写一个简单的输出“hello World!”:  要求:1.不使用C运行库,写一个独立于任何库的程序。(也就是说我们不能#include)。      2.不适用main函数为程序的入口(大家都知道一般使用了库的程序都是使用main函数作为程序的入口,在这里我们使用自己写的函数nomain作为

2016-05-24 15:28:48 1105

原创 Linux下的find指令详解

在Linux下有很多查找指令:locatewhereiswhichfind  在这些查找指令中功能最强大的当属find指令了。find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。即使系统中含有网络文件系统,find命令在该文件系统中同样有效。所以在本片博客中主要讨论find命令。(一)find命令的格式:find 路径 -命令参数 [输出

2016-05-24 15:28:45 490

原创 各种排序算法大汇总

比较排序是比较常见的排序算法,它分为以下几个类:交换排序:冒泡排序(BubbleSort)和快速排序(QuickSort)。插入排序:直接插入排序和希尔排序(ShellSort)。选择排序:选择排序(SelectSort)和堆排序(HeapSort)。(一)交换排序:void BubbleSort(int* arry, int size){ for (int i = 0; i < size -

2016-05-24 15:28:42 522

原创 布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。       如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合

2016-05-24 15:28:39 348

原创 位图

位图算法是一种使用二进制位来表示一个数是否存在的算法。  一个字节是八位二进制,可以表示两种状态,1和0。1表示存在,0表示不存在。  四个字节是32位二进制,可以表示32种状态。  八个字节是64位二进制,可以表示64种状态。  比如这道题:  给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】   这是一道腾讯的编程题,看起来也是难难的。

2016-05-24 15:28:36 295

原创 复习二进制位的一些操作

最近在学习数据结构感觉利用二进制位来标记一个数是否存在是特别节省空间的,比如位图和布隆过滤器是效率比较高的。所以感觉有必要复习一下二进制位的一些常用的操作。  通过几个例子来复习一下:(一)写一个函数返回参数二进制中 1 的个数(与运算)int count_one_bits(size_t value){ size_t i = 1; int count = 0; while(1) {

2016-05-24 15:28:33 256

原创 实现哈希桶(空间利用率较高的哈希表)

前面几篇博客已经写过了哈希表的闭散列法,也写过哈希表的应用,在这里就不赘述。今天我们要实现的是一个哈希桶。什么哈希桶呢?哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),在这里我们可以把每个key的位置看作是一个孔,孔里放了一个链表相信大家可以看出来,使用一个数组来存放记录方法的哈希冲突太多,基于载荷因子的束缚,空间利用率不高,在需要节省空间的情况下,我们可以用哈希桶来处理哈希冲突。哈希桶

2016-05-24 15:28:30 11355 1

原创 模拟实现英汉字典(使用key/value形式的哈希表)

上一篇博客我们实现了key形式的线性探测法处理哈希冲突,有了前面的基础,我们就可以实现更加有难度的key/value形式的二次探测。  什么是key/value形式呢? key/value形式就是在哈希表中,有一个决定数据在表中位置的关键字key和这个关键字所携带的值value。   在这里我们的目标是实现一个英汉字典,一个英语字符串就是key,对应的有一个汉语翻译value,通过key我们可以找

2016-05-24 15:28:27 712

原创 处理哈希冲突的线性探测法

哈希表,是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。(摘自维基百科)  对不同的关键字可能得到同一散列地址,即k1!=k2,而f(k1)=f(k2),这种现象称为碰撞(英语:Collision),也叫哈希冲突。 处理哈

2016-05-24 15:28:24 19517 1

原创 类模板的分离编译

一直觉得模板类是特别神奇的东西,它可以构造出不同类型的对象,使代码更加的灵活。这个过程就是类模板的实例化。  我们使用类的模板写一个stack类:#include#include"Seqlist1.h"using namespace std;template class Container  = Seqlist>class Stack{public: void Push(const 

2016-05-24 15:28:22 491

原创 斐波那契数列的最优算法(O(logN))

相信大家都对斐波那契数列已经相当的熟悉了,最多两分钟就可以写出来以下时间复杂度为O(N)的代码://递归实现long long fib(int n){ if (n =1 || n== 2) { return 1; } return (fib(n - 2) + fib(n - 1));}或者是这样的时间复杂度为O(N),空间复杂度为O(1)://优化一:时间复杂度为O(N)lon

2016-05-24 15:28:18 16081 2

原创 优先级队列

优先级队列首先是一个队列,但是它强调的是“优先”,所以优先级队列又分为最大优先队列和最小优先队列。 最大优先级队列:每次从队列中取出优先级最大的数据,删除数据也是删除优先级最大的数据。 最小优先级队列:每次从队列中取出优先级最小的数据,删除也是删除优先级最小的数据。  所以我们用一个类去实现优先级队列时就需要用到小顶堆和大顶堆的概念。我们并不关心除了最高优先级和最低优先级的数据在队列中是怎体存储的

2016-05-24 15:28:15 407

原创 找出N个数据中的最大的K个数据---堆排序

从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的N个数据,但是可以存下K个数据。这就让我们打消了用排序的方法来解的念头。   在这里我们使用堆排序来完成。  650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/7F/8C/wKiom1ch-hHjqORSAAAWpw4wnkw367.png" title="捕获4

2016-05-24 15:28:12 5666

原创 数据结构之堆(Heap)的实现

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构,所以堆也叫做二叉堆。二叉堆满足二个特性:  1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。  2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。  当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于   任何一个子节点的键值时为最小堆。  最大堆和最小堆是堆数据结构的

2016-05-24 15:28:10 7054

原创 操作系统之银行家算法

银行家算法是一种在多道程序系统中避免多个进程并发执行所带来的死锁问题。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。避免死锁的方法:(一)摒弃“请求和保持”条件。(二)摒弃“不剥夺”条件,摒弃。(三)“环路等待”条件等方法。   然而,利用银行家算法,我们可以来检测CPU为进

2016-05-24 15:28:07 596

原创 大数运算之字符串模拟

相信大家被特别大的两个数据做运算折磨过。当两个操作数或者运算结果超过类型的表示范围后会有意想不到的错误,这时候我们的电脑还不如我们高中用过的科学计算器,这是作为一个程序员所不能忍受的。所以我们得找到其他的方式来计算。这就是我们今天要讨论的字符串模拟大数运算。 我们的运算一般使用int类型来算的,那么首先我们先复习一下各种int类型的数据表示范围:unsigned int 0~4294967295

2016-05-24 15:28:04 3131 1

原创 线索二叉树

用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。但是常常我们会想要更加直观的知道节点的前驱后继。线索二叉树显得尤为的重要。650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7F/52/wKioL1cZ4PHAQI1dAAATb_tS_YE250.png" title=

2016-05-24 15:28:01 200

原创 二叉树的非递归实现

之前一直觉得二叉树使用递归来实现就感觉有点绕,今天才发现二叉树使用非递归来实现更加的绕,但是考虑到我们得使用非递归来提高二叉树的遍历效率,使用非递归是一种比较好的方法。  三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担。现在非递归使用栈来实现,利用了栈的先进后出的特点,可以解决。  二叉树的递归实现之前已经实现过了,我们直接实现非递归。并且都使用栈实现

2016-05-24 15:27:58 318

原创 二叉树的递归实现

二叉树是一种非常有用的结构,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。  二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树

2016-05-24 15:27:55 226

原创 注释转换

(一) 将C语言的注释转化为C++的注释,我们可以分为7种情况:  // 1.一般情况/* int i = 0; */// 2.换行问题/* int i = 0; */int j = 0;/* int i = 0; */int h = 0;// 3.匹配问题/*int i = 0;/*xxxxx*/// 4.多行注释问题/*int i=0;int j = 0;int k = 0;*/int k =

2016-05-24 15:27:52 173

原创 广义表的递归实现

广义表是一种数据结构,是线性表的推广。也有人称之为列表(lists)。广泛的用于人工智能等领域的表处理结构。 对于广义表,我们需要了解它的结构,通过学习广义表,也加深了对递归的了解。整个广义表都是了利用递归的特性实现的。650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7F/12/wKiom1cR9nXi69W3AAAgWvMXs1

2016-05-24 15:27:49 3644

原创 稀疏矩阵的转置与快速转置

假设在m*n的矩阵中,有t个元素不为0。令稀疏因子s=t/(m*n),通常认为s 有时为了节省存储空间,可以对这类矩阵进行压缩存储。所谓的压缩存储就是,为多个相同的值分配存储在一个空间,对零元不分配空间。而稀疏矩阵是只存储有效值,无效值只分配一个空间。  在这里我们用一个顺序表vector存储稀疏矩阵的有效值的行,列,值三个元素。struct Triple{ int _cow; int _c

2016-05-24 15:27:46 1133

原创 智能指针

对于一个初学者,常常会被野指针(垂悬指针)的问题所困扰。这就用到了我们今天讨论的智能指针来解决问题。  野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。     “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用,野指针一般不会为NULL。野指

2016-05-24 15:27:43 199

原创 string类的深浅拷贝问题

字符串是我们在编写程序的时候经常用的到的。C++库已经帮我们实现了一个功能更加强大的字符串类string,我们要去了解它是怎么实现的。  只要是涉及到 string类的地方多少都会涉及到深浅拷贝的问题。在C++中,在用一个对象初始化另一个对象时,只复制了成员,并没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。      深拷贝是将指向内容复制到给当前对象新分配的缓冲区中的一种复制方

2016-05-24 15:27:41 1102

原创 类实现一个简单的日期计算器

作为一个程序员,对于时间的概念已经退化到了三岁小孩水平,常常会醉心于写一个程序忘记了时间,一个下午,一天,甚至一个星期就过去了。对于一个刚入程序员大门的我来说,时光真的是匆匆溜走,所以经常会百度一个日期计数器,算今天到那些特别的日子还有多少天。用多了后就觉得现在储备的编程知识可以去实现一个简单的日期计算器了。所以就写了这篇博客给大家分享一下。  首先,得设计这个日期类,一个日期类应该具有私有数据成

2016-05-24 15:27:38 571

原创 单链表的一些经典面试题

今天在一本试题书上看到一些特别好的单链表面试题,大家都知道单链表容易在头节点处进行删除,在尾节点处进行插入,下面我们就来讨论一下这些面试题:  (一)删除一个非尾节点:  题目要求的是要删除一个不是尾节点的节点,要删除一个节点我们首先得知道是那个链表,是哪个节点节点,找到并且删除它。所以我们设计的函数是这样的:void DelNotTailNode(SListNode* pos){ asser

2016-05-24 15:27:35 1293

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

首先,我们得了解队列和栈的基本原理。  队列是一个“先进先出“的一个结构。队列的定义是在队尾插入,在队头删除,这就要求要用一种在尾部插入容易的,在头部删除容易的结构,你一定会想到单链表,对,库的实现就是用一个链表实现的。  栈,相信大家都不会陌生,函数栈帧等的实现,它是一种”先进后出“的结构。栈的插入删除都是在尾部进行的。  所以要用队列实现一个栈,要解决的问题就是在删除时要删除最后插入的那个元素

2016-05-24 15:27:32 1241

原创 C语言实现顺序表

顺序表是C语言中一种基本的结构,可以存储各种基本类型的数据,而且不但可以存储基本类型的数据,也可以存储一种结构。所以顺序表是一种在学C的过程中必须掌握的结构,通过学习整理,下面来实现一下:  首先,先要想好用什么实现,一般实现最基本的顺序表的话直接用数组实现,我们在这用一个结构体来封装这个顺序表(封装这一概念是在C++中最常用的概念)#define ARRAY_EMPTY -2#define A

2016-05-24 15:27:29 680

原创 菱形虚拟继承

最近在学习C++的继承,菱形继承是比较难懂的一部分,所以通过查阅资料后整理了一下思路,也和同学分享了关于菱形虚拟继承的一些东西。    菱形继承在一般情况下使用不到的,但是通过了解菱形继承,我们 可以了解编译器是如何工作的。    首先,菱形虚拟继承就是两个基类虚拟继承一个共同的超类,然后两个基类由有一个共同的派生类。    650) this.width=650;" src="http://s4

2016-05-24 15:27:26 435

原创 将一个双向链表逆置的正确姿势

双向链表中含有数据成员_data,_prev,_next,也就是说数据节点前后都有一个指向前一个节点和后一个节点的指针。然而要想实现双向链表的逆置,首先我们先来了解一下单链表的逆置        单链表的逆置,所采用的方法是头插法,所谓的头插法就是新建一个NewHead指针,这个指针永远指向新的链表的头节点_head,然后从原链表中“摘取”节点连接到新的链表上,以下是c++代码实现:void Re

2016-05-24 15:27:23 8136

原创 关于将一个字符串转换为整数的问题

当我看到这么一个问题时,我觉得是一个很简单的问题,立刻就会想到用一个while循环遍历整个字符串,将一个个字符转化为数字,关于这种问题已经不是第一次遇到了,所以自信满满的写好然后去网上寻找答案。   这或许就是理想和现实的差距,把自己写的程序和标准答案一对,发现没有一个地方可以称之为写对。答案中提到了atoi函数,是一个把字符串转换为整数的库函数。   下面就是具体的实现:long long St

2016-05-24 15:27:20 2138

原创 递归思想实现大数问题(打印1到n位最大整数)

假设给一个20位的一个整数,大家都知道 int,float ,double 型都表示不了这么大的数,这就涉及到了大数的问题,我们可以用字符串来模拟这个20位的数。动态开辟一个21个char型大小的内存char *num=(char *)malloc(21*sizeof(char));我们将前20个内存初始化为‘0’,我们用这20位来模拟这个20位的整数。最后一位放一个‘\0’。有时候递归可以简化问

2016-05-24 15:27:17 1451

原创 找出一个数组中唯一没有成对出现的两个数

除了用暴力破解法,用循环去一个个找出那俩个数,可以使用位运算符^(按位与),把所有数都^起来存到一个数中,这个数就是要找的目标数的按位与,因为两个相同的数按位与等于0,所以用这种方法可以快速定位目标数,以下是具体实现情况:#include int find_one_bit(int num){    int bit = 0;    while (num)    {        if 

2016-05-24 15:27:14 1077

原创 倒序输出一个无符号二进制数的所有位

#include #include uint reverse_bit(uint num){    uint ret = 0;    int i = 0;    for (i = 0; i < 32; i++)    {        ret += ((num >> i) & 1)*pow(2, 31 - i);        }    return ret;}int mai

2016-05-24 15:27:11 498

原创 求一个数的二进制中1的个数

#includeint main(){  int num=0;  int count=0;  scanf("%d",&num);while(num){  count++;  num=num&(num-1);}printf("count=%d\n",count);return 0;}&是按位与,就是把一个数写成二进制然后按位与,因为1与1为1,1与0为0,所以可以找出每个1

2016-05-24 15:27:08 225

哈夫曼树实现文件压缩

使用小顶堆,哈夫曼树,实现一个简单的文件压缩程序

2016-06-11

银行家算法

详细的银行家算法c语言代码 int available[SIZE];//可利用资源矩阵 int claim[SIZE][SIZE];//所需资源最大量矩阵 int allocation[SIZE][SIZE];//已分配资源矩阵 int need[SIZE][SIZE];//需要资源矩阵 int request[SIZE][SIZE] = { 0 };//记录某个进程申请各个资源类中的资源实例的数量 int finish[SIZE] = { 0 };//工作变量,用于判断进程是否已经执行过,初始状态全部为0,即未执行 int p[SIZE];//记录序列执行顺序 int ava;//记录系统有多少个资源类 int process;//记录进程数量 int r;//记录当前要申请资源的进程的序号

2016-05-25

空空如也

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

TA关注的人

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