数据结构复习归纳随笔(上)

        数据结构学习已经过了一年,但相信绝大多数伙伴不一定有很好的系统的学习了这门科,而这门学科在IT的地位是无比重要的,那么我这个编程大白就写点随笔帮助大家回忆下数据结构这门课,伙伴们要注意数据结构怎样都是注定枯燥的请耐心的看完对编程会有帮助的,欢迎高手大牛指文章的不足,喜欢的小伙伴可以点赞,可以留言,我定期会来看看,一起学习;

       首先,第一章开始,自然是介绍什么是数据结构了。这里就不用那么专业的术语来描述,(专业术语我也不太懂哈哈!)。

           数据结构+相关算法=程序设计,数据结构通俗的说,就是数据元素之间存在的一些关联的关系,像所讲过的队列,栈,树,图等,而像用来遍历树的递归,这就是一种算法,算法来操作这种数据结构,为数据结构服务。

          数据结构分逻辑结构以及物理结构;物理结构不主要谈,主要的对象是内存,主要是存储的方面,主要研究将数据元素存到内存的方式。

          物理结构储存分顺序和链式储存;数组就是顺序,指针型就是链式,他们主要的特征就是,顺序存储就是在内存中地址是连续的,指针型的特征就是在内存中的地址不固定随意,依靠指针来维系之间的联系;

          逻辑结构:集合结构,线性结构,树形结构,图形结构;

          第一章的内容几乎就是这几点,第二章的是效率,空间问题开始为重点;

          初学者做出程序实现功能是第一步,随着经验积累,也要开始考虑优化问题,怎样程序更好,更节省资源,提高效率;

         当然大部分在读的小伙伴还不用考虑这个,但也要学好。

      第二章空间复杂度以及时间复杂度:

         计算机硬件的性能以及选用编辑器会决定机器运行的时间,但这是外因,而内因是输入指令的规模以及算法的好坏,比如说,一个程序,1000人和100000人访问机器执行的时间的差异,还有就是遍历一个数组和遍历一棵树,你是一律用循环呢还是数组用循环,树用递归。

          所以研究好复杂度就很有必要了;

          那么研究算法的复杂度侧重点是什么呢?

          如果说研究它精确的执行次数用总的执行次数来作比较,万一数据量非常大你还来比较不?

         所以侧重点在于算法随着输入规模扩大的增长量的抽象。

         分析一个算法的运行时间重要是把基本操作数量和输入模式关联,假设有这样一个函数:2n+3,你可以理解为执行了个循环,再执行个循环,再执行三次,然后另一个函数3n+1,(连续执行3 次不嵌套的循环再执行一次),那么这两条函数交于y=7,当大于7以后,3n+1的曲线就增长的比2N的快,这时候3N+1的性能比2n的差。因为同样的N值,2n的算法执行数要少就可以完成,而3N的多。引入一个概念。

         

         如果当规模特别大的时候3N和2N决定了函数曲线的陡峭成度,后面的常数甚至可以忽略。

         然后,经过列举高阶函数的例子研究可以总结到一个这样的规律:

         最高项(它的指数最多的一项)是主要的关注对象,与之相乘的常数可以忽略,然后其他次要项直接忽略。

         好了,以上全是铺垫,注意了:

         

         执行次数=执行的单位时间(cpu的定义);

         

         O()里面就是F(n)表达式。还有一点就是增长率的理解,就是函数曲线的求导,导数越大就越容易上涨,即算法不够 优良。

         然后推导大O阶的公式就是:

         

         下面举几个经典的例子 :

          常数阶,线性阶,平方阶,对数阶;

          来看常数阶:

          int n=6,sum;

          printf("aaa");

          sum=n*(n*45)+1;

          像这些定义以及输出部分都不是我们所关注的,我们直接关注的是执行运算的指令,并且我们关注的还是运算的规模,像上面求和的语句,你再写多几句结果还是O(1),因为运算规模就那么一条;

          然后到线性阶:     

          for(i=0;i<n;i++){}

           这一段执行的规模就为n,所以O(n);

          然后到平方阶:

        for(){

        for(){}

         }

        像这样的嵌套就是O(n^2);

       还有一个特殊的例子:

       for(i=o;i<n;i++){

        for(j=i;j<n;j++){}      

        }

        这里分析下,当i=0的时候,J可以循环N次,i=1的时候,J循环N-1次,所以得出:

        sum=n+n-1+n-2+.....+1=(n+1)*n/2=N^2/2+N/2;

         根据法则:

        去掉其他次要项以及最高项的常数得到:O(n^2);

       当然要是循环里面再有多一个嵌套就是立方阶,不过具体问题还是要具体分析;

       

        对数阶:

         while(i<n){

           i=i*i;}

           也就是说当i>=N的时候会结束,那么n=i^2,i=logN(省略了小记号2);此时O(logN);

          
           今天先写到这里,笔记上篇将会写完到队列,编辑器写的好痛苦,格式等毛病很恼火

猜你喜欢

转载自blog.csdn.net/qq_37391017/article/details/80217917