编程若是只是一个为了解决生活温饱的工具,那你能够彻底忽略数据结构,算法,你的目标很容易实现;但若是你是热爱编程,把它当作对生活的追求,想在这一行走的更远,更久,那么在你的学习规划中,她们即是必不可少的一种语言;算法
在学习算法以前,应该先学会数据结构;没有数据结构的支撑,算法有点艰辛;数据结构又分C语言版本的Java版本的;在学数据结构以前咱们应该对这两个语言其中一门有所了解;编程
若是让你写一个1+2+3+4+...+100的结构程序,你会怎么写呢? 思考三秒钟不少人第一时间想到的是第一种算法,不多有人会去想第二种;数组
咱们来比较一下这两种算法,方法一随着n的增大,语句执行的次数成线性增长;方法二是无论n有多大,语句老是只执行一次;均可行,但很明显方法二的算法优于方法一;数据结构
为何呢?模块化
为了更好的区分她们的差异咱们引入算法的时间复杂度即算法的时间的度量;(即O());函数
记T(n)是语句执行次数的函数;随着n的增长,T(n)增加最慢的算法咱们称为最优算法;即算法时间复杂度小;工具
方法一的时间复杂度为O(n),方法二的时间复杂度为O(1)学习
好的算法应该具有时间效率和存储量低的特色;正如咱们平常生活同样的,咱们总但愿花最少的钱,用最短的时间办大事;算法也有同样的思想;最少的存储空间,最少的时间,办一样的好事;设计
在算法的入门级别中有没有感受到算法的神奇?3d
任何事物没有好坏之分,只有适不适合;算法也不例外
2.你们都知道斐波那契数列,如今要求输入一个整数n,请你输出斐波那契数列的第n项?
一种使用递归实现,递归可以使程序的结构更加清晰,更简洁,更容易让人理解,减小度代码的时间;递归使用的是选择结构;
一种使用迭代,迭代使用的是循环结构;
乍一看咱们会以为使用递归效果更佳。但是咱们忽略了大量的调用递归会创建函数的副本,消耗大量的时间和内存;而迭代则不须要反复调用函数和占用额外的内存;
判断一个算法好很差,咱们只经过少许的数据不能作出准确判断,所以根据需求状况选择不一样的代码实现方式;
算法的强大不止于此,强大而有趣味的算法等着咱们去挑战;
算法的特性:
好的算法应该是:速度快,存储空间少
数据元素:是组成数据的有必定意义的基本单位;也被称为记录;(好比学生,老师
数据项:一个数据元素能够有若干个数据项组成;是数据项不可分割的最小单位;(好比学生的姓名,学号,性别...
数据对象:数据元素具备相同数量和类型的数据项;(好比学生有姓名,学号,性别等相同的数据项
数据结构:相互之间存在一种或者多种特定关系的数据元素集合;
数据结构按照视点不一样可分为:逻辑结构和物理结构
地址是指向该变量单元;地址形象化地称为指针;指针变量的值是地址;全部说指针是一个地址,指针变量是存放地址的变量;
在设计一个较大的程序时,每每把它分红若干个程序模块。每一个模块包括一个或者多个函数,每一个函数实现一个功能;函数是一个功能,每一个函数用来实现一个特定的功能,函数的名字应该反映其表明的功能;利用函数,减小重复编写的程序段的工做量;(例如:C语言中main()函数) 在实际应用中咱们用函数来实现模块化程序设计
结构体:C语言容许用户本身创建有不一样类型的数据组成的组合型的数据结构,称为结构体;
结构体类型:包含不一样类型的成员;
结构体指针,就是指向结构体变量的指针;
链表是什么? 链表是一种数据结构,必须利用指针变量来实现;数据结构包括(number结构类型,Object类型,Array类型等等);链表是根据须要开辟内存单元,链表有一个头指针,存放一个地址,该地址指向一个元素(每一个链表都有一个头指针,必不可少);链表中的每个元素称为节点;节点包含两个部分,用户须要的实际数据,下一个节点的地址(next);链表中的地址是不连续的;要找某一元素,必须先找到上一个元素,根据他提供的下一个元素地址才能找到下一个元素;
形参不占内存中的存储单元;若是函数不须要返回值则不须要return语句