算法第2章小结

递归与分治策略

  递归:直接或间接地调用自身的算法称为递归算法。

       用函数自身给出定义的函数称为递归函数。

  【例1】Fibonacci数列

int fibonacci (int n){
    if (n <= 1 )
        return 1;
    return fibonacci (n - 1) + fibonacci(n - 2);
}

  【例2】Hanoi塔问题

void hanoi(int n, int a, int b, int c ){
    if(n > 0){
        hanoi(n - 1, a, c, b);
        move(a, b);
        hanoi(n - 1, c, b, a);
    }
}

  分治:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。

  时间复杂度: 求 T(n) = aT(n / b) + O(nd)      a >= 1, b > 1 为常数]

                T ( n )    =  { O(nd),             d > logba

                { O(n * log n) ,   d = logba

                { O(nlogba) ,          d < logba

  二分搜索技术、合并排序、快速排序等都是分治法的例子体现。其中,合并排序的基本思想是,将待排序元素分为大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好的子集合合并成要求的排好序的集合;快速排序的基本思想是,分解、递归调用快速排序算法分别进行排序、合并。

  

  分治策略其实可以看成是算法里的“郡县制”,先将权力分配到各个郡县,最后再归回同一到君主。如此一来,就不用事事都劳费君主处理了,便能高效地处理事务。

  结对编程其实可以看成是“三英战吕布”,同小伙伴一起攻下问题,一同学习一同进步,岂不妙哉!

原文地址:https://www.cnblogs.com/ZAsmn/p/11657951.html

时间: 2024-11-02 22:09:23

算法第2章小结的相关文章

算法第五章小结

一.回溯算法的概念以及理解 概念:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标. 理解:在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成.这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解.树根为初始状态,这样的状态集合称为状态空间树. 二.“子集和”问题的解空间结构和约束函数 1.解空间结构 非负非零的整数集合 S = {x1, x2, …, xn}

C++ 编程第二章小结

switch()用法的注意事项 1:switch语句中的表达式只能是整形数据,字符型数据和枚举型数据,case后面的产量表达式的类型必须与switch括号后面的类型相匹配 2:各个case(包括default)的出现次序可以任意,每个case在带有break的前提下,case的次序不影响执行结果 循环设计 循环设计的几种分类方法这里介绍几种 1:字符图形类 2:素数判断类 3:逻辑判断类 4:级数逼近类 a:对于图形类的基本循环格式一般是 for(int i = 1; i < 10 ;i ++)

第二章小结

第二章小结 早听说数据结构要比程序设计要难,我早早就做好了心理准备,可是现实好像比我想象的还要难一些.这个星期基本结束了第二章关于线性表的学习.对于顺序表,上学期接触的比较多学起来还算比较顺利.链表就有一点困难了.书上没有完整的代码段,只是一些算法,不得不说一开始我真的有点蒙圈的感觉.但后面经过了预习以及上网查找资料就开始慢慢接受了单链表. 和顺序表不同,单链表是存储在连续或者不连续的空间里面的.每一个数据都必须跟着一个地址,指向下一个数据.虽然可能空间利用率比不上顺序表,但在插入删除操作时就显

第三章小结--栈与队列

第三章小结 第三章我们主要学习了栈和队列.经过第一次的写博客,与课后的学习与借鉴.我看到很多其他的同学在整理知识的时候采用了画大纲图,架构图的方法.不得不说,那样子确实比纯粹的文字更加简单明了.于是我决定也学习和效仿一下. 以下便是图解: 通过大图来看,很明显,和前面学习的顺序表,链表栈和队列的操作有同工异曲之妙.实际上围绕着栈和队列的也是分为两大分支,顺序表和链表.操作也是从初始化,插入,删除,查找几个操作入手. 当然,也有不同的地方,栈是典型的先进而后出,队列则是先进先出,其插入和删除的操作

第7章小结

第七章小结 查找 根据这一章的题目,显而易见,这一张讲的是查找.虽然在之前的学习中,我们已经解除了不少的查找功能,但事实上,查找是一个可复杂可简单的过程.我们之前接触的查找大多数都比较的简单,而在学习完这一章后,我们会发现,事实上查找有很多种办法,也会发现,不同的情况,不同的存储结构都需要不同的查找方法. 以下为一些查找的概念和术语: ①关键字:数据元素(记录)中某个数据项的值,用它可以表示一个数据元素. ②动态查找表/静态查找表:若在查找的过程中进行修改操作(插入或删除),则相应的表为动态查找

算法导论 第一章

算法导论 第一章,为了让自己基本功更加的扎实,从今天起开始学习算法导论. 我以一位学长的博客为学习的参考资料,开始我的学习吧! 附上一句话: Having a solid base of algorithm knowledge and technique is one characteristic that separates the truly skilled programmers from the novices. 是否具有扎实的算法知识和技术基础,是区分真正熟练的程序员与新手的一项重要特

普林斯顿公开课:算法第0章,课程介绍

课程介绍 这门课程核心内容是算法和数据结构. 具体的算法和数据结构如下: 数据类型:堆栈.队列.背包.并查集.优先队列. 排序:快排.并排.堆排.基数排序 查找:BST.红黑BST.哈希表 图:BFS.DFS.Prim.Kruskai.Dijkstra 字符串:KMP.正则.TST.哈夫曼.LZW 高级:B树.后缀数组.最大流 为什么要学习算法 算法在各个领域中都有应用. 算法可以提高编程效率. 算法可以将现实生活中的物理公式转换成代码,算法可以模拟现实世界,然后发现世界的奥秘. 算法是很有趣的

17._11本章小结及任务实施

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; using System.Collections; namespace _17._11本章小结及任务实施 { class Program { static void Main(string[]

算法导论 第二章

2014-12-02 20:21:40 http://www.cnblogs.com/sungoshawk/p/3617652.html 上面链接指向算法导论第二章的预习博客,很值得一看,很详细. 插入算法: 1 #include <iostream> 2 3 using namespace std; 4 void insert_sort(int *datas, int length); 5 int main() 6 { 7 int a[10]={1,2,4,35,6,1,4,7,9,7};