随笔分类 -  算法设计与分析

 
寻找满足条件的两/三/k个数
摘要:题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 题目:一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。复杂度最好是O(n),如果是O(n2)则不得分。 题目:Given a set S of n integers, are there elements a, b, c i 阅读全文
posted @ 2012-07-01 14:22 做个不善的人 阅读(328) 评论(0) 推荐(0) 编辑
逐层打印二叉树
摘要:原题: 怎样从顶部开始逐层打印二叉树结点数据? 分析:逐层打印是个很明显的广度优先算法,BFS的首选自然是用队列保存没有被遍历过的节点,每一层查一个marker以区分不同的层,算法复杂度是每个节点被遍历一次,所以为O(n),空间复杂度为某一层的最大节点数。为O(lg(n))。 原题: 怎样把二叉树按zig-zag的顺序转换为一个链表? 分析:这个是类似的,不过就用栈了,计算复杂度为O(n),空间复杂度为O(log(n))。voidprintTreeByLevel(BinaryTreeNode*root){stack<BinaryTreeNode*>nodes_0;stack< 阅读全文
posted @ 2012-07-01 13:23 做个不善的人 阅读(1571) 评论(0) 推荐(0) 编辑
字符串处理之Trie树, 后缀树和后缀数组
摘要:Trie树Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie有3个基本性质:根节点不包含字符,除根节点外每一个节... 阅读全文
posted @ 2012-06-22 15:53 做个不善的人 阅读(1790) 评论(2) 推荐(1) 编辑
排序算法总结
摘要:堆排序 基于比较的排序,由于不管之前的输入是否有序,都需要建堆、维护堆,所以复杂度总是O(nlgn),不具有稳定性。 冒泡排序 基于比较的排序,时间复杂度为O(n2)。优点是具有稳定性,原来在前面的还在前面。 插入排序 最好情况是输入就是按照升序排列,需要n-1次比较;最坏情况就是输入按照降序排列,需要进行n(n-1)/2次比较。平均时间复杂度是O(n2)。因此非常不适合大数据量的排序。 ... 阅读全文
posted @ 2012-06-22 15:31 做个不善的人 阅读(227) 评论(0) 推荐(0) 编辑
经典计算机基础数据结构:二叉树
摘要:binary tree & BST 二叉树是比较常见的树,可用于实现BST,二叉堆或二叉排序树。下面是两个基本概念: (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有叶子节点,并且叶子节点都是从左到右依次排布,这就是完全二叉树。 (2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树。 二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于 阅读全文
posted @ 2012-06-17 21:44 做个不善的人 阅读(709) 评论(0) 推荐(0) 编辑
经典计算机基础数据结构:红黑树(插入和删除操作的fixup理解)
摘要:插入操作: RB-INSERT(T, z) 1 y ← nil[T] // y 始终指向 x 的父结点。2 x ← root[T] // x 指向当前树的根结点,3 while x ≠ nil[T]4 do y ← x5 if key[z] < key[x] //向左,向右..6 then x ← left[x]7 else x ← right[x] // 为了找到合适的插入点,x 探路跟踪路径,直到x成为NIL 为止。8 p[z] ← y // y置为 插入结点z 的父结点。9 if y = nil[T]10 then root[T] ← z11 else if key[z] < 阅读全文
posted @ 2012-06-09 17:57 做个不善的人 阅读(1832) 评论(0) 推荐(1) 编辑
字符串搜索算法
摘要:单模式字符串匹配 1. 朴素算法 朴素算法的问题在于不够智能,有些位置明显没有必要进行比较操作,但这个算法无法区分出来,还是继续比较,浪费了资源。 2. KMP算法 在KMP算法中,引入了前缀函数的概念,从而可以更加精确的知道:当不匹配发生时,应该跳过多少个字符。下面介绍前缀函数。 字符串A = "abcde" B = "ab"。 那么就称字符串B为A的前缀,记为B ⊏ A。同理可知 C = "e","de" 等都是 A 的后缀,以为C ⊐ A。 这里模式串 P = “ababaca”,在匹配了 q=5 个字符后失 阅读全文
posted @ 2012-06-03 12:37 做个不善的人 阅读(12593) 评论(0) 推荐(1) 编辑
(zz)计算复杂性:NP=P?
摘要:NP完全性理论的奠基人—1982年度图灵奖得主斯蒂芬·库克 ---- 加拿大多伦多大学教授斯蒂芬·库克(Stephen Arthur Cook)因其在计算复杂性理论方面的突出贡献,尤其是在奠定NP完全性理论基础上的突出贡献而荣获1982年度的图灵奖。但库克实际上是美国科学家。 ----库克1939年12月14日生于纽约州的布法罗,他的父亲是一名化学家,在著名的联合碳化物公司工作,同时在布法罗大学任... 阅读全文
posted @ 2012-05-31 18:58 做个不善的人 阅读(4410) 评论(0) 推荐(0) 编辑
区间图着色问题
摘要:假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应该使用哪一个教室。 (这个问题也被称为区间图着色)问题。我们可以作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的颜色均不同,所需的最少颜色数对应于找出调度给定的所有活动所需的最少教室数。 最优子结构: 设S为原问题所有活动的集合; 设A为原问... 阅读全文
posted @ 2012-05-28 08:57 做个不善的人 阅读(1767) 评论(0) 推荐(0) 编辑
贪心算法基础
摘要:贪心算法是以动态规划算法为基础的。在每一个贪心算法的下面,总是会有一个更加复杂的动态规划解。如何判断某个问题是否可以使用贪心算法呢?关键点就是验证其具有贪心选择性质:一个全局最优解可以通过局部最优选择来达到。真正要做的就是证明将子问题的最优解与所做的贪心选择合并后,的确可以得到原问题的一个最优解。 都知道动态规划算法是贪心算法的基础。那在想使用贪心算法的时候,是不是可以考虑先构造其动态规划算法,然... 阅读全文
posted @ 2012-05-28 07:58 做个不善的人 阅读(563) 评论(0) 推荐(0) 编辑
经典计算机算法设计方法(4) -- 动态规划之一(学习篇)
摘要:《算法导论》第15章专门介绍动态规划算法,本文结合装配线调度和矩阵链乘法理解动态规划算法的一些基本问题(15.1 – 15.3)。适合采用动态规划方法的最优化问题包含两个要素:最优子结构和重叠子问题。最优子结构如果问题的一个最优解中包含子问题的最优解,则该问题具有最优子结构。要判断问题是否具有最优子... 阅读全文
posted @ 2012-05-25 22:18 做个不善的人 阅读(855) 评论(0) 推荐(0) 编辑
zz24点游戏
摘要:24点游戏 数字游戏题解 by starfish [说明:此文改编自我写的一篇解题报告,原题是某年国家集训队组队赛题目] 问题描述80年代全世界流行一种数字游戏,在中国我们把这种游戏称为“24点”。现在我们 把这个有趣的游戏推广一下:您作为游戏者将得到6个不同的自然数作为操作数, 以及另外一个自然数作为理想目标数,而您的任务是对这6个操作数进行适当的算 术运算,要求运算结果小于或等于理想目标数,并且我们希望所得结果是最优的, 即结果要最接近理想目标数。 您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意: 所有的中间结果必须是整数,所以一些除法运算是不允许的(例如,(2 阅读全文
posted @ 2010-12-28 19:32 做个不善的人 阅读(737) 评论(0) 推荐(0) 编辑
(ZZ)从10亿个浮点数中找出最大的1万个---->算法优化
摘要:引子每年十一月各大IT公司都不约而同、争后恐后地到各大高校进行全国巡回招聘。与此同时,网上也开始出现大量笔试面试题;网上流传的题目往往都很精巧,既能让考查基础知识,又在平淡中隐含了广阔的天地供优秀学生驰骋。 这两天在网上淘到一道笔试题目(注1),虽然真假未知,但的确是道好题,题目如下: 从10亿个浮点数中找出最大的1万个。 这是一道似易实难的题目,一般同学最容易中的陷阱就是没有重视这个“亿”字。因为有10亿个单精度浮点数元素的数组在32位平台上已经达到3.7GB之巨,在常见计算机平台(如Win32)上声明一个这样的数组将导致堆栈溢出。正确的解决方法是分治法,比如每次处理100万个数,然后再综合 阅读全文
posted @ 2010-12-28 19:07 做个不善的人 阅读(626) 评论(0) 推荐(0) 编辑