随笔分类 -  知识补充

1

ACM进阶计划
摘要:ACM队不是为了一场比赛而存在的,为的是队员的整体提高。大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l计算机组成原理l人工智能l编译原理l算法设计与分析除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的。以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识。英语之类与专业相距较远的课程请自行分配时间,这里不再列举。大一上学期:必学:1.C语言基础语法必须全部学会a)推荐“语言入门”分类20道题以上b)提前完成C语言课程设计2.简单数 阅读全文

posted @ 2012-08-23 16:38 mycapple 阅读(954) 评论(0) 推荐(6)

贪心算法精讲
摘要:一.贪心算法的基本概念当一个问题具有最优子结构性质时,我们会想到用动态规划法去解它。但有时会有更简单有效的算法。我们来看一个找硬币的例子。假设有四种硬币,它们的面值分别为二角五分、一角、五分和一分。现在要找给某顾客六角三分钱。这时,我们会不假思索地拿出2个二角五分的硬币,1个一角的硬币和3个一分的硬币交给顾客。这种找硬币方法与其他的找法相比,所拿出的硬币个数是最少的。这里,我们下意识地使用了这样的找硬币算法:首先选出一个面值不超过六角三分的最大硬币,即二角五分;然后从六角三分中减去二角五分,剩下三角八分;再选出一个面值不超过三角八分的最大硬币,即又一个二角五分,如此一直做下去。这个找硬币的方法 阅读全文

posted @ 2012-08-23 15:19 mycapple 阅读(551) 评论(0) 推荐(0)

最长上升子序列LIS算法实现
摘要:介绍一:LIS(Longest Increasing Subsequence)最长上升(不下降)子序列,有两种算法复杂度为O(n*logn)和O(n^2)。在上述算法中,若使用朴素的顺序查找在D1..Dlen查找,由于共有O(n)个元素需要计算,每次计算时的复杂度是O(n),则整个算法的时间复杂度为O(n^2),与原来算法相比没有任何进步。但是由于D的特点(2),在D中查找时,可以使用二分查找高效地完成,则整个算法时间复杂度下降为O(nlogn),有了非常显著的提高。需要注意的是,D在算法结束后记录的并不是一个符合题意的最长上升子序列!算法还可以扩展到整个最长子序列系列问题。 有两种算法复杂度 阅读全文

posted @ 2012-08-22 21:00 mycapple 阅读(7164) 评论(0) 推荐(0)

动态规划小结
摘要:一般步骤确定决策序列(Decision sequences)明确问题状态(Problem states)验证优化原理(Principle of optimal)构造、求解优化值递归方程(Recurrence equation)回溯(traceback)构造优化解(Optimal solution)算法复杂性动态规划递归方程往往不能直接用递归实现, 会引发大量重复计算,算法的计算量将非常可观。最好是用迭代法求解动态规划法列出的递归方程迭代实现需要存贮所有子问题的优化解的值,因此动态规划法设计的算法往往需要较大的存储空间算法的复杂性来自子问题的数目,通常子问题的数目往往很大 阅读全文

posted @ 2012-08-22 14:59 mycapple 阅读(319) 评论(0) 推荐(0)

01背包问题总结(一)
摘要:01背包问题总结一 问题描述:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 所谓01背包,表示每一个物品只有一个,要么装入,要么不装入。二 解决方案: 考虑使用dp问题 求解,定义一个递归式 opt[i][v] 表示前i个物品,在背包容量大小为v的情况下,最大的装载量。 opt[i][v] =max(opt[i-1][v] , opt[i-1][v-c[i]] + w[i])解释如下: opt[i-1][v] 表示第i件物品不装入背包中,而opt[i-1][v-c[i]] + w[i] 表示第i件物品装入背包中。 花费如下 阅读全文

posted @ 2012-08-17 15:26 mycapple 阅读(244) 评论(0) 推荐(0)

动态规划(基础篇)
摘要:1.什么是动态规划:动态规划,和分治法一样,是通过组合子问题的解而解决整个问题的。但不同的是,分治算法是指将问题划分成一些独立的子问题,递归求解各子问题,然后合并子问题的解而得到原问题的解。而动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。动态规划对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。2.动态规划中的几个重要性质:2.1最优子结构:用动态规划求最优化问题的第一步是描述最优解的结构。如果问题的一个最优解中包含子问题的最优解,则该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划可能会适用(注意,在这种情况下 阅读全文

posted @ 2012-08-17 15:25 mycapple 阅读(271) 评论(0) 推荐(0)

筛法求素数
摘要:基本思想: 用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子 为空时结束。如有: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是: 3 5 7 9 11 13 15 17 19 21 23 25 27 29 剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求... 阅读全文

posted @ 2012-08-15 20:30 mycapple 阅读(212) 评论(0) 推荐(0)

全排列生成算法:next_permutation
摘要:概念全排列的生成算法有很多种,有递归遍例,也有循环移位法等等。但C++/STL中定义的next_permutation和prev_permutation函数则是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列。本文将详细的介绍prev_permutation函数的内部算法。按照STL文档的描述,next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反,这里仅以next_permutation为例介绍算法。先对序列大小的比 阅读全文

posted @ 2012-08-13 10:19 mycapple 阅读(406) 评论(0) 推荐(0)

全排列问题的STL用法(next_permutation类)
摘要:标准库全排列next_permutation()在标准库算法中,next_permutation应用在数列操作上比较广泛.这个函数可以计算一组数据的全排列.但是怎么用,原理如何,我做了简单的剖析.首先查看stl中相关信息.函数原型:template<class BidirectionalIterator> bool next_permutation( BidirectionalIterator _First, BidirectionalIterator _Last );template<class BidirectionalIterator, class BinaryPred 阅读全文

posted @ 2012-08-13 10:17 mycapple 阅读(3231) 评论(1) 推荐(2)

使用STL的next_permutation函数生成全排列(C++)
摘要:下午研究了一下全排列算法,然后发现C++的STL有一个函数可以方便地生成全排列,这就是next_permutation在C++ Reference中查看了一下next_permutation的函数声明:#include <algorithm>bool next_permutation( iterator start, iterator end );Thenext_permutation() function attempts to transform the given range of elements [start,end) into the next lexicographi 阅读全文

posted @ 2012-08-13 10:16 mycapple 阅读(412) 评论(0) 推荐(0)

树状数组
摘要:树状数组是一种非常优雅的数据结构. 当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组. 最直接的算法可以在O(1)时间内完成一次修改,但是需要O(n)时间来进行一次查询.而树状数组的修改和查询均可在O(log(n))的时间内完成. 设a[1...N]为原数组,定义c[1...N]为对应的树状数组: c[i] = a[i - 2^k + 1] + a[i - 2^k + 2] + ... + a[i] 其中k为i的二进制表示末尾0的个数,所以2^k即为i的二进制表示的最后一个1的权值. 所以2^k可以表示为n&(n^(n-1))或更简单的 阅读全文

posted @ 2012-08-10 16:34 mycapple 阅读(214) 评论(0) 推荐(0)

字典树
摘要:字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。字典树的插入,删除和查找都非常简单,用一个一重循环即可。1. 从根节点开始一次搜索2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索3. 在相应的 阅读全文

posted @ 2012-08-09 18:22 mycapple 阅读(455) 评论(0) 推荐(0)

100阶乘末尾有多少个零?
摘要:在一堂无聊的信息检索课程上旁边的同学提出了一道java面试题——100的阶乖末尾有多少个零?我结合网上的思路对此探讨一下:题目:1*2*3*……*100 求结果末尾有多少个零分析:一般类似的题目都会蕴含某种规律或简便方法的阶乘末尾一个零表示一个进位,则相当于乘以10而10 是由2*5所得,在1~100当中,可以产生10的有:0 2 4 5 6 8 结尾的数字,显然2是足够的,因为4、6、8当中都含有因子2,所以都可看当是2,那么关键在于5的数量了那么该问题的实质是要求出1~100含有多少个5由特殊推广到一般的论证过程可得:1、每隔5个,会产生一个0,比如5,10,15,20.。。2 、每隔5& 阅读全文

posted @ 2012-08-09 08:54 mycapple 阅读(1266) 评论(0) 推荐(0)

阶乘相关的算法及其C++实现
摘要:阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。C++中的阶乘亦是如此。有关阶乘的算法,不外乎两个方面:一是高精度计算;二是与数论相关。 一、高精度计算阶乘 这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算。 首先看小于等于12的阶乘计算(计算结果不会超出32位范围):int factorial(int n) {if (n == 1 || n == 0)return 1;return factorial(n-1)*n;} 这个递归程序简单明了,非常直观,然而一旦n > 12,则超过32位int型的范围出现错误结果,所以上面这个递归程序仅适合n <= 1 阅读全文

posted @ 2012-08-09 08:34 mycapple 阅读(4842) 评论(0) 推荐(0)

cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
摘要:学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息;1、cin1、cin.get()2、cin.getline()3、getline()4、gets()5、getchar()1、cin>>用法1:最基本,也是最常用的用法,输入一个数字:#includeusing namespace std;main (){int a,b;cin>>a>>b;cout<<a+b<<endl;}输入:2[回车]3[回车] 阅读全文

posted @ 2012-08-08 10:43 mycapple 阅读(228) 评论(0) 推荐(0)

斐波那契数列
摘要:题目1:写一个函数,输入n,其斐波那契数列的第n项。斐波那契数列的定义如下:方法1:使用递归解,时间复杂度是n的指数级别斐波那契数列的定义就是递归的,我们根据定义可以很简单的写出代码。代码如下: 2 3 #include<iostream> 4 #include<stdlib.h> 5 using namespace std; 6 7 //f(n)={0,1,1,2,3...} n>=0 8 9 int Fibonacci(int n)10 {11 if(n<=0)12 return 0;13 if(n==1)14 return 1;15 ... 阅读全文

posted @ 2012-08-08 08:17 mycapple 阅读(3048) 评论(0) 推荐(0)

斐波那契数列算法分析
摘要:斐波那契数列算法分析背景:假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?在一月底,最初的一对兔子交配,但是还只有1对兔子;在二月底,雌兔产下一对兔子,共有2对兔子;在三月底,最老的雌兔产下第二对兔子,共有3对兔子;在四月底,最老的雌兔产下第三对兔子,两个月前生的雌兔产下一对兔子,共有5对兔子;……如此这般计算下去,兔子对数分别是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 14 阅读全文

posted @ 2012-08-08 07:48 mycapple 阅读(300) 评论(0) 推荐(0)

抽屉原理
摘要:桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现 至少会有一个抽屉里面放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代 表一个元素,假如有n+1或多于n+1个元素放到n个集合中去,其中必定至少有 一个集合里有两个元素。” 抽屉原理有时也被称为鸽巢原理(“如果有五个鸽 子笼,养鸽人养了6只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有2 只鸽子”)。它是组合数学中一个重要的原理。 第一抽屉原理 原理1 把多于n个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少 于两件; 抽屉原理[证明](反证法):如. 阅读全文

posted @ 2012-08-07 12:24 mycapple 阅读(457) 评论(0) 推荐(0)

C++ floor函数
摘要:在论坛里看到了一个人的提问,关于如何截断浮点数小数部分的问题。我的第一感觉是使用字符串处理(呵呵,估计知道floor函数的人都会笑话我了)。的确,用C++也算挺久了,竟然不知道C++库中的floor函数,可以轻易实现这个功能,唉,感慨~~~~就不多说别的了,下面说一下关于floor函数:1、函数原型:1 double floor ( double x );2 float floor ( float x );3 long double floor ( long double x );2、功能:返回一个小于传入参数的最大整数3、参数:x为将来被处理的数4、返回值:返回不大于x... 阅读全文

posted @ 2012-08-07 11:36 mycapple 阅读(52171) 评论(4) 推荐(5)

sscanf函数的用法
摘要:函数原型: Int sscanf( const char * src, const char * format, ...);int scanf( const char * format, ...);这两个函数很相似,只是第一个函数以src作为输入,而第二个函数以标准输入STDIN读取输入;format 是格式控制字符串,它包含控制字符(如:%d,%i,%s等),空白字符(如:空格、制表符\t、回车换行符\n 或其连续组合)以及非空白字符;...是一组指针变量,是上述函数用来保存结果值的;返回值为被成功赋值的指针变量的个数,如果该函数发生错误,则返回EOF(-1)。 格式控制format: fo 阅读全文

posted @ 2012-08-03 15:12 mycapple 阅读(18275) 评论(0) 推荐(0)

1

导航