算法学习
wu_cai_
这个作者很懒,什么都没留下…
展开
-
快速幂取模
在Miller Rabbin测试素数,就用到了快速幂取模的思想。这里总结下。求a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 算法1:利用公式a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化代码如下:[cpp] view转载 2015-03-22 09:33:38 · 528 阅读 · 0 评论 -
跳台阶问题(变态跳台阶)
题目1:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。转载 2016-07-17 16:17:57 · 3026 阅读 · 0 评论 -
二进制中1的个数
问题描述任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的算法,但我相信很少有人见到本文中所有的算法。如果您上头上有更好的算法,或者本文没有提到的算法,请不要吝惜您的代码,分享的时候,也转载 2016-07-11 21:21:07 · 502 阅读 · 0 评论 -
归并排序求逆序对
给定数组 如{5,8,3,1} 则有 5个逆序对 给定数组 求其逆序对的个数思路:归并排序 O(NlogN) 时间复杂度 O(N) 空间复杂度如上图:在两个有序的子序列中。 arr[p] > arr[q] && p #include using namespace std;int d = 0;void mergerArray(i原创 2016-04-19 18:53:21 · 307 阅读 · 0 评论 -
数据结构和算法系列16 哈夫曼树
数据结构和算法系列16 哈夫曼树阅读目录一,什么是哈夫曼树二,如何构建哈夫曼树四,算法实现这一篇要总结的是树中的最后一种,即哈夫曼树,我想从以下几点对其进行总结:1,什么是哈夫曼树?2,如何构建哈夫曼树?3,哈夫曼编码?4,算法实现?回到顶部一,什么是哈夫曼树什么是哈夫曼树呢?哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。转载 2016-04-06 00:28:05 · 1086 阅读 · 0 评论 -
LRU算法
LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU算法就是将最近最久未使用的页面予以淘汰。可以用一个特殊的栈来保存当前正在使用的各个页面的页面号。当一个新的进程访问某页面时,便将该页面号压入栈顶,其他转载 2016-04-06 00:11:06 · 345 阅读 · 0 评论 -
1-D closet pair 二分法
/************************** 解题思路:二分法 。。。。。。。。。。。。。。。。。。。。。。。。。 left mid right 点到自身的距离设为inf 递归边界:返回两个点的距离 两个点最近: 分布的情况:(1)两个点都在left-mid原创 2015-04-26 22:35:51 · 502 阅读 · 0 评论 -
动态规划算法
五大常用算法之二:动态规划算法一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的转载 2015-04-26 22:19:08 · 385 阅读 · 0 评论 -
优先队列用法
优先队列用法在优先队列中,优先级高的元素先出队列。标准库默认使用元素类型的优先队列的第一种用法,也是最常用的用法:priority_queueint> qi;通过故示例1中输出结果为:9 6 5 3 2第二种方法:在示例1中,如果我们要把元素从小到大输出怎么办呢?这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。转载 2015-04-15 11:44:58 · 353 阅读 · 0 评论 -
sicily 1176 Two ends
题目大意:给定一个数列,两人轮流取数,只能从两端取,第一个取的人可以用任何策略,第二个贪心,问结束时第一个人会赢多少分。题目分析:第一个人采用动态规划的方法,一定能最大化地赢第二个使用贪心的人。思路:使用Bottom-Up的动态规划,,复杂度O(n2)。 状态:dp[i][j] = data[i...j]第一个人比第二个人赢多少 边界:if(i==j)原创 2015-04-06 17:22:32 · 486 阅读 · 0 评论 -
大数取模运算
大数取模运算 sicily 1020 Big Integer原创 2015-03-22 11:11:23 · 15677 阅读 · 0 评论 -
二叉树前序,中序转后序
由二叉树的前序和中序如何得到二叉树的后序呢?要给出答案,首先得明白什么是前序、中序、后序。二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。转载 2016-09-17 11:24:17 · 2525 阅读 · 0 评论