算法导论学习笔记2

分而治之



例子:求解股市最大收益

P38



思路

? 容易犯的错误
? 使用穷丼两两组合的方法
算法导论学习笔记2_第1张图片

转化问题

算法导论学习笔记2_第2张图片

分而治之的思路


算法导论学习笔记2_第3张图片

算法导论学习笔记2_第4张图片

伪代码

算法导论学习笔记2_第5张图片
算法导论学习笔记2_第6张图片
算法分析

《算法导论》第42页


矩阵乘法的Strassen算法

? 普通矩阵乘法算法复杂度为n立方级别
? 分而治之的思路,可以达到n平方级别

P43
算法导论学习笔记2_第7张图片

伪代码

算法导论学习笔记2_第8张图片

分治法算法复杂度推算

? 从递归式子推算复杂度
? 代入法
? 递归树
? 主方法与主定理

算法导论学习笔记2_第9张图片

用递归树方法求解递归式

p50

用主方法求解递归式

p53

堆排序(heapsort)

? 二叉堆

算法导论学习笔记2_第10张图片

最大堆和最小堆

? 最大堆:应用于堆排序
? 最小堆:应用于构造优先队列

算法导论学习笔记2_第11张图片

堆排序过程

算法导论学习笔记2_第12张图片

MAX-HEAPIFY过程

? 要解决的问题:当根节点(相对)的左子树和右子树都是最大堆时,怎样把堆变成最
大堆?

算法导论学习笔记2_第13张图片

节点逐级下降示意图

算法导论学习笔记2_第14张图片
把堆变成最大堆

? 利用分而治之和递归的标准思路

算法导论学习笔记2_第15张图片

算法导论学习笔记2_第16张图片

堆排序

算法导论学习笔记2_第17张图片
算法导论学习笔记2_第18张图片
算法分析

? 复杂度O(nlgn)
? 复杂度要低于插入排序,与归并排序相若
? 具有空间原址性,即可以在原数组内进行排序而不需要额外空间,与插入排序相若,
优于归并排序

快速排序的算法思想

算法导论学习笔记2_第19张图片

伪代码

算法导论学习笔记2_第20张图片

算法导论学习笔记2_第21张图片

过程图解

算法导论学习笔记2_第22张图片

算法导论学习笔记2_第23张图片

算法分析

? 最坏情况
? 最好情况
? 平均情况O(nlgn)

算法导论学习笔记2_第24张图片

习题 1:归并排序(数组上的分治)

算法导论学习笔记2_第25张图片


算法导论学习笔记2_第26张图片

算法导论学习笔记2_第27张图片

代码

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. #define MAXN 70000
  5. int        a[MAXN];
  6. int        la[MAXN], ra[MAXN];
  7. long long    cnt; /* 逆序对数目 */
  8. void merge( int l, int m, int r ) /* l 左边界,m中值,r右边界 */
  9. {
  10.     int p1 = 0, p2 = 0, j, k;
  11.     for ( int i = l; i <= m; i++ )
  12.         la[p1++] = a[i]; /* 初始化la数组 */
  13.     for ( int i = m + 1; i <= r; i++ )
  14.         ra[p2++] = a[i]; /* 初始化ra数组 */
  15.     la[p1]    = ra[p2] = 0x3f3f3f3f;
  16.     j    = k = 0;
  17.     for ( int i = l; i <= r; i++ )
  18.     {
  19.         if ( la[j] <= ra[k] )
  20.             a[i] = la[j++];
  21.         else{
  22.             a[i]    = ra[k++];
  23.             cnt    += p1 - j;
  24.         }
  25.     }
  26. }


  27. void mergeSort( int l, int r )
  28. {
  29.     if ( l >= r )
  30.         return;
  31.     int m = (l + r) >> 1;
  32.     mergeSort( l, m );
  33.     mergeSort( m + 1, r );
  34.     merge( l, m, r );
  35. }


  36. int main()
  37. {
  38.     int n;
  39.     while ( ~scanf( \"%d\", &n ) )
  40.     {
  41.         cnt = 0;
  42.         for ( int i = 0; i < n; i++ )
  43.             scanf( \"%d\", &a[i] );
  44.         mergeSort( 0, n - 1 );
  45.         printf( \"%lld\\n\", cnt );
  46.     }
  47.     return(0);
  48. }









来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28673014/viewspace-1618761/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28673014/viewspace-1618761/

你可能感兴趣的:(算法导论学习笔记2)