
数据结构与算法
我不是照耀
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
基于计数栈的非递归二叉树遍历算法
背景 遍历算法一般可按深度优先或广度优先进行。对于二叉树,深度优先遍历可分为前序、中序、后序遍历,而广度优先遍历对应于层先遍历。 二叉树的三种深度优先遍历的递归算法和层先遍历都十分简洁。可是二叉树的三种非递归深度优先遍历算法却抽象而难于理解,并且各自区别,形式上并不统一。 本文从另一种视角观察二叉树遍历的实质,给出一种基于计数栈的非递归二叉树遍历算法。该算法易于理解和记忆,并且将三种深搜遍历原创 2013-12-12 18:42:03 · 915 阅读 · 0 评论 -
关于随机问题的一些思路
http://docs.unity3d.com/Manual/RandomNumbers.html转载 2014-06-14 13:22:58 · 779 阅读 · 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 · 2318 阅读 · 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 · 587 阅读 · 0 评论 -
结构体占用的内存大小
问题描述 给出一个结构体定义,求出这个结构体占用的内存大小 概念铺垫 对齐 将内存划分为很多格子(一个格子占用好几byte),新的数据元素放到新的格子,而不和前面的元素挤到相同的格子里 系统默认值 不同的操作系统会有不同的默认对齐值,比如4 元素对齐值 不同元素有自己的一个对齐值,比如char为1,int为4,double为8 两次对齐 结构体占用的内存大小由数据元素,数据元素原创 2014-03-12 13:21:48 · 1367 阅读 · 0 评论 -
洗牌 无重复随机数 有限随机分配问题
问题描述 1 将一个序列打乱 2 在一组不重复数中随机不重复地选出几个 3 将一定的资源m随机分为n份,每份最多分得x 问题分析 以上三个问题的解法可以归位一类,即随机选数+排除 随机选数使用数组效率高,但是排除似乎链表效率更高 但是实际上,在不要求保持原始数据顺序的情况下,数组可以同时在随机选数、排除、保存结果问题上保持高效率 算法 均使用数组 1 对于n的数组,随机选择第i原创 2014-03-06 21:56:46 · 871 阅读 · 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 · 791 阅读 · 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 · 646 阅读 · 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 · 1921 阅读 · 0 评论 -
找出过半定值数
问题描述 现在有一个长度为n的数组a,里面有超过一半的整数为一个定值,在不用排序,不开辟新 数组的情况下,用最快的算法找出来这个数 算法 设立一个计数器,初值为1 记数组的第一个数为可能值,从下一个数开始顺序扫描数组 如果与可能值相同,则计数器+1 如果与可能值不同,则计数器-1 如果计数器归0,对数组剩余部分再次运用该算法 算法原理 用一个故事来描述 在一片土地上有很多部原创 2014-03-06 10:43:21 · 625 阅读 · 0 评论 -
解最长不减子序列问题
问题描述 有一个序列A,求出其最长不减子序列C 算法1(最长公共子序列法) 先将序列排序,得到不减序列B 然后求出A、B的最长公共子序列 如何求最长公共子序列? 算法2(动态规划) 先将问题划分为两个层次 第一个层次(宏观) 1 对于A中每一个元素,求出以该元素结尾的最长不减子序列 2 上述所求序列中,长度最长的,即为A的最长不减子序列C 原理 C的最后一个元素一定是A中的原创 2014-03-06 09:15:59 · 1216 阅读 · 0 评论 -
栈的出栈顺序数
问题描述 n个元素顺序进栈,共有多少种出栈顺序 答案 C(2n, n) / (n + 1) 参考 卡特兰数(百度百科) 卡特兰数(维基百科(英文))原创 2014-03-06 11:29:55 · 700 阅读 · 0 评论 -
动态规划思想
1 解决问题——分治 用有限的计算能力处理大规模问题的基本手段 1.1 递归 问题的解决方法包含递归部分和非递归部分,非递归部分解决问题的一部分,减少问题规模,而递归部分将形式不变,但减小了规模的问题传递到下一轮解决中去。这样,每一轮处理,问题都有一部分(规模)得到解决,一直递归下去(直到终止条件),直到整个问题得到解决 1.2 迭代 2 空间换时间——缓存子问题答案 在解决问原创 2014-03-05 09:00:52 · 581 阅读 · 0 评论 -
二叉树三序互推(简述)
只有已知中序,结果才确定 中序用于构建树的时候左右划分,比如ABCDE,给出根节点是C,那么左边包含AB,右边包含DE 前序或后序用于依次给出根节点 前序从前往后给出根节点 后序从后往前给出根节点原创 2014-03-01 05:57:36 · 758 阅读 · 0 评论 -
零钱组合问题
问题描述 给定一组零钱面额,比如1、2、5,g 算法 算法思路原创 2014-09-18 00:21:03 · 862 阅读 · 0 评论