算法及数据结构
G机器猫
致力于软件技术研发.
展开
-
递归剖析及应用
1.1.1 概念一些操作可以分解为很多相同的更小的操作,这个时候我们可以使用递归,一般来说,这样的操作也可以使用迭代完成,但是递归可能更简洁。递归的难点在于,递归要一直在微观和宏观之间切换,这会造成一些初学者很难找到里面的规律。为了说明白刚才这句话,我们做以下几个定义:整体 – 要处理的对象,如二叉树单元 – 分解为的最小操作对象,如节点余部 – 由单元组成原创 2012-12-28 22:10:37 · 606 阅读 · 0 评论 -
求二进制数中1的个数
问题描述任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的算法,但我相信很少有人见到本文中所有的算法。如果您上头上有更好的算法,或者本文没有提到的算法,请不要吝惜您的代码,分享的时候,也转载 2013-12-08 20:21:42 · 1075 阅读 · 1 评论 -
最小生成树
常用的有三种方法相关代码,请参考《北大ACM2485 - Highways(最小生成树)》朴素Prim算法Prim算法思路从任意一个顶点(它就是最后生成树的根结点)开始,首先设置和它相邻顶点的权值(指该顶点和相邻顶点已知长度最小边的长度;初始值是无穷大),然后将所有未加入生成树顶点中权值最小的顶点加入到生成树中,然后更新新加入生成树顶点相邻顶点的权值;依次执行,直到所有顶点原创 2013-03-13 20:58:17 · 950 阅读 · 0 评论 -
不相交集合
不相交集合用于对集合的一种操作,对不相交集合主要四个主要点和两个关键词:四个主要点1. 集合的表示方法2. 创建集合3. 获得某个元素所在集合的代表4. 合并两个集合两个关键词1. 按秩合并2. 路径压缩集合的表示方法链表表示法和有根数表示法。链表表示法链表表示方法,它是最简单的表示方法,也是最容易想到的方法。它的其他原创 2013-03-13 17:17:59 · 1408 阅读 · 0 评论 -
排序算法分析
根据复杂度一般可以分为三种O(n2):插入排序、冒泡排序;O(nlgn):归并排序、快速排序、堆排序等;O(n):计数排序、基数排序、桶排序;我们主要对常用算法进行分析。归并排序归并排序主要思路是:当一个数组左边有序,右边也有序,那合并这两个有序数组就完成了排序。如何让左右两边有序了?用递归!这样递归下去,合并上来就是归并排序。代码如下:#inclu原创 2013-02-22 22:59:11 · 532 阅读 · 0 评论 -
二叉树 - 定义及数学性质
定义满二叉树:每个内节点都有两个孩子。完全二叉树:除了最后一层叶子外的二叉树是满二叉树,最后一层叶子都连续地集中在最左边。平衡二叉树:树的两个子树的高度差不超过1。赫夫曼树:带路径权值的树,权值越高的越靠近根。高度:高度不包括根结点,及如果根结点无左右子树,则高度为0。数学性质性质一:高度为h的二叉树至多有2h个叶子结点证明略。性质二:高度为原创 2013-02-20 15:10:12 · 2682 阅读 · 0 评论 -
二叉堆
性质二叉堆是完全二叉树,所以,它符合完全二叉树的性质,可以参阅http://blog.csdn.net/gykimo/article/details/8594297。另外二叉堆(大堆)要求每个结点的值大于它所有子孙结点的值,也就是最大值就是根结点。保持最大堆的性质也就是判断某个结点的值是否大于它的两个孩子的大小,如果不是,则不符合最大堆性质,需要该结点和两个孩子中的较大的结原创 2013-02-20 17:48:53 · 1016 阅读 · 0 评论 -
简单算法 - 链表逆序思路详解
1.1.1 链表逆序1.1.1.1 思路如A->B->C->D->E一般会有以下两种思路,如下思路一:先取出链表的最后一个E,然后将E作为新链表的头,现在状态为原始链表:A->B->C->D新链表:E再取出原来链表的最后一个D,然后将D插入到新链表的最后位置,现在状态为原始链表:A->B->C新链表:原创 2012-12-12 18:20:16 · 15967 阅读 · 0 评论 -
简单算法 - 链表是否有环-两链表是否相交
原文: http://blog.csdn.net/fty8788/article/details/6531280有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?解答:1、最简单的方法, 用一个指针遍历链表, 每遇转载 2012-12-13 16:25:28 · 607 阅读 · 0 评论 -
简单算法 - 交换两个整数的三种方法
如何交换两个整数是个再平常不过的问题,这里给出三种方法。第一种就是大家最熟知的使用tmp,后两种不使用第三变量。//演示交换两个整数的三种方法#include using namespace std;int main(){ //方法一,使用第三方变量 int a = 10; int b = 5; cout cout int tmp = a;转载 2013-01-06 13:25:35 · 1657 阅读 · 0 评论 -
简单算法 - 找到链表的中间点和倒数第K个节点(普通方法和快慢指针方法开销一样)
1.1.1 单向链表的中间节点思路一先遍历一次链表,得到链表长度,求出中间节点的位置,再从链表头开始遍历,直到找到中间节点的位置。复杂度大概是O(3/2n), 思路二设置两个指针从链表头节点开始往下遍历,其中一个指针一次往下走2个节点,一个指针一次往下走一个节点,当快的指针到达最后一个时,慢的指针正好到达中间的节点。复杂度大概为O(n) 比较原创 2012-12-13 13:24:02 · 1243 阅读 · 0 评论 -
简单算法 - 用两个栈实现一个队列
原文:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html 两年前从网上看到一道面试题:用两个栈(Stack)实现一个队列(Queue)。觉得不错,就经常拿来面试,几年下来,做此题的应该有几十人了。通过对面试者的表现和反应,有一些统计和感受,在此做个小结。 用C++描述,题目大致是这样的:转载 2012-12-14 19:00:23 · 629 阅读 · 0 评论 -
简单算法 - 两个队列实现一个栈
class Stack{…public: void Push(int x); // Push an element in stack; int Pop(); // Pop an element out of stack;… private: Queue q1; Queue q2; }原创 2012-12-14 19:25:41 · 760 阅读 · 0 评论 -
Prim、Kruskal、Prim+Heap算法效率实测
评测环境:WindowsXP,FreePascal2.40,Pentium(R) Dual-Core CPU T4300@2.10GHz,2G内存通过上图可以看出:1.Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣。2.Prim+Heap在任何时候都有令人满意的的时间复杂度,但是代价是空间消耗极大。【以及代码很复杂>_3.时间复杂度并转载 2013-01-24 15:14:31 · 6653 阅读 · 4 评论 -
枚举 备忘录法 最优规划对比
可以参考案例北大ACM1163 - The Triangle(枚举法&备忘录法&动态规划)http://blog.csdn.net/gykimo/article/details/8457011 1.1.1 什么是自顶向下和自底向上自顶向下是我要达到什么目标,然后分析需要什么次级目标,为了达到次级目标还需要更次级目标,依此类推。类似于领导分配任务,领导原创 2013-01-01 12:14:44 · 1526 阅读 · 0 评论 -
稳定排序和不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相转载 2013-12-08 19:00:34 · 673 阅读 · 0 评论