目录

2021.12.4 星期六

冒泡排序 bubblesort

swap()函数

迭代与递归

2021.12.6 星期一

1<<2

分而治之

fib()

动态规划

最长公共子序列 LCS


2021.12.4 星期六

复杂度分析:循环分析

冒泡排序 bubblesort 

简介:排序过程中,相邻元素不断交换,一些元素被慢慢换到最后,看起来就像是元素在冒泡一样。

算法原理:以递增为例,从头开始比较相邻的两个元素,如果第i比第i+1大,则掉换二者位置,再进行下一个相邻的比较,这就是一次循环。下一次循环再从头开始,每次都循环直到没有发生元素交换,则说明第i个元素都比第i+1个元素小,则冒泡排序完成。

时间复杂度:内循环首先要扫描n-1对相邻元素,最坏的结果也是交换n-1次,而元素的比较&元素的交换都是基本操作,因此需要2(n-1)次操作。外循环最多循环n-1次。因此整体的时间复杂度:T(n)=O(2(n-1)²)=O(n²)

C++代码实现:

swap()函数

交换了swap(A,B)中A,B的值

void bubblesortA(int A[],int n){
bool sorted=false; //初始假定尚未排序
while(!sorted){
sorted=true;
for(i=1;i<n;i++){
if(A[i-1]>A[i]){
swap(A[i-1],A[i]);
sorted=false;//证明还没有整体排序完成,清楚排序标志
}
}
n--;//每次排序必然保证最后一个是全场最大的,因此减少一次比较
}
}
void bubblesortA(int A[],int n){
for(bool sorted=false;sorted=!sorted;n--){
for(i=1;i<n;i++){
if(A[i-1]>A[i]){
swap(A[i-1],A[i]);
sorted=false;//证明还没有整体排序完成,清楚排序标志
}
}
n--;//每次排序必然保证最后一个是全场最大的,因此减少一次比较
}
}

迭代与递归

计算任意n个整数之和

迭代:

int SumI(int A[],int n){
int sum=0;
for(i=0;i<n;i++){
sum+=A[i];
}
return sum;

递归:减而治之

int sum(int A[],int n){
return(n<1)?0:sum(A,n-1)+A[n-1];
}

2021.12.6 星期一

1<<2

<<的意思,是将1的二进制编码向左移动2位,由 00000001 变成 00000100

值由1变成4

同理,>>向左移动

分而治之

//举例子:
sum(int A[], int lo, int hi){ //求A[]数组中从lo到hi中的和
if(lo==hi) return A[lo];
int mi = (lo+hi)>>1; //一分为二
return sum(A,lo,mi)+sum(A,mi,hi);
}

分而治之是将计算分成:1次规模为n,两次规模为n/2, 四次规模为n/4... 1+2+4+...+n

减而治之是越来越小:1+2+...+n

fib()

斐波那契数列,又叫黄金分割数列/兔子数列,F(0)=0,F(1)=1... 核心思想:F(n)=F(n-1)+F(n-2)

递归版本:

int fib(){
return (n<2)? n: fib(n-1)+fib(n-2);
}

递归版本的会重复利用递归实例,时间和空间都用得很多。如果用迭代的方法呢?

动态规划

颠倒计算方法,从递归基出发,由自顶而下递归,变成自底而上迭代,迭代版本:

fib(){
int f=0,b=1;
while(n-->0){
b=b+f;
f=b-f;
}
return b;
}

最长公共子序列 LCS

可能有多个公共子序列,因此只需找出其中一个或者最长的长度

可能有歧义:两个字符会同时满足

递归版本:

对于A[0,n]和B[0,m],LCS(A,B) 有三种情况

1. A B 都为空

2.A B 最后字符相同,减而治之

3. A B最后字符不相同,最后的解有两种情况:A 或 B 对公共子序列没有贡献,取 A B

邓俊辉《数据结构》-复杂度/递归学习笔记相关推荐

  1. 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示

    清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示 有关概念: 与图论略有不同,数据结构中的树:1.需要为每一颗树指定一个特殊的顶点,作为"根"(root),对应rooted ...

  2. 邓俊辉数据结构学习心得系列——如何正确衡量一个算法的好坏

    数据结构这门课主要关注如何设计合理的数据结构和算法,来简化时间复杂度和空间复杂度. 想要科学的解决这样一个优化的问题,最核心的思想也是最基础的,就是要量化问题.这也是将数学运用在实际问题中的一个基石. ...

  3. 邓俊辉数据结构学习-3-栈

    栈的学习 栈的应用场合 逆序输出 输出次序与处理过程颠倒,递归深度和输出长度不易预知 不是很理解 实例:进制转换 大致思路:对于进制转换,我们一般使用的都是长除法,因此要保存每次得到的余数,但是最后算 ...

  4. 邓俊辉数据结构学习心得系列——数据结构中所研究的算法

    写在前面的话: 本文只是个人学习邓俊辉老师C++数据结构的整理,包含了很多个人的见解(从内容到材料的组织形式).所整理的内容不保证逻辑性和完整性,仅供参考. 算法的基本性质: 有正确的输入 有正确的输 ...

  5. 邓俊辉数据结构学习-7-BST

    二叉搜索树(Binary-Search-Tree)--BST 要求:AVL树是BBST的一个种类,继承自BST,对于AVL树,不做太多掌握要求 四种旋转,旋转是BBST自平衡的基本,变换,主要掌握旋转 ...

  6. 邓俊辉数据结构学习笔记3-二叉树

    二叉树及其表示 树 有根树 从图论的角度看,树等价于连通无环图.因此与一般的图相同,树也由一组项点〈vertex)以及联接与其间的若干条边〈edge) 组成.在计算机科学中,往往还会在此基础上,再指定 ...

  7. 邓俊辉数据结构学习笔记2

    列表 typedef int Rank; //秩 #define ListNodePosi(T) ListNode<T>* //列表节点位置template<typename T&g ...

  8. 邓俊辉数据结构学习笔记1

    起泡排序算法 void bubblesort1A(int A[], int n) //起泡排序算法(版本1A):0 <= n {int cmp = 0, swp = 0;bool sorted ...

  9. 清华邓俊辉数据结构学习笔记(3) - 二叉树、图

    第五章 二叉树 (a)树 树能够结合向量的优点(search)和列表的优点(insert.remove),构成List< List >. 有根树 树是特殊的图 T = (V, E),节点数 ...

最新文章

  1. 面试 HTTP ,99% 的面试官都爱问这些问题!
  2. [LeetCode]题解(python):019-Remove Nth Node From End of List
  3. module ‘torchtext.data‘ has no attribute ‘LabelField‘
  4. Server2008 RMS測試
  5. 喵哈哈村的狼人杀大战(4)
  6. OpenJDK 正式宣布AWT、2D、Swing等项目解散
  7. C# TCP sever client
  8. 基于Android Studio搭建Android应用开发环境
  9. es6新语法Object.assign()
  10. Android 视频播放器 VideoView 的使用,播放本地视频 和 网络 视频
  11. RocketMQ使用mmap - TODO
  12. 怎么把外部参照合并到图纸_怎么对两个图纸内容进行合并操作
  13. pytorch macos_Windows,Linux和MacOS上的PyTorch安装
  14. 微软宣布以197亿美元现金收购语音识别巨头Nuance
  15. 网易云参数解析(多图)
  16. html5 中秋博饼游戏,微信通用功能模块 中秋博饼V4.1.5 开源版
  17. 1【西北师大-2108Java】第一次作业成绩汇总
  18. php 打印去掉页眉页脚,window.print打印 去掉页眉页脚及打印链接
  19. WIN7下点击安全删除硬件没反应解决办法
  20. django全自动分库分表(横向)

热门文章

  1. java sdk下载_Java SDK的下载、安装和环境配置
  2. 从源代码开始 Detectron2学习笔记
  3. Ubuntu下运行Open WebOS
  4. 优象光流模块助力无人机之使用效果分享
  5. decodeURIComponent()函数和encodeURIComponent() 函数用法
  6. 如何顺利通过计算机专业毕业答辩
  7. 支付宝生活号获取用户授权
  8. 智能网联汽车——概述
  9. 202205论文阅读
  10. 企业这样操作发福利,满足所有员工需求