第二章算法总结

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

递归让一些复杂的问题变得简单易懂易于分析,如汉诺塔问题和Ackerman函数,在排序快排算法和归并排序算法中也有递归的运用。

汉诺塔:

ackerman函数:

递归的缺点:需要不断开拓堆栈空间,占用空间大,可能导致内存溢出,并且运行效率低,不能记录已经计算过的结果,和动态规划比速度慢。

分治法的基本思想:

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

一般的设算法设计模式

void 分支法(P问题){
  设置问题边界
  if(P 小于等于最小问题规模)

    调用解决最小规模的方法
  将P问题分成k分
  for( i : 1 -> k) {
    yi = 分支法(pi)
  }

  return 合并(y1 -> yk)

}

分治算法复杂度分析:https://www.cnblogs.com/MarcusJr19/p/11661392.html (已获得作者同意进行转载)

补充 T(n) = aT(n/b) + O(n^d)

a:分成a个子问题

b:将问题规模变为n/b

d:分解和合并a个子问题的时间复杂度为O(n^d)

分治法的核心是找到与原问题相同的子问题,一个题目看是否能用分治法要看它能否分成若干个与原问题相同的子问题,至于怎么看出来的主要看编程经验了。

下面是自己写的快排和归并排序代码 方便使用

https://blog.csdn.net/qq_19841133/article/details/100568593

https://blog.csdn.net/qq_19841133/article/details/100568124

原文地址:https://www.cnblogs.com/likeghee/p/11667378.html

时间: 2024-10-10 17:57:58

第二章算法总结的相关文章

第二章 算法入门 合并排序

在第二章中难的算法不多,接下来我会把稍微复杂一点的算法整理一下 #include <iostream> using namespace std; void mergeSort(int *A,int left,int mid,int right) { int *L=new int[mid-left+1]; int *R=new int[right-mid+1]; int i,j; for(i=0;i<mid-left+1;i++) { L[i]=A[left+i]; } for (j=0;

第二章 算法基础 思考题2-1

package chap02; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Random; import org.junit.Test; /*** * 在归并排序中对小数组采用插入排序 * * @author xiaojintao * */ public class ques2_1 { /** * 归并排序算法 * * @param a * @return */ static void m

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

第二章 算法基础 思考题2-4(逆序对)

1 package chap02; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Arrays; 6 7 import org.junit.Test; 8 9 public class ques2_4 { 10 /** 11 * 逆序对,将一个序列中的所有逆序对打印输出 12 * 13 * @author xiaojintao 14 * 15 */ 16 static void printReverseOrder(int[]

李航老师的《统计学习方法》第二章算法的matlab程序

参考了http://blog.sina.com.cn/s/blog_bceeae150102v11v.html#post % 感知机学习算法的原始形式,算法2.1参考李航<统计学习方法>书中第二章的算法P29 close allclear allclcX=[3,3;4,3;1,1];Y=[1,1,-1];%训练数据集及标记learnRate=1;%学习率Omega=zeros(1,size(X,2))b=0 %% ω和b的初值 i=1;k=0;while 1 if Y(i)*(sum(Omeg

剑指offer—第二章算法之快速排序

算法:排序和查找(二分查找,归并排序,快速排序),位运算等. 查找:顺序查找,哈希查找,二叉排序树查找,哈希表. 二分查找可以解决:"旋转数组中的最小数字","数字在排序数组出现的次数"等问题. 哈希表:优点:O(1)时间内查找一个元素的效率最高. 缺点:需要额外的空间来实现哈希表. 二叉排序树查找:对应二查搜索树查找,可以解决:"二叉收索树的后续遍历","二查搜索树和双向链表" 排序:排序算法要熟练,额外空间消耗,平均时间复

第二章 算法

算法定义 算法是描述解决问题的方法,是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 算法的特性 输入输出 算法具有零个或多个输入,至少有一个输出 有穷性 算法在执行有限步骤后自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成 确定性 算法的每一步都具有确定的含义,不会出现二义性 可行性 算法的每一步都是可行的,也就是说每一步都能通过执行有限步骤的次数完成 算法设计的要求 正确性 指算法至少应该具有输入输出,能得到问题的正确解 算法正确的

《算法导论》杂记 - 第二章 算法基础

// asc void insertionSortAsc(vector<int> &v) { int len = v.size(); for (int i = 1; i < len; i++) { int key = v[i]; int j = i - 1; while (j >= 0 && v[j] > key) { v[j + 1] = v[j]; j--; } v[j + 1] = key; } } // desc void insertionS

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的