自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【数据结构】常见的7种比较排序算法2

● 快速排序(Quick Sort)1、算法描述:    在平均状况下,排序n个数据要O(nlg(n))次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlg(n))算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项的可能性。2、步骤:1

2016-06-11 18:53:44 437

原创 【Linux】进程概念与编程

1、用atexit()注册顺序和终止顺序有什么关联2、分析程序为什么出现打印了bug()函数中的printf(),main函数后面进程终止了。3、不引用b变量名称,改变b变量的内容。4、fork()---博客(打印的次数:2*i!)——fork()是一分为二的过程

2016-06-19 09:32:59 572

原创 【数据结构】红黑树(如何实现及怎样判断)

红黑树是一颗二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是red或black。通过对任何一条从根节点到叶子节点的简单路径上的颜色来约束,红黑树保证了最长路径不超过最短路经的两倍,因此近似于平衡。红黑树的规则:1、每个节点不是红色就是黑色的。2、根结点是黑色的。3、如果一个节点是红色的,则它的两个子结点是黑色的。即每条路径上不能存在两个连续的红节点。4、对每个

2016-06-16 16:02:45 5180

原创 【Linux】进程调度算法

进程调度    无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。进程调度具有四条基本属性和三个基本状态:基本属性:     1、多态性 从诞生、运行,直至消灭;     2、多个

2016-06-12 10:54:20 2007

原创 【Linux】进程控制块PCD结构(tack_struct)

tack_struct结构图:一、task_struct 结构描述1.进程状态(State)进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。Linux 中的进程主要有如下状态,如表4.1 所示。(1)可运行状态处于这种状态的进程,要么正在运行、要么正准备运行。正在运行的进程就是当前进程(由current 宏 所指向的进程

2016-06-12 10:23:13 9095 1

原创 【数据结构】AVL树

1、AVL树简介      AVL树本质上还是一棵二叉搜索树,又称高度平衡的二叉搜索树。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。对于二叉搜索树的介绍和实现,可查看本人上一篇博客。2、AVL树的特点1)本身首先是一棵二叉搜索树。 2)带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。3)树中的每个左子树和右子树都是AVL树。4)每个结点都有一个平衡

2016-06-11 18:54:06 729

原创 【数据结构】二叉搜索树

● 二叉搜索树满足以下条件的二叉树: 1、每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同。2、左子树上所有节点的关键码(key)都小于根节点的关键码(key)。3、右子树上所有节点的关键码(key)都大于根节点的关键码(key)。4、左右子树都是二叉搜索树。● 二叉搜索树的插入过程如下:1、若当前的二叉搜索树为空,则插入的元素为根节点。2、若插入的元素值小于根节点值,则将

2016-06-11 18:54:03 530

原创 【Linux】简单实现进度条

一提起进度条,大家会想到在进行安转软件或下载视频等时,会出现以下几点1、进度条存在一个区间,不断加载数据,直到区间加载满了。2、发现会显示你的进度,从0%~100%。3、在网速不好的时候,会出现一个旋转的小圈,表示在进行加载数据。思路:      我们通过一个数组,每加载成功一次,数组会多出现一个标示。由于进度条是在一行内进行的,故我们需要回车,不需要换行,通过“\r”实现。1、进度条由0%~10

2016-06-11 18:54:00 1351

原创 【Linux】make的工作原理和makefile文件

● makefile文件      make是一个命令,makefile是一个文件。make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makef

2016-06-11 18:53:57 8050 2

原创 【Linus】配置gcc、g++和gdb

从 Linux中使用gcc来编译C程序,使用g++来编译C++程序,使用GDB来调试程序,这些使用工具都需要自己进行安装,那么应该怎样配置这些工具呢?1、查看vim信息,并查看是否存在.vimrc和.viminfo这样的配置文件650) this.width=650;" title="11.png" alt="wKioL1dKqJqxSP5bAABGL6ZWDfQ375.png-wh_50" sr

2016-06-11 18:53:55 675

原创 【Linux】vim的配置

1、配置文件.vimrc在目录/etc/下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。650) this.width=650;" title="无.png" alt="wKioL1dGsGTyy_aKAABfwqZLPSU001.png" src="http://s4.51cto.com/wyfs02/M02/81/FB/wKioL1dGsGTyy_aKAABf

2016-06-11 18:53:52 549

原创 【Linux】文件查找:find

Linux下有多种查找文件指令:find、whereis、which和locate。● which:查看可执行文件的位置● whereis:查看文件的位置● locate:配合数据库查看文件● find:实际搜寻硬盘查询       其中find是最常用和最强大的查找命令。它能做到实时查找,精确查找,但速度慢。下面主要对find指令相关用法进行详细介绍。●●●find指令:【格式】find  [指

2016-06-11 18:53:49 2667

原创 【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序1、算法思想:       计数排序是直接定址法的变形。通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中。2、步骤:1)找到序列中的最大和最小数据,确定开辟的空间大小。2)开辟空间,利用开辟的空间存放各数据的个数。3)将排好序的序列回写到原序列中。具体实现如下:void CountSort(int *arr, int size){ assert(arr); in

2016-06-11 18:53:46 524

原创 【数据结构】常见的7种比较排序算法1

● 直接插入排序(Insert Sort)1、算法描述:    该算法是一种简单直观的是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上只需用到O(1)的额外空间的排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位为最新元素提供插入空间。2、步骤:1)从第一个元素开始,该元素可以认为已经被排序2)取出下一个元素,在已经排序的元素序列中

2016-06-11 18:53:41 658

原创 位图(BitMap)&& 布隆过滤器(BloomFilter)

【面试题】给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。●  在看到这个题后最先想到的方法是遍历这40亿个数,依次进行判断,但此做法需要的内存很大,大约为15G(4000000000 * 4 ÷(1024*1024*1024)),可见此算法不可取。●  如果内存够的话,我们可以通过位图实现,位图一个数组每个数据的每个二进制位表示一个数据,每一位用

2016-06-11 18:53:38 1295

原创 哈希桶处理哈希冲突

哈希桶:哈希桶就是盛放不同key链表的容器(即是哈希表),我们可以把每个key的位置看作是一个指针,该指针所指向的位置里放了一个链表,可以认为是指针数组,故该方法也叫开链式。    相比闭散列,哈希桶提高了空间利用率:在实现哈希表时,常见的方法是线性探测、二次探测,这两个算法的具体实现可以查看我的博客。但是这两个算法有一个共同点就是:空间利用率低。为什么这么说呢?线性探测、二次探测的高效性很大程度

2016-06-11 18:53:35 1410

原创 哈希冲突的处理【闭散列方法-线性探测和二次探测】

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。    给定表M,存在函数Hash(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数Hash(

2016-06-11 18:53:32 6048

原创 【海量数据处理】N个数中找出最大的前K个数

N个数中找出最大的前K个数,需要用小堆实现。分析:由于小堆的堆顶存放堆中最小的数据,可以通过与堆顶数据进行比较,将大数据存放在堆中,注意在每次改变堆顶数据后,进行调堆,使堆顶一直存放整个堆中最小元素。void AdjustDown(int *a, size_t root, size_t size)//下调{//小堆 size_t parent = root; size_t child = p

2016-06-11 18:53:30 2323

原创 堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)

对堆进行排序,利用大堆实现升序,小堆实现降序。例如升序的实现,将较大数据存放在最后面,依次往前存放数据。具体为交换第一个元素和最后一个元素,再将不包含最后一个元素的堆进行下调,使堆保持大堆,将最大数据存放在堆中第一个位置,循环执行上述步骤,直到需要下调的数据个数为0.void AdjustDown(int *a, size_t root, size_t size)//下调--k为数组下标,size

2016-06-11 18:53:27 2527

原创 【适配器模式】实现优先级队列

【适配器模式】由于建立大堆和建立小堆方式相同,代码相似,所以可以通过添加一个比较器(利用Compare,定义伪函数Less和Greater)实现大小数据的比较,防止大量代码重复。templatestruct Less//小堆调用{ bool operator()(const T& L, const T& R) { return L < R; }};templatestruct 

2016-06-11 18:53:24 371

原创 堆的实现(堆的建立及push、pop元素)

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。堆结构的二叉树存储:大堆:每个父节点的都大于孩子节点;小堆:每个父节点的都小于孩子节点。建堆:由于堆被视为完全二叉树,故在h-1层找到第一个(从后往前找)非叶子结点,进行堆的下调建大堆时,从下往上依次判断并调整堆,使该结点的左右子树都满足大堆建小堆时,从下往上依次判断并调整堆,使该结点的左右子树都满足小堆可见大堆的建立与小堆的建立方式类似,

2016-06-11 18:53:21 1258

原创 二叉树的前序、中序和后序线索化

二叉树是一种非线性结构,遍历二叉树需要通过递归或者用栈辅助实现非递归的遍历。    用二叉树作为压缩存储结构时,取到一个结点,只能获取节点的左孩子和右孩子,不能直接得到结点的任一遍历序列的前驱或者后继。为了实现这种遍历,偶们利用二叉树中指向左右子树的空指针来存放结点的前驱和后继。线索化二叉树思路:    当某一结点的左结点或结右点存在NULL时,则该结点的为空的子结点需要线索化。    在进行线索

2016-06-11 18:53:19 611

原创 递归与非递归实现二叉树

二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^(i - 1)个结点;深度为k的二叉树至多有2^k - 1个结点。由于树的定义是递归实现的,所以在进行二叉树的前序、中序和后序遍历可通过递归实现,但也可通过非递归的栈来实现,二叉树的层次遍历可通过队列实

2016-06-11 18:53:16 623

原创 递归实现广义表

广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。由于在表的描述中可以嵌套表,允许表中有表,所以可以通过递归实现广义表。具体实现如下:头文件#pragma once//实现广义表的结构enum Type//枚举类型{ HEAD, VALUE, SUB,};struct GeneralizedNode//广义表的结点{ Type _type;//类型 Gen

2016-06-11 18:53:13 697

原创 稀疏矩阵的压缩存储和转置

1、稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。2、稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据。      由于非零元素分布没有任何规律,所以在进行压缩存储的时侯需要存储无效值的同时还要存储有效元素在矩阵中的位置,即有效元素所在的行号和列号,也就是在存储某个元素比如aij的值的同时,还需要存储该元素所在的行号i和它的列号j,这样就构成了一个三元组

2016-06-11 18:53:10 1114

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

实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/7F/0C/wKiom1cQtfGSb_beAAA7jeynyU0867.png" title="无标题.png" alt="wKiom1cQtfGSb_beAAA7jeynyU08

2016-06-11 18:53:07 948

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

面试题:实现两个队列实现一个栈。思路:1、入栈:所有元素依次入队列q1;2、出栈:判断栈元素个数是否为1,如为真,队列q1出列;如为假,队列q1除了最后一个元素其余所有元素出队列,入队列q2,输出此时的q1中元素;队列q2所有元素入队列q1;eg:将1, 2, 3, 4入队列,将1, 2, 3出列,4输出来,1, 2, 3入队列q2,最后返回到队列q1,实现了栈的后进先出。650) this.wi

2016-06-11 18:53:05 563

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

面试题:用两个栈(Stack)实现一个队列(Queue)思路:1、入队时,将元素压入s1。2、出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。这个思路,避免了反复“倒”栈,仅在需要时才“倒”一次。650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/7F/01/wK

2016-06-11 18:53:02 353

原创 迷宫问题

下面是用穷举法来走迷宫走迷宫的规则:当前坐标是(i, j)下一步可以往四个方向行走,上下左右。在迷宫数组 0标识可以走,1标识不能走 2 标识已经走过 3标识回退的路穷举法走出迷宫有两种方法:1 栈2 递归650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/7E/E3/wKiom1cLpVvwPA-eAAAe0ibpZXg498.pn

2016-06-11 18:52:56 425

原创 一个数组实现两个栈

【面试题】一个数组实现两个栈思路一:在数组中,一个栈从左往右增长,另一个栈从右往左增长。思路二:采用交叉索引法,1号栈所占数组索引1,3,5,7.....;2号栈所占数组索引2,4,6,8.......思路一必须给定数组长度,不易动态增长,但可通过扩容实现动态增长。思路二比思路一容易动态增长,但空间利用率低,对两个栈实现了公平。思路一的实现如下:templateclass TwoStack{

2016-06-11 18:52:54 466

原创 实现大数四则运算

由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。大数运算主要有加、减、乘三种方法。那么大数到底如何进行运算呢,学习过数据结构的都知道线性表,将大数拆分然后存储在线性表中,不失为一个很好的办法,下面通过字符串实现大数的构造及四则运算。头文件如下:#ifndef BIG_DATA_H#define 

2016-06-11 18:52:51 1411

原创 字符串中查找子串

使用C语言编写程序:1、在字符串中查找一个指定的字符第一次出现的位置,并返回字符所在的位置,如果不存在则返回NULL具体实现如下:char* strchr(char const *str, int ch){ char* st = (char*)str; while (st) { if (*st == ch) return st; st++; } return NULL;

2016-06-11 18:52:48 2362

原创 递归和非递归方法实现斐波那契

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1]  )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*

2016-06-11 18:52:45 613

原创 判断一个数是否为回文数,字符串是否为回文字符串

使用C语言编写程序    判断一个数是否为回文数。(ps:回文数也是一个数字,数字的特点是正反序是同一个数字,如12321,3443就是回文数)。要判断该数字是否为回文数,可以通过模除得到该数的反序数字,进行比较是否相等来判断。具体实现如下:void Practice(){ int num, value, flag, var; value = 0; flag = 1; scanf("%d

2016-06-11 18:52:42 951

原创 浅析c++异常

异常处理:异常,让一个函数发现自己无法处理的错误时抛出异常,让函数的调用者直接或间接的处理这个问题。传统错误处理办法1、终止程序。(如段错误等)2、返回错误码。3、返回合法值,让程序处于某种非法的状态。(坑货)4、调用一个预先设置的出现错误时调用的函数。虽然可以解决问题,但都存在缺陷,然而引入异常处理可以很好的解决问题。异常的抛出和捕获1、异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个

2016-06-11 18:52:39 279

原创 【C++】智能指针shared_ptr 定位删除器(仿函数)

智能指针shared_ptr 用引用计数实现看起来不错,但却存在问题。1、引用计数更新存在着线程安全;2、循环引用--使用一个弱引用智能指针(weak_ptr)来打破循环引用(weak_ptr不增加引用计数)3、定置删除器和空间分配器比如打开一个文件的关闭,用malloc开辟出来的空间,用引用计数实现会出现问题。对改变引用计数时加锁可以解决引用计数更新存在着线程安全。循环引用问题#include

2016-06-11 18:52:36 780

原创 智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr

RAII(Resource Acquisition Is Initialization)资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。STL--auto_ptrBoost库的智能指针:scoped_ptr/scoped_array/shar

2016-06-11 18:52:33 449

原创 String深拷贝、比较及增删查改等操作

string类是c++默认提供的,但是了解string类的写法也是非常重要的,面试中有许多关于string类的题目,string类能够考察c++类和对象的掌握程度,一定程度上也考察了面试者的编程能力。    下面是string类的一些基本功能,由于面试的时间很短,在这极短的时间内全部实现string类的功能是不可能的,我们可以实现最基本的功能,类中的构造函数、析构函数、赋值,复制等功能。#incl

2016-06-11 18:52:30 379

原创 C++用模板实现双链表和队列

下面介绍模板类来实现双链表表和队列,由于队列是先进先出原则,所以可以通过调用双链表实现进队和出队等操作,Container为“容器”,利用模板的模板参数--容器适配器调用双链表。下面用模板实现了顺序表的头插、尾插、头删、尾删、逆置、排序、去重、合并两个链表及增删查改等操作。如下所示:#pragma once#include#includetemplatestruct ListNode

2016-06-11 18:52:27 516

原创 C++用模板实现顺序表和栈

下面介绍模板类来实现静态顺序表和栈,顺序栈(seqential stack)就是用顺序存储方式存储的栈。在下面顺序栈的类定义中是用数组存储的,用_array[]存储,_size是实际存放的个数,_capacity是最大允许存放元素的个数,变量top表示栈顶部元素的位置。由于栈是后进先出原则,所以可以通过调用顺序表实现进栈和出栈等操作,Container为“容器”,利用模板的模板参数--容器适配器调

2016-06-11 18:52:24 642

空空如也

空空如也

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

TA关注的人

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