自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 求最小生成树的克鲁斯卡尔(Kruskal)算法

Kruskal算法是利用贪心算法,每一次选出最小边加入生成树中,并利用并查集判断是否有回路,若有回路,则不能生成树,需要注意的是,这里在比较两条边的大小时 ,要使用权值进行比较。 【贪心算法】是指在问题求解时,总是做出当前看起来最好的选择。也就是说贪心算法做出的不是整体最优的的选择,而是某种意义上的 局部最优解。贪心算法不是对所有的问题都能得到整体最优解。根据上述分析给出代码://最小生成树

2017-11-30 18:03:38 943

原创 【数据结构】:图

概念: 图是另一种非线性结构,由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构。 完全图:在由n个顶点组成的无向图中,若有N(N-1)/2条边,则称为无向完全图。(也就是说任意两个顶点间都有边相连)权重:在一些图中,边具有与之相关的数值,称为权重。(权重可以表示从一个顶点到另一个顶点的距离/花费的代价/所需的时间/次数等)临接顶点:如果(u,v)是图中的一条边,则u和v互为临接

2017-11-29 09:13:52 1153

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

题目:加入已知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属于另一个朋友圈。结果为2个朋友圈。这道题目的求解需要用到一种数

2017-11-28 20:06:55 1630

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

计数排序 计数排序的基本思想: 给一个需要排序的数组,选出数组中的最大值和最小值确定这个数组的范围,新开辟一个这个范围大小的数组空间,这个临时数组中存储的是原来数组中各个元素出现的次数,最后再根据元素出现的次数将元素拷回原数组,此时,原数组有序。 代码实现://计数排序void CountSort(int* a, int n){ assert(a); int max =

2017-11-28 17:00:47 379

原创 浅谈B-树、B+树

B树数据库的索引大多用B+树实现,要了解B+树,我们必须先了解什么是B-树? 首先要清楚的是,B-树不能叫做B减树,否则可就让人笑掉大牙了,所以,后文中我们直接用作B树。 之前我们讲过,二叉搜索树的效率是O(log2^N),那为何数据库中不用二叉搜索树来作为索引呢?此时我们必须考虑到磁盘IO。数据库索引是存储在磁盘上的,当数据量比加大 的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的

2017-11-25 14:00:00 511

原创 连续数组的最大和

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个数组组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(N)比如,我们给出数组:arr[] = {2,-1,3,-5,-3,5,6,1},第一步加上数字2,此时和为2。接着,2+(-1),和变成1,因为第二个元素是负数,加上它之后,当前的和比上一个元素还要小,所以应该保存上一次的结果,它可能是最大值。1+(3) = 4,此

2017-11-17 16:11:32 406

原创 最小的K个数

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1。6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。这道题类似于之前讲堆的那篇文章中,求公司员工喜欢的前K种水果,那道题我们可以使用最小堆解决,同样的思路,这道题我们可以使用最大堆解决,在最大堆中,根节点的值总是大于它的子树中任意节点的值。所以我们可以在O(1)时间内得到已有的K个数中的最大值,但需要O(logk)时间完成删除

2017-11-16 17:24:01 289

转载 布隆过滤器

Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判

2017-11-15 20:29:40 455

原创 二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径。 比如上面这棵二叉树中,和为22的路径有两条:一条是10、12,另一条路径是10、5、7.分析题意后,可以看出,路径都是从根节点开始打印,所以我们需要前序遍历这棵二叉树,且当我们遍历下一个节点的时候,必须知道在它之前遍历过哪些节点,并将这些节点的值保存起来。当我们

2017-11-15 20:12:12 431

原创 将二叉搜索树转化为双向链表

题目:输入一棵二叉树,将该二叉树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 在二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值,因此,我们在转换成排序双向链表时,原先指向左子节点的指针调整为指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点的指针。 由于要求转换之后的链表时排好序的,我们可以中序遍历树中的每

2017-11-15 19:02:37 924

原创 【数据结构】:哈希表(hashtable)

hashtable—-哈希表,也称散列表,是根据关键字直接访问在内存存储位置的数据结构。它通过一个关键值得函数将所需的数据映射到所需的位置来访问数据,这个映射函数叫散列函数,存放记录的数组叫做散列表。构造哈希表的几种方法。 1,直接定址法—-取关键字的某个线性函数为散列地址,Hash(key)=key或Hash(key)=key%p. 2,除留余数法—-取关键值被某个不大于散列表m的数p除后的所

2017-11-15 15:28:36 683

原创 二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false.假设输入的数组任意两个数字都不相同。 首先,我们知道,二叉搜索树的特点是:左子树的所有节点都小于根节点,右子树的节点都大于根节点。题目所说的是后序遍历这棵二叉树,我们便可以得出结论:数组的最后一个数字一定是这棵二叉搜索树的根节点,它前面的数组元素又可以分为两个区间,比根节点小的是左子

2017-11-13 20:06:17 306

原创 栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序。请判断第二个序列是否为栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。 这道题的规律如下:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助

2017-11-13 11:54:19 406

转载 进程和线程的区别和联系

一、进程进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。    注意,进程一般有三个状态:就绪状态、执行状态和等待状态【或称阻塞状态】;进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系;挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出。进程控制块(PCB):PCB不但可以记录进程的属性信息,

2017-11-12 13:56:08 298

原创 打印1到最大的n位数

题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入数字3,则打印出1,2,3一直到最大的三位数999。这道题中,题目并没有说明n的范围,所以我们需要考虑到大数问题。我们通常用字符串或数组表达大数,字符串里的每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个n+1的字符串(字符串中最后一个是结束字符’\0’)。当实际数字不够n位的时候

2017-11-10 09:27:16 318

原创 数值的整数次方

题目:实现函数double Power(double base,int exp),求base的exp次方。不得使用库函数,同时不需要考虑大数问题。 这道题本身难度不大,但有些细节需要注意。由于题目已经给出了返回值呵参数中的double型,所以在进行判0的时候,就不能再用if(base == 0)这样的处理,而要使用浮点数的判0处理。 再者,exp是整型,所以有可能是0或负数,这些都是需要特殊处理

2017-11-09 17:23:09 418

原创 菲波那切数列的递归与非递归解法以及青蛙跳台阶问题

说到求菲波那切数列中的第n个数,大家首先想到的就是递归解法,简单易懂。long long Fibonacci(int n){ if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2);}但每一次的递归都会是一次函数的调用,会

2017-11-08 16:01:06 713

原创 旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1。 我们可以想到,这个旋转后的数组可以以看成两段有序区间。如上述题目中, 3,4,5是第一个递增区间,后面的1,2是第二个递增区间。并且,这个最小的数一定是两个递增区间的分界线。基于这

2017-11-08 13:55:53 438

转载 【linux】:各目录下的内容和作用

文章转自http://blog.csdn.net/ArchyLi/article/details/78437891 一、概述在早期阶段,各个厂家定义了自己的Linux的系统文件目录,非常混乱,但是在后期,FHS标准规定了Linux下根目录各文件夹的名称以及作用,统一了Linux下文件命名混乱的局面。FHS(英文:Filesystem Hierarchy Standar

2017-11-05 09:45:25 411

原创 map和set的使用以及模拟实现

1,set 我们先来看看STL中set的接口有哪些 set的底层使用红黑树来实现,红黑树是一个不暴露给外界的数据结构,map和set都用它来实现,所以map和set是属于关联式容器。set的特性: 所有的元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,set不允许两个元素有相同的键值。 我们

2017-11-04 23:52:42 1096

原创 高效合并两个有序数组

之前有篇文章是将字符串中的空格替换成字符将字符串中的空格替换成相应的字符,在这篇文章中,我们使用的是从后往前调整数组的方法,时间复杂度为O(N).那么,在合并两条有序数组时,使用同样的思想比分别遍历两个数组要高效的多。题目: 有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中,且合并后所有的数字是已排序的。//合并两个有序数组#

2017-11-02 09:52:24 1629

原创 面试官让你现场写一个string类,该写哪个版本的?

之前的 文章中,我们详细介绍过string类的深浅拷贝的实现以及引用计数,那么如果,在面试过程中你该给面试官展示哪一种string类呢? 今天我们就来写两个适合面试中写的string类1,深拷贝class MyString{public: MyString(char* str = "") :_str(new char[strlen(str) + 1]) {

2017-11-01 17:20:12 711

空空如也

空空如也

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

TA关注的人

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