自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

MBuger的博客

与其临渊羡鱼,不如退而结网。

  • 博客(26)
  • 收藏
  • 关注

原创 Linux中粘滞位的使用

简介前面的博文中我们提到过在Linux中文件有着相应的操作权限,通常情况下用户只要对某个目录具备w写入权限,便可以删除该目录中的任何文件。那么有时候我们会遇到这种情况创建了权限为“rwxrwxrwx”的目录,即允许任意用户、任意程序在该⽬录中进⾏创建、删除、移动⽂件或⼦⽬录等操作。但是我们需要⽤户对该⽬录有写⼊权限,同时也不能删除该⽬录中其他⽤户的⽂件数据,⽽是只有该⽂件的所有者和root⽤户才有权

2017-03-30 20:40:17 540

原创 并查集解决朋友圈问题

引入最近在网上看到了这样一道面试题: 假如已知有n个人和m对好友关系(存于数组r)如果两个人是直接或间接的好友(好友的好友的好友…),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈。假如:n = 5,m = 3,r = {{1 , 2} , {2 , 3} , {4 , 5}}表示有5个人,1和2是好友,2和3是好友4和5是好友,则1、2、3属于一个朋友圈4、5属于另一个朋友

2017-03-30 15:21:42 2380

原创 各类排序算法比较和应用场景

简介插入排序插入排序是一种较为简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 形象的可以理解为打扑克抓拍的过程,通常我们右手抓牌,没抓一张牌,就放到左手,抓下一张牌后,会把这张牌依次与左手上的牌比较,并把它插入到一个合适的位置(按牌面大小)。希尔排序希尔排序是对直接插入排序的一种优化,实质就是把直接插入排序改为了分组插入排序。其基

2017-03-28 21:47:01 23232 2

原创 排序算法:基数排序(桶排序)

简介 基数排序(升序)是一种非比较式的排序方式,和之前博文中提到的快排,冒泡排序,插入排序这些排序算法不一样,它没有使用任何交换的方式,那么又是通过什么方式进行的排序呢?它的基本思想是通过分配的方法把元素从小到大分配,以到达排序的作用。算法描述 1.创建10个桶,分别用来放对应的数字; 2.按照最低位(个位)的数字分配到相应的桶里面; 3.把桶里的数字依次放回数组; 4.按照次低位的数字分

2017-03-28 19:54:32 1415

原创 Linux查看文件详细信息指令stat

引入我们知道在终端输入ll,就可以显示当前目录里的文件详细信息,或者使用ls加上另外的参数就可以显示其他的一些有用的信息,如下图所示。但是,另外还有一个指令可以显示更多有用的信息。那就是指令stat。stat指令:文件/文件系统的详细信息显示; 使用格式:stat 文件名 stat命令主要用于显示文件或文件系统的详细信息,该命令的语法格式如下: -f  不显示文件本身的信息,显示文件所在文件系

2017-03-24 13:17:24 30354

原创 排序算法:归并排序

简介“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表,归并排序和快排一样也采用的是分治的思想,它的基本原理是通过对若干个有序结点序列的合并为一个有序序列来实现排序的。 它的效率是比较高的的排序方法,他通常应用于数据量比较大的场合。 下面这篇博客讲解了如何使用使用归并求一个整数序列中逆序对数(http://blog.csdn.net/mitedu/article/details/388

2017-03-23 22:32:10 919 1

原创 Linux文件权限管理

什么是权限?在Linux工作目录中打开终端,输入指令ll,会出现当前目录中所有文件的详细信息,其中第一列的字段当中就包括了文件的操作权限。 我们可以看到,第一列出现了10个字符,第一个字符代表了文件类型,后面的九个字符就代表的是文件的操作权限。那么这里的九个字符又分别代表着什么权限呢?首先我们要明白这里对文件访问者进行了分类, 前三个字符代表了文件的所有者(-u)的权限,中间三个字符代表文件文件

2017-03-23 16:42:06 889

原创 git的入门和基本操作

引入 我们在写代码的时候经常会遇到想修改一部分的代码,但是却又可能想在以后某个时间恢复这些代码;或者有可能在一些大型项目中需要多个人合作完成一份代码,但是不可能让这么多人同时在这一份代码上去编写。 这个时候git就出现了。简介git是目前最为先进的分布式版本控制系统,它的作用就是解决向上面一样的问题。开放自己的版本库,实现多人合作的功能,同时它还可以记录 文件的改动,恢复改动等等。git工作流你的

2017-03-22 22:59:27 426

原创 排序算法:快速排序

简介快速排序是一种在实际应用中经常用到的排序算法,它的应用场景是大规模的数据排序,并且实际性能要好于归并排序。它的基本原理是从数组中选取一个元素,把所有大于这个元素的数都放到它的后面,所有小于这个元素的数都放到它的前面,然后这个元素就把原数组切分成了两个部分,再分别对这个两个部分进行同样的操作,直到数组不能再切分的时候,此时数组为有序。 这种切分的算法思想被称为分治法,在实际应用中这种思想也被广泛

2017-03-22 20:43:59 775

原创 排序算法:冒泡排序

简介冒泡排序(这里指升序)是一种非常简单直观的排序方式,它是一种交换式的排序方法,基本思想就是相近的两个数字作比较,小的放到前面,大的放大后面,按照这个规则从头向后比较。直到数组有序。 之所以把它叫为冒泡排序就是因为排序过程就像气泡在水中上浮一样,大的数字一步一步的就被换到了数组的末尾。但是冒泡排序效率比较,不适合大规模的数据排序工作,一般情况很少用到这种排序方法。算法描述设数组长度为N。 1.

2017-03-21 22:07:15 800

原创 排序算法:堆排序

简介堆排序(使用大堆,升序)从基本实现原理来说也是一种选择排序,它同样是确定了位置选择符合位置的元素,但是堆排序是更加优化的选择排序的版本,它利用了堆的特性。父结点的值大于子结点,且满足完全二叉树,大大提高了选择排序的效率。算法描述1.对无序数组建立堆(大堆)模型, 堆模型满足父结点值大于子结点值,且抽象出来的是完全二叉树; 2.把堆顶最大值与堆尾最后一个值交换,最大值就归到正确位置(有序区),

2017-03-20 22:35:19 744

原创 排序算法:选择排序

简介选择排序的排序思想就和它的名字一样,每次通过从无序的数组中选择出一个最小的(要求升序排列)数把他放到数组的最前面。再依次找次小的数字放到数组无序区的最前。直到数组为有序。算法描述1.从数组的第一个数字开始,往后遍历,相互比较,找到最小的数; 2.把最小的数归到数组的第一个位置,归好位的数字为有序区,后面为有序区; 3.以无序区为基准重复步骤1~2,直到数组有序。时间复杂度:O(N^2)代码实

2017-03-19 20:57:29 983

原创 排序算法:希尔排序

简介插入排序在对接近有序的序列进行排序时,效率高,几乎可以接近线性排序。时间复杂度可以达到O(N)。但是一般情况下,直接插入排序的效率是比较低的,因为他它只能每次移动一个数据。 希尔排序则是对直接插入排序的一种优化,实质就是把直接插入排序改为了分组插入排序。其基本思想就是将整个待排序元素序列按gap(步长)分割为N个组,对每个组进行直接插入排序,然后在减小gap(步长)再进行直接插入排序,直到ga

2017-03-19 13:20:35 703

原创 排序算法:插入排序

简介插入排序是一种较为简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 形象的可以理解为打扑克抓拍的过程,通常我们右手抓牌,没抓一张牌,就放到左手,抓下一张牌后,会把这张牌依次与左手上的牌比较,并把它插入到一个合适的位置(按牌面大小)。上述过程即插入排序过程。算法描述1.从第一个元素开始,该元素可以认为已经有序; 2.取下一个元素,

2017-03-18 20:13:59 997

原创 二叉搜索树,AVL,红黑树,B树,哈希表,位图的比较

简介二叉搜索树定义: 1.是一颗空树或者是具有以下性质的二叉树; 2.若左子树不为空那么左子树上的值都小于根结点的值; 3.若右子树不为空那么右子树上的值都大于根结点的值; 4.左右子树都为二叉搜索树。AVL树定义: 1.是一颗空树或者具有以下性质的二叉搜索树; 2.每个结点左右孩子的高度差的绝对值不超过1。红黑树定义: 1.树的结点有两种颜色,不是红色就是黑色; 2.根结点为黑色;

2017-03-17 10:46:17 1014

原创 函数的重载与函数模板

函数重载:有时候想要实现几个功能相近,但只是处理的参数类型不同的函数,在C语言里我们要把这些函数起上不同的名字,而在C++里我们可以把这些函数都给上一个函数名只需要把不同的参数给入函数就可以了,这样大大的减少了函数名的数量,增强了代码的可读性。C++中这叫做函数的重载,是在同一作用域内声明几个功能类似的同名函数,但是这些函数必须是参数类型和数量必须不同。调用时,编译器会自动匹配参数最相符的函数,这样

2017-03-16 17:24:13 1332

原创 哈希桶的实现(拉链法)

简介为了解决线性探测实现哈希表时出现哈希冲突后导致数据堆聚的现象,我们采取了另一种结构来处理哈希冲突,哈希桶(拉链法),拉链法解决冲突的做法是将所有通过哈希函数计算出来的哈希地址相同的结点存放在一个单链表之中。 实现原理就是将哈希表定义为一个由N个头指针组成的指针数组,经过哈希函数计算得到的哈希地址相同的数据全部连在对于的头指针下面。它继承了数组的易于查找和链表便于删除插入的特点。时间复杂度拉链法

2017-03-16 11:10:54 4854

原创 哈希表的C++实现(线性探测)

简介哈希表/散列表(HashTable)是一种根据关键字(key)直接进行访问数据存储位置的数据结构。他通过一个关键字的函数把数据映射到表中的储存位置,这个映射函数叫做散列函数或者哈希函数,存放数据的数组就叫做散列表,即哈希表。哈希表的应用哈希表经常被用于信息安全方面,因为哈希表可以把数据和存放地址映射起来,从而实现加密。或者说他是把一些不同长度的信息转化成杂乱的编码,这些编码叫做哈希值。 哈希表

2017-03-14 12:31:26 9831 1

转载 哈希函数BKDR的解析

BKDRHASH是一种字符哈希算法,像BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等,这些都是比较经典的,通过http://blog.csdn.net/wanglx_/article/details/40300363(字符串哈希函数)这篇文章,我们可知道,BKDRHash是比较好的一个获取哈希值的方法。下面就讲解这个BKDRHash函数是如何推导实现的。

2017-03-12 22:25:45 3811

原创 BitMap(位图)结构的C++实现

简介位图是一种非常常见的结构,它使用每个二进制位来存放一个值的状态,正因为这个性质,它经常被用在数据压缩或者是索引等方面。有这样一道题:给40亿个不重复的无符号整数,没有经过排序,然后再给一个树,如何快速判断这个数是否在40亿个数之中?在这里如果我们实打实的存放40亿个数据在内存中,那会占据将近15个G的内存,普通电脑根本无法满足,更不用说在对其进行查找操作了。 那么如果选择位图来存储的话我们只需

2017-03-12 19:44:58 2315

原创 B树的C++实现

简介和AVL树、RB树一样,B树也是一种搜索树结构,能够存储数据也可以对其进行排序。它的特点是结点可以有多余两个的子结点。但是他的优势在于处理大块数据的读写操作,因为在计算机中的存储体系当中,有一种叫做局部性的东西。他分为时间局部性和空间局部性。时间局部性:最近被访问的内存内容会很快再被访问; 空间局部性:靠近当前被访问内存的内存内容很快也会被访问。当在处理大块数据操作的时候B树的特性就可以减少定

2017-03-11 22:58:23 1070

原创 一行代码判断闰年和计算某月份天数

在刚开始学习C++的时候,曾经封装过一个时间类,里面实现了一些接口,包括判断该年是否为闰年,计算某个月的天数,计算截止这个日期总共过了多少天等等。 可能很多人都C++初学者都写过这种东西,大多数人的写法可能和我最开始的时候写的一样,都是通过if,else语句和switch,case语句来进行判断,github上也有很多这种实现。代码判断闰年bool IsLeapYear(int _year) co

2017-03-08 20:46:12 6143

原创 如何使用一个for循环输出九九乘法表

问题引入很多人刚接触C语言的时候一定会遇到这样一个题目,在屏幕上输出九九乘法表。我相信大多数人的解法都会是使用两个for循环,两个变量,一个if判断语句用来判断什么时候换行。问题1:在屏幕上输出一个九九乘法表。代码int main(){ int i = 0; int j = 0; for (i = 1; i <= 9; i++) { for (j =

2017-03-08 17:45:06 33220 1

原创 红黑树C++实现以及与AVL树的区别

简介红黑树也是二叉搜索树的一种,所以它也满足二叉搜索树的各类性质。但是红黑树还要同时满足下面几种规则。在STL深度剖析中给出了四个规则:1.结点不是红色就是黑色; 2.根结点是黑色; 3.如果结点是红色的,那么它的两个孩子要为黑色; 4.任一结点到NULL结点即尾结点的任何路径,经过黑色结点的个数相同。其实满足这些性质之后还是可能产生不平衡的状态即两棵子树的高度差在1以上,但是可以确保没有一条

2017-03-07 20:14:34 1118

原创 AVL树的C++实现

简介AVL树本质上是一颗二叉搜索树,但是它和普通的二叉搜索树不同的是它的每一个结点的两个子树的高度差不超过一,所以AVL树也叫做平衡二叉树,如果删除或者插入一个结点使其高度差变化,就要对其进行旋转再使它平衡。这样就解决了二叉搜索树链表化后(类似下图第三种情况)中各类操作中的时间复杂度的提高的状况。结构定义和普通的二叉搜索树一样,AVL树的结点中包含左右孩子结点,key值与value值,不同的是AVL

2017-03-04 22:15:14 636

原创 二叉搜索树的C++实现

简介二叉搜索树(BST)是满足以下几个性质的二叉树: 1.它的每个结点都有一个关键值(key),且每个结点的key各不相同; 2.若左子树不为空,则左子树上所有结点的key均小于它的根结点的key; 3.若右子树不为空,则右子树上所有结点的key均大于它的根结点的key; 4.左右子树也都为二叉搜索数; 5.空树也是二叉搜索树。如图 BST结点的定义二叉搜索树(BST)也是一颗二叉树,拥

2017-03-02 09:51:49 472

空空如也

空空如也

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

TA关注的人

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