随笔分类 -  算法/数据结构

摘要:1. 思路 有的人一看到这个题,很简单嘛最麻烦的就是从头遍历一遍的事情嘛. 不过要看清楚题! 40亿个无符号整数. 我们生活中1G内存占用的字节数1024*1024*1024为1073741824个字节.粗略就是10亿个字节. 而40亿个无符号整数是160亿个字节. 也就是这些数据存储下来需要16G 阅读全文
posted @ 2018-05-29 14:45 Fate0729 阅读(926) 评论(0) 推荐(1) 编辑
摘要:1. vector实现框架 2. 空间配置器 空间配置器方面的内容在之前的博客已进行详细说明,查看->STL空间配置器解析和实现. 3. 内存基本处理工具 (1)对象构造 (2)Destroy()函数的泛化和特化版本实现,主要体现对象T是否包含trivial construct (3)迭代器范围赋值 阅读全文
posted @ 2018-05-29 14:28 Fate0729 阅读(1338) 评论(0) 推荐(0) 编辑
摘要:哈希(散列)技术既是一种存储方法,也是一种查找方法。然而它与线性表、树、图等结构不同的是,前面几种结构,数据元素之间都存在某种逻辑关系,可以用连线图示表示出来,而哈希技术的记录之间不存在什么逻辑关系,它只与关键字有关联。因此,哈希主要是面向查找的存储结构。哈希技术最适合的求解问题是查找与给定值相等的 阅读全文
posted @ 2018-05-26 13:49 Fate0729 阅读(529) 评论(0) 推荐(1) 编辑
摘要:排序(Sorting),特别是高效的排序一直是计算机工作学习和研究的重要课题之一,排序有内部排序和外部排序之分,若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序,反之则为外部排序。本篇将对常用排序算法进行总结。 在进行排序总结之前先介绍测试中常用到的生成随机数方法和计算执行时间的方法。 阅读全文
posted @ 2018-04-26 15:41 Fate0729 阅读(352) 评论(0) 推荐(2) 编辑
摘要:普里姆算法介绍 普里姆(Prim)算法,是用来求加权连通图的最小生成树算法 基本思想:对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边 阅读全文
posted @ 2018-04-23 17:05 Fate0729 阅读(7309) 评论(0) 推荐(0) 编辑
摘要:数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解。 邻接无向图 1. 邻接表无向图介绍 邻接表无向图是指通过邻接表表示的无向图。 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),( 阅读全文
posted @ 2018-04-23 12:35 Fate0729 阅读(6813) 评论(0) 推荐(0) 编辑
摘要:一 图的定义 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 在图中需要注意的是: (1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex) 阅读全文
posted @ 2018-04-21 22:44 Fate0729 阅读(14005) 评论(1) 推荐(10) 编辑
摘要:一 二叉树如何表示四则运算 1.1 表达式转换为二叉树 上图是表达式“3+2*9-16/4”转换成的二叉树,观察表达式,可以看出: (1)操作数都是叶子节点; (2)运算符都是内部节点; (3)优先运算的操作符都在树下方,而相对优先级较低的减法(根节点)运算则最后运算。 从上往下看,这棵二叉树可以理 阅读全文
posted @ 2018-04-20 23:59 Fate0729 阅读(5141) 评论(0) 推荐(0) 编辑
摘要:二叉树 ①每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。 ②左子树和右子树是有顺序的,次序不能任意颠倒。 ③即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。 1. 二叉树的顺序存储结构 二叉树的顺序存储结构就是用一维数组存储二叉树中的结点。结点的存储位置,也就是数组的下标要能体 阅读全文
posted @ 2018-04-20 13:56 Fate0729 阅读(756) 评论(0) 推荐(0) 编辑
摘要:一 C++标准库queue (1)成员函数 (2)示例 二 C++实现队列 阅读全文
posted @ 2018-04-19 13:33 Fate0729 阅读(260) 评论(0) 推荐(1) 编辑
摘要:一 标准库stack的使用 (1)stack成员函数 (2)示例 二 C++实现栈 数组实现的栈,能存储任意类型的数据 阅读全文
posted @ 2018-04-19 13:22 Fate0729 阅读(284) 评论(0) 推荐(1) 编辑
摘要:一 循环链表基础 在单链表中,有了头结点,我们可以在O(1)时间访问到第一个节点,但如果要访问最后一个节点却需要O(n)的时间,因为我们需要对整个链表进行一次遍历。在循环链表中,我们可以借助尾节点来实现,即不用头指针,而是用指向终端结点的尾指针来表示循环链表,这时候无论是查找第一个节点还是最后一个节 阅读全文
posted @ 2018-04-19 12:55 Fate0729 阅读(742) 评论(0) 推荐(1) 编辑
摘要:一 数组 数组中稍微复杂一点的是多维数组和动态数组。对于C语言而言,多维数组本质上也是通过一维数组实现的。至于动态数组,是指数组的容量能动态增长的数组;对于C语言而言,若要提供动态数组,需要手动实现;而对于C++而言,STL提供了vector。 1.1 vector使用 (1)构造函数 vector 阅读全文
posted @ 2018-04-18 16:37 Fate0729 阅读(967) 评论(0) 推荐(1) 编辑
摘要:一 题目:合并两个排序的链表 二 代码实现 将链表换成数组做简单的循环和递归测试 (1)循环实现 (2)递归实现 阅读全文
posted @ 2018-04-18 15:12 Fate0729 阅读(270) 评论(0) 推荐(0) 编辑
摘要:一 题目:链表的倒数第K个结点 二 解题思路 抛开常规解法,采用只遍历一次就能找到倒数第k个结点,可以定义两个指针: (1)第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动; (2)从第k步开始,第二个指针也开始从链表的头指针开始遍历; (3)由于两个指针的距离保持在k-1,当第一个 阅读全文
posted @ 2018-04-17 16:06 Fate0729 阅读(172) 评论(0) 推荐(0) 编辑
摘要:一 题目:调整数组顺序使奇数位于偶数前面 二 解题思路 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于每碰到一个偶数就需要移动O(n)个数字,因此总的 阅读全文
posted @ 2018-04-17 13:42 Fate0729 阅读(1720) 评论(2) 推荐(0) 编辑
摘要:一 题目:数值的整数次方 二 实现思路 (1)当指数为负数的时候:可以先对指数求绝对值,然后算出次方的结果之后再取倒数。 (2)当底数(base)是零且指数是负数的时候:通过全局代码或异常告诉调用者参数有误。 (3)0的0次方的时候:由于0的0次方在数学上是没有意义的,因此无论是输出0还是1都是可以 阅读全文
posted @ 2018-04-16 15:53 Fate0729 阅读(249) 评论(0) 推荐(0) 编辑
摘要:一 题目:打印1到最大的n位数 二 不考虑大数解法 三 字符串模拟算法解法 解决这个问题需要表达一个大数。最常用也是最容易的方法是用字符串或者数组表达大数。该算法的步骤如下: Step1.把字符串中的每一个数字都初始化为'0'; Step2.每一次为字符串表示的数字加1,再打印出来; 阅读全文
posted @ 2018-04-15 22:09 Fate0729 阅读(194) 评论(0) 推荐(0) 编辑
摘要:一 题目:二进制中1的个数 二 可能引起死循环的解法 00001010>>2=00000010 10001010>>3=11110001 那么,问题来了:上面的方法如果输入一个负数,比如0x80000000,如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。 三 避免死循环的 阅读全文
posted @ 2018-04-14 21:19 Fate0729 阅读(372) 评论(0) 推荐(0) 编辑
摘要:一 题目:斐波那契数列 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时候,大多都会用Fibonacci作为例子,因此我们会对这种解法烂熟于心 上述递归的解法有很严重的效率问题,通过求解第10项的调用过程图来分析: 从上图中不难发现:在这棵树中有很多结点是重复的,而且重 阅读全文
posted @ 2018-04-14 18:00 Fate0729 阅读(250) 评论(0) 推荐(0) 编辑