数据结构与算法
我不是照耀
这个作者很懒,什么都没留下…
展开
-
基于计数栈的非递归二叉树遍历算法
背景遍历算法一般可按深度优先或广度优先进行。对于二叉树,深度优先遍历可分为前序、中序、后序遍历,而广度优先遍历对应于层先遍历。二叉树的三种深度优先遍历的递归算法和层先遍历都十分简洁。可是二叉树的三种非递归深度优先遍历算法却抽象而难于理解,并且各自区别,形式上并不统一。本文从另一种视角观察二叉树遍历的实质,给出一种基于计数栈的非递归二叉树遍历算法。该算法易于理解和记忆,并且将三种深搜遍历原创 2013-12-12 18:42:03 · 853 阅读 · 0 评论 -
关于随机问题的一些思路
http://docs.unity3d.com/Manual/RandomNumbers.html转载 2014-06-14 13:22:58 · 754 阅读 · 0 评论 -
数列中和为定值的所有组合
问题描述输入两个整数 n 和 m,从数列1,2,3……n中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。算法思路马上要去面试,先把思路暂时放这里回来整理……利用分治的思想,缩小问题规模,迭代解决问题m是定值,n才是标志规模的量,所以希望每次缩小n的规模(n-1)对于f(m, n),其结果是一个集合r,每个元素是一个数组这个集合等于f(m, n-1)原创 2014-03-07 11:37:37 · 2075 阅读 · 0 评论 -
0-1背包问题
问题描述有n个物品,对于第i个物品,重量为wi,价值为vi有一个背包,能装的总重量为W求一种组合使背包装的物品价值最大算法设该算法为f(i, w),返回值是该条件下能装物品价值的最大值(至于组合,在算法中再具体记录)其中,i表示只在前i种物品中选择,w表示能装的最大重量为w,所以该问题即求f(n, W)当i > w时,f(i, w) = f(i-1, w)即,当i物原创 2014-03-08 11:15:51 · 569 阅读 · 0 评论 -
结构体占用的内存大小
问题描述给出一个结构体定义,求出这个结构体占用的内存大小概念铺垫对齐将内存划分为很多格子(一个格子占用好几byte),新的数据元素放到新的格子,而不和前面的元素挤到相同的格子里系统默认值不同的操作系统会有不同的默认对齐值,比如4元素对齐值不同元素有自己的一个对齐值,比如char为1,int为4,double为8两次对齐结构体占用的内存大小由数据元素,数据元素原创 2014-03-12 13:21:48 · 1317 阅读 · 0 评论 -
洗牌 无重复随机数 有限随机分配问题
问题描述1 将一个序列打乱2 在一组不重复数中随机不重复地选出几个3 将一定的资源m随机分为n份,每份最多分得x问题分析以上三个问题的解法可以归位一类,即随机选数+排除随机选数使用数组效率高,但是排除似乎链表效率更高但是实际上,在不要求保持原始数据顺序的情况下,数组可以同时在随机选数、排除、保存结果问题上保持高效率算法均使用数组1 对于n的数组,随机选择第i原创 2014-03-06 21:56:46 · 846 阅读 · 0 评论 -
动态规划解最长公共子序列问题
问题描述一个序列A和一个序列B,求出最长公共子序列C算法记该算法为f(A, B)将序列A拆为A’:x,x为A的最后一个元素,A’为A的剩余部分序列同理,B拆为B’:y若x = y,则C = f(A', B'):x若x != y,则C = max( f(A', B), f(A, B'))算法原理记C可拆为C':z原创 2014-03-06 08:57:13 · 765 阅读 · 0 评论 -
数组循环移位
问题描述有一个长度为m的数组a,循环左移或右移n为算法三次逆置法1 若循环左移,则将左边长度为n的子数组和右边剩下的子数组分别逆置2 若循环右移,则将右边长度为n的子数组和左边剩下的子数组分别逆置3 再将整个数组分别逆置复杂度时间o(n)空间o(1)算法演示数组:123456789循环左移3位逆置1:321456789逆置2:32198765原创 2014-03-07 08:50:14 · 626 阅读 · 0 评论 -
Joseph环问题
问题描述n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。算法int JosephCircle(int n, int m) { int ret; if (n == 0) ret = 0;原创 2014-03-06 12:35:38 · 1883 阅读 · 0 评论 -
找出过半定值数
问题描述现在有一个长度为n的数组a,里面有超过一半的整数为一个定值,在不用排序,不开辟新 数组的情况下,用最快的算法找出来这个数算法设立一个计数器,初值为1记数组的第一个数为可能值,从下一个数开始顺序扫描数组如果与可能值相同,则计数器+1如果与可能值不同,则计数器-1如果计数器归0,对数组剩余部分再次运用该算法算法原理用一个故事来描述在一片土地上有很多部原创 2014-03-06 10:43:21 · 605 阅读 · 0 评论 -
解最长不减子序列问题
问题描述有一个序列A,求出其最长不减子序列C算法1(最长公共子序列法)先将序列排序,得到不减序列B然后求出A、B的最长公共子序列如何求最长公共子序列?算法2(动态规划)先将问题划分为两个层次第一个层次(宏观)1 对于A中每一个元素,求出以该元素结尾的最长不减子序列2 上述所求序列中,长度最长的,即为A的最长不减子序列C原理C的最后一个元素一定是A中的原创 2014-03-06 09:15:59 · 1178 阅读 · 0 评论 -
栈的出栈顺序数
问题描述n个元素顺序进栈,共有多少种出栈顺序答案C(2n, n) / (n + 1)参考卡特兰数(百度百科)卡特兰数(维基百科(英文))原创 2014-03-06 11:29:55 · 668 阅读 · 0 评论 -
动态规划思想
1 解决问题——分治用有限的计算能力处理大规模问题的基本手段1.1 递归问题的解决方法包含递归部分和非递归部分,非递归部分解决问题的一部分,减少问题规模,而递归部分将形式不变,但减小了规模的问题传递到下一轮解决中去。这样,每一轮处理,问题都有一部分(规模)得到解决,一直递归下去(直到终止条件),直到整个问题得到解决1.2 迭代2 空间换时间——缓存子问题答案在解决问原创 2014-03-05 09:00:52 · 555 阅读 · 0 评论 -
二叉树三序互推(简述)
只有已知中序,结果才确定中序用于构建树的时候左右划分,比如ABCDE,给出根节点是C,那么左边包含AB,右边包含DE前序或后序用于依次给出根节点前序从前往后给出根节点后序从后往前给出根节点原创 2014-03-01 05:57:36 · 731 阅读 · 0 评论 -
零钱组合问题
问题描述给定一组零钱面额,比如1、2、5,g算法算法思路原创 2014-09-18 00:21:03 · 831 阅读 · 0 评论