数据结构复杂度与递归----C++初学之路

 *以下是自己初学C++的笔记,为让自己坚持下去,遂坚持用博客记录,不保证权威*

昨天的偶然接触的递归,发觉数据结构是一门充满智慧的东西,如果要我形容,我觉得C++就是一辆车,数据结构则是一张地图,要去哪里我得先学会车,

去这里有几条路,哪条路更快,看地图。C++很重要,数据结构也同样重要,接下来的学习生活,我会C++与数据结构一起学习,另外多做做练习,给自己接下来

定个目标,设计模式,编译原理,操作系统。


好了,说说今天学了什么,今天周一,上了课之后回来还是没忍住游戏的诱惑,毕竟后天就是国庆,作为个死肥宅,国庆套必须要一套的。

花了大概三个小时,学习了关于复杂度与递归相关的知识,拿的书本是《数据结构(C++语言版本)》邓俊辉。

复杂度(个人的理解):分为时间复杂度与空间复杂度。

1.时间复杂度:当我们运行一个程序,会需要很多时间,概念上说,时间复杂度是运行一个算法所需要的时间,但是我们无法真正去测试这个时间,因为

大部分的程序中是依据变量来执行的,例如,我们求一个数组中 的整数之和,数组长度为n,那么时间长度肯定是根据n来决定的。所以我们需要一个笼统的概念

来概括这个运行时间,那么就是时间复杂度。

2.空间复杂度:即我们运行的算法,需要存储,也许我们会需要一个sum来储存和,需要分配一定的空间,空间大小也是影响算法的优良的指标。

关于这两个概念,有个博主写的很好,地址:引用博主booirror的文章


递归(个人理解):递归是一种算法设计模式,简而言之就是,我们会写出很多程序,而这些程序可能会重复执行相同的步骤,例如,数组求和,就是数组中前两个

加起来,然后加第三个,不断重复指针加,数组加的步骤,递归出现把这些重复的步骤高度概括,让整个程序运行的程序效率更快。

看到网上有几个很有趣的解释:代码如下(出自知乎):

#include <stdio.h>
void Recursion(int depth){
    printf("抱着");
    if (!depth) printf("我的小鲤鱼");
    else Recursion(--depth);
    printf("的我");
}
int main(){
    printf("吓得我抱起了\n");
    Recursion(2);
    putchar('\n');
}

/*作者:李冰
链接:https://www.zhihu.com/question/20507130/answer/114197404
来源:知乎*/
先说说递归基,我觉得概念我说不来,我个人理解觉得是特殊情况,举个例子,数组求和A[n],如果数组长度为1,那么是直接return A[0];的,这个当n=0时就是递归基。

线性递归:算法会朝着更深一层来进行自我调用,并且每一次递归实例对自身的调用最多一次。这种模式的递归叫做线性递归。直接举个书本的例子:

int sum(int A[],int n)
{
    if(1>n) return 0;//这里指出递归基
    else return sum(A,n-1)+A[n-1];//调用本身,递归
}
减而治之:递归每深入一层,求解的规模就减小一个常数,直到最后成为一个简单的问题。就是上面代码要形容的。

分而治之:将问题分解成规模更小的子问题,再通过递归机制来分别求解,直到最后成为一个简单的问题。(二分递归)下面举个二分的例子:

int sum(int A[],int lo,int hi)
{
     if(lo==hi) return A[lo];//仍然是递归基
    else{
               int mi=(lo+hi)>>1;//将一个数组的求和,变成两个数组的求和,并且递归求,效率提高
               return sum(A,lo,mi)+sum(A,mi,hi);
          ]
}


*以上是今日自己的学习记录,明日目标:C++的处理类型,数据结构的向量*



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值