自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(160)
  • 资源 (3)
  • 问答 (2)
  • 收藏
  • 关注

原创 STL剖析——空间配置器

近来闲来无趣,看了下STL的空间配置器。首先恭喜我入坑,网上无数的人都在剖析这STL的空间配置器,所以,刚好,今天我也加入了这个团队,这个应该是我目前看到的比较完整架构的一个源码了吧,希望能提示我的水平,毕竟设计的很好。在这里特别说下,没有操作系统的知识,所以在这里的线程和锁的这些问题,我们一概不讨论STL的空间配置器,就是一个为了给容器进行分配内存和管理内存的东西,容许我盗几张图给大家说明。 这

2016-12-09 12:59:15 880

原创 回忆智能指针

今天去回想了一下智能指针,发现长时间不用,好多知识点都忘记了,所以在这里写一篇博客记录一下。C++当中没有自动内存回收机制,这样每次new出来的内存都需要我们手动的去delete,这样就会存在忘记的可能性,最终造成内存的泄漏。,所以为了解决这个问题,C++引入了智能指针。std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_a

2016-12-05 11:13:57 433

原创 内存池——实现一个简单的固定大小的内存池

最近在STL当中看到了第二级内存分配器,这里有个内存池的内容,在这在知乎上看到了内存池的相关内容,所以萌生了一个想自己写一个简单的内存池的想法。这种简单的内存池,援引自知乎的: 实现固定内存分配器: 即实现一个 FreeList,每个 FreeList 用于分配固定大小的内存块,比如用于分配 32字节对象的固定内存分配器,之类的。每个固定内存分配器里面有两个链表,OpenList 用于存储

2016-12-04 21:48:23 4157 1

原创 二叉树——面试题

1.求二叉树中最远的两个节点的距离在这我们首先来分析思路,对于最远的两个节点,在这会有两种情况。1)如果root为NULL,那么这是一颗空树。空树的最远子节点距离和高度均为零。 2),如果root非空,最大距离要么是左子树中的最大距离,要么是右子树中的最大距离,要么是左子树节点中到根节点的最大距离+右子树节点中到根节点的最大距离,同时记录左子树和右子树节点中到根节点的最大距离。 示例代码://求

2016-11-30 12:33:21 1212

原创 归并法外排序—海量数据排序

1.外归并排序讲完了内排序,我们来了解一下,外归并排序,外归并排序一般是应对于数据量非常大的数据,这些数据放在硬盘上,无法一次性的放到内存上。所以,我们通常采用的思路对于这些数据就是进行切分,然后对切分出来的文件进行排序。在排序的时候,小文件我们采用快排来排序,如果是大文件,我们就从两个文件中一个一个读取,然后进行归并排序,放入合并以后的文件当中,最后最大的文件就是排序以后的结果。外排序是指在排序期

2016-11-29 20:10:55 3130 1

原创 从一道小米面试题看并查集

首先,我们从一道题来引出这个问题。假如已知有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属于另一个朋

2016-11-26 22:06:12 1563 1

原创 非比较排序—计数排序和基数排序

讲述完了比较排序以后,我们来看一下非比较排序。1.计数排序实现计数排序是一种稳定的排序算法,计数排序实现简单。它算法的步骤是:1)首先找出序列当中的最大和最小的数,然后通过这两个数确定一个范围,这样就可以直接建立一个范围这么大的哈希表。 2)把数对应哈希表的下标,统计次数。 3)通过哈希表,从小到大进行遍历,然后按哈希表顺序写入序列当中。 示例代码:#pragma once#define _C

2016-11-26 19:37:16 663

原创 分析归并排序

对于归并排序而言,我们应该需要关注一下思想,归并也是一种分治的思想,类似与快速排序,但是又和快速排序有本质的区别。归并排序归并排序将要排序的序列分成两个长度相等的子序列,然后对每一个子序列进行拆分,一直到只有两个元素的两个子序列,对这两个子序列进行归并,将它们合并成一个序列,这种方法就是所说的二路归并的方法。实现归并排序的思路: 所以,综合下来,我们实现代码://递归解决归并排序templat

2016-11-24 09:25:04 802

原创 选择排序及其优化

选择排序是八大内部排序方法中的一种,选择排序的整体的思想就是,我们在一个序列当中选出一个最大的(升序为最小的),然后和第一个元素交换,然后后面再在剩下的找最大的,再和第二个元素交换。这样最终就可以得到一个有序的序列。我们最先接触的就是这种写法。//Cpp版本template<typename T>void SelectSort(T* arr,int n){ int max = 0;

2016-11-23 22:22:22 9819 3

原创 快速排序及其优化

我们今天来研究下快速排序,快速排序的一个整体的思想就是分治的思想,在这个过程当中,首先对一个大区间进行单趟快速排序,然后把大区间分成多个区间,再去进行单趟排序,一直到这个区间中的元素只剩下一个元素,这样重复以后就可以得到最后的排序后的结果。 1.单趟排序分析快速排序的最重要的就是单趟排序,接下来就是进行分治的单趟排序,所以我们来重点说一下单趟排序。我们在这里介绍关于快速排序的单趟排序的三种方法。左

2016-11-23 22:13:46 2534 1

原创 从直接插入排序到希尔排序

希尔排序需要和直接插入排序我们来联合起来进行比较。1.直接插入排序首先我们来看直接插入排序: 直接插入排序就是一个将无序区的内容向有序区放的一个过程,有序区不断地变大,无序区不断的变小,这样最后全部变为有序,就完成了直接插入排序的过程了。算法步骤:1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序

2016-11-17 14:15:17 1035

原创 浅析——B树,B+树,B*树以及分析MySQL的两种引擎

接触到了数据结构当中的B树,B+树,B*树,我觉得应该写一篇博客记录下,毕竟是第一次接触的,只有写了博客以后,感觉对这个的印象才会更加深刻。 前言: 为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢?这个要从几个方面来说了, 计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 所以当你用红黑树的时

2016-11-17 13:52:50 18053 5

原创 初识STL——set,multiset,map,multimap

最近在学习STL,在前期分析了vector和list的源码,印象很深,感觉对自己以后的代码之路产生了很多改变,今天,介绍下STL当中的几个关联式容器。本博客所有论述的都为SGI版本的STL。1.什么是关联式容器关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及po

2016-11-13 15:08:59 1522

原创 海量数据分析问题总结

1)给⼀个超过100G⼤⼩的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?第一题:首先我们的思路就是利用哈希进行文件的切分,我们把100G大小的logfile分为1000份,那么下来差不多没一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。2)与上题

2016-11-10 13:36:13 1777 1

原创 哈希拓展——布隆过滤器

哈希表的另外一个应用是布隆过滤器。1.什么是布隆过滤器关于布隆过滤器,我们需要讲很多关于它的东西,首先我们可以知道这个东西是个叫做布隆的人发现的,它一般用于解决网络爬虫重复问题,还有比如防垃圾邮件或垃圾网页的实现,都可以利用它。布隆过滤器也是针对的是哈希冲突,可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有

2016-11-08 16:32:45 1318

原创 哈希的拓展——位图

关于哈希表,我们需要拓展一些知识,在这有一个位图需要我们理解。首先我们来看一道腾讯的题。 给4 0 亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这4 0 亿个数中。这道题我们怎么做呢?这是一道关于海量数据查找的题,其实这道题,我们就可以和哈希表联系在一起,为何说是海量数据呢,对于一个40亿整数,我们如果要存的话,按照无符号整数来存储,那么下来,大概就需要40亿*4这

2016-11-08 16:01:17 1725

原创 关于哈希表

学习完了有关二叉树的搜索结构,今天我们来接触另外一种结构,叫做哈希表。1.什么是哈希表哈希表:是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。它的所保存的数据和位置会有一种关系,这种关系我们叫做哈希函数。2.构建哈希表的方法常用的构建哈希表的方法有5种。这5种方法分别是: 构建哈希表的方法有: 1)直接定址法

2016-11-08 15:29:36 980

原创 浅析红黑树(一)

1.了解红黑树学习完AVL树,开始了红黑树的学习,关于红黑树,和AVL树是类似的,都是会在我们进行插入操作或者删除操作以后会进行一些操作,来使得整个二叉树保持一个平衡。红黑树和AVL树的区别在于一个是依照平衡因子来维持整个树,而红黑树是利用颜色来限定平衡。 自从红黑树出现以后,AVL树就慢慢消失了,原因,会在后面讲解。另外,最为重要的是在STL当中,有很多都应用了红黑树,比如:set, multis

2016-10-30 12:18:17 1963

原创 浅析AVL树

1.为什么提出AVL树学习完搜索二叉树以后,我们应该想到一个问题,如果我们的搜索二叉树的趋向于单链的形式,类似于: 这两种情况随之而来的是时间复杂度太高,当我们在这两种当中搜索,时间复杂度为O(N),所以这样效率大大下降了!2.二叉平衡树概念和结构为了解决上述问题,所以提出了一个概念,叫做二叉平衡树。二叉平衡树,相对于二叉搜索树,引入了一个叫做平衡因子的概念。 平衡因子:平衡因子就是右子树的

2016-10-27 11:03:41 2530

原创 剑指offer—关于判断二叉树是否为平衡二叉树

判断一颗二叉树是否为平衡二叉树,当这到面试题摆在我们眼前的时候,我们需要进行思考,二叉树满足平衡二叉树的条件是什么,就是对于每一个节点,它的右子树深度减去左子树的深度的绝对值必须是小于2才行。对于这个深度差,我们也叫做平衡因子。所以,根据上面的条件,我们可以进行一种最简单的思路,就是我们首先可以对每一个节点进行遍历,然后看它的平衡因子进行比较判断,看它是不是合法。 bool _IsAVLBin

2016-10-23 20:41:17 12374

原创 搜索二叉树

二叉搜索树:它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树有个特点,最左的是最小的节点,最右的是最大的节点。 当我们把二叉搜索树进行中序遍历的时候,它是进行排序后的结果,所以我们也把二叉搜索树叫做排序二叉树。接下来我们介绍二叉

2016-10-21 20:41:24 1726

原创 堆&&堆排序&&N个数中找出K个最大值&&优先级队列

学习二叉树后,有一个东西需要我们来关注下,就是堆,对于堆,来说我们可以把堆看作一颗完全二叉树。这里我们也可以叫做二叉堆。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。另外,需要关注的就是有一个大堆和一个小堆。 大堆就是父节点的数值大于任何一个子节点的数值。 小堆就是父节点的数值小于任何一个子

2016-10-14 12:39:51 3446

原创 线索化二叉树

关于二叉树的线索化的问题,是为了解决平时的节点中空的指针域,所以在这里我们引入了线索化二叉树。利用一些节点当中空的指针域。线索化二叉树的思想是需要一个prev指针来记住前驱,然后通过对cur节点的维护和prev指针分别进行维护。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>using namespace st

2016-10-09 14:37:46 1166

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

二叉树的非递归的实现,其实就是实现二叉树递归的思想,二叉树的递归实现压栈,然后递归,在这里,是通过数据结构栈来实现。1.非递归前序遍历因为二叉树前序遍历是先访问根节点,在访问左节点,再是右节点,所以我们在这里首先循环到最左节点,并且在这个过程中,输出访问的节点,并且把节点入栈,这样就到最左边的节点,然后看最左边节点的左子树,这时为NULL,然后取出栈顶元素。这个时候就回到最左边的节点,然后访问它的右

2016-09-27 15:28:07 1032

原创 简单实现二叉树

简单的实现一个二叉树所需要的基本要求,后续进行其他的更新。二叉树最重要的是递归的思想,在这里我想请你去参考我上一篇的广义表,那个思想比起二叉树来说更加简单一些。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>#include<cassert>#include<queue>using namespace s

2016-09-26 14:10:13 1103

原创 广义表的实现

广义表:广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。毫无疑问,广义表是一种线性表的推广,也有人叫做列表。广义表存储结构广义表中的元素是可以具有不同结构的,所以难以用顺序结构来表示,通常都采用链式的存储结构。在这个结构中我们共有三种类型的节点,一种保存正常值的,一种是头节点,一种是子表节点。 在这里我们来看看下

2016-09-24 14:04:32 1743

原创 关于对称矩阵和稀疏矩阵问题的探究

今天我们来探讨下对称矩阵和稀疏矩阵的问题。 为什么要探讨这个问题呢,其实主要是为了他们的一些性质我们可以善加利用。1.对称矩阵对称矩阵:关于对称矩阵,元素以主对角线为对称轴对应相等的矩阵。 例如所以综合以上特点,我们就可以来想办法保存这个对称的矩阵,因为上面这个矩阵的上半部分和下半部分是一样的,所以在这里我们只需要保存一半,然后我们将对角线也进行保存就好了,所以,在这里,我们所以思路就是我们先对

2016-09-24 11:36:18 2664

原创 关于队列和栈的几道面试题

关于队列和栈的几道面试题今天来说几道简单的栈和队列相关的几道面试题:1 . 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O (1 )第一道题,我们需要分析,我想一般的思维肯定是想到,开辟一块空间,进行保存最小值,这种方法也是大家通常地一下就可以想到的。但是在这里会有一个问题,就是如果你的最小值在栈顶,当你pop了栈顶以后,下面的数据中最小的元素就

2016-09-18 16:00:49 2490 2

原创 C语言实现封装,继承

1.C语言实现封装在C语言当中,是不存在封装这一个特性的,我们要实现它,我们可以借助两个方法:1.利用C语言中的头文件,在头文件中进行声明,在C文件中对它进行定义,这样就可以隐藏内部信息,用户只能看到接口和公开的信息,无法知道对象所占内存等。 示例代码:头文件:#define _CRT_SECURE_NO_WARNINGS 1//在这里,头文件中给出了声明,用户只能看到公有部分和函数接口。#i

2016-09-17 14:34:50 12378

原创 逆波兰表达式求值

逆波兰表达式:也被称作后缀表达式,在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。而逆波兰表达式,它的每个运算符总是和它前面的两个运算数进行结合。接下来我们来探讨一下逆波兰表达式求值的问题。1.确定保存形式在这里,我们利用枚举常量巧妙地来通用所有的元素。enum Type{ OP_SYMBOL, OP_NUMBER, ADD,

2016-09-11 22:02:07 1730

原创 回溯法解决迷宫问题

迷宫问题,是一个非常经典的问题,我们通过栈这种数据结构来解决这个问题。1.设计思路我们这里采用回溯法解决迷宫问题,即从入口出发,顺某一方向试探,若能走通,则继续往前走,否则原路返回,换另一个方向继续试探,直至走出去为止。2.剖析实例例如,我们给定下面这样的迷宫:1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 10 0 0 1 1 1 1 1 1 11 1 0 1 1

2016-09-10 13:16:35 7057 1

原创 C++之类型萃取技巧

在我们前面写顺序表的时候会产生一个问题。使用类型萃取的原因就是当你的顺序表是自定义类型,我们进行顺序表增容的时候,这个时候会出现一个问题,比如string类型,这个类型中有一个_buf与_ptr,当储存少于16个的时候这时会储存在_buf当中的,如果多于16个,那个会单独开辟空间,进行储存,这时拷贝的时候就是拷贝过去这个储存的地址而已,所以这样调用析构函数的时候,当增加容量的时候,这个时候会把储存s

2016-09-10 12:13:31 1146 1

原创 模板模拟实现stack和queue

在这里我们接下来实现两个数据结构,一个是stack,一个是queuestack和queue数据特性?毫无疑问,我想每一个学过数据结构的人都可以脱口而出,栈的数据特性采用的是先进后出,而队列采用的时候先进先出。 stack和queue采用什么类型的数据结构?我们来这样思考,对于栈来说,我们最多需要操作的是栈顶,如果我们采用链式的方式,就需要从头一直遍历到尾部,然后才能再次进行维护。而如果我们采用

2016-09-10 10:57:20 1167

原创 python入门学习(二)

python中提供了许多数据类型让我们来使用,接下来简单的来介绍几个1.listPython内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。list=['haha','hehe']用len()函数可以获得list元素的个数 len(list名)list类似于数组,可以进行索引list[-1]这个就是最后一个元素,以此类推,-2,-3 当然可以给lis

2016-09-08 17:26:42 435

原创 python入门学习(一)

这几天开始了python的自学环节,既然都学了,不来写一写博客心里面还是觉得不是太舒服。python的变量定义python中的变量定义非常简单,可以直接定义就可以了。a=10b=50c=a+bprint(c)python就是这么方便,的确是简单,易用啊。python的判断语句python的判断语句使用也是非常简单num =20if num%2==0: print("num是偶数")

2016-09-06 20:51:57 523

原创 C++知识点部分总结

把最近C++的知识点做了一下总结,有需要的,有问题的,可以发邮件到[email protected]。本人水平有限,难免会出现一些错误,希望大家如有发现,能够及时指出纠正

2016-09-05 14:38:10 632

原创 利用仿函数实现定制删除器

1.仿函数首先我们需要知道什么是仿函数。 仿函数:仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 示例:#include<iostream>#include<cstdlib>using namespace std;class Print{public: void opera

2016-09-04 11:21:20 558

原创 shared_ptr循环引用问题

我们大家都知道shared_ptr是采用引用计数的方式进行。但是它存在一个问题:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<cstdlib>#include<boost/shared_ptr.hpp>using namespace std;struct Node{ ~Node() { co

2016-09-04 08:58:11 4180

原创 python开发环境搭建

python集成开发环境的搭建首先,我们需要上到网站www.python.org,在这里面我们可以下载想要的版本,windows,linux等都有。一般python大家都用的是2.7版本,所以在这里推荐2.7的版本。 然后接下来我们需要去http://www.jetbrains.com/下载IDE pycharm把两个文件最后全部安装就好了。python下的hello world首先打开桌面安

2016-09-03 09:56:22 454

原创 C++当中的几种强制类型转换

在C++当中,我们不推荐继续使用C类型的强制转化,而是使用标准C++的类型转换符,标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。static_cast只要是不包含底层的const,我们都可以使用static_cast,当需要一个较大的算数类型赋值给较小的类型的时候,这个时候static

2016-08-31 14:50:32 696

技术之瞳 阿里巴巴技术笔试心得 高清完整.pdf版下载

从别处花钱买来

2017-02-13

计算机科学导论

《计算机科学导论》是2009年机械工业出版社出版的图书,由佛罗赞编写。

2015-12-28

业余者用VC(MFC)编写串口调试助手

利用VC++6.0MFC做的串口助手,教程都在这里面。

2015-12-06

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

TA关注的人

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