数据结构初探


问题抛出:

程序的本质:解决实际问题的步骤描述(前提:理解实际问题)

 如何判断求解问题步骤的好坏

  1)用尽量少的时间解决问题

  2)用尽量少的步骤解决问题

  3)用尽量少的内存解决问题

  <--查看数列的前n项和代码-->

           

      在3种求和算法种,sum1()中的关键部分的操作数量为 2n 次;sum2()中的关键部分的操作数量为 n 次;sum3()中的关键部分的操作数量为 1 次;

      关键部分:除去程序的必要开销所留下的部分;

      结论:随着问题的输入规模n逐渐增大,他们之间的操作数量差异也会越加明显,因此,实际算法在效率上的差异也会更加明显。

           通常,对于某个算法,当问题的输入规模n增大时,他会优于另一算法,或者越来越差于另一算法。

      方式1:通过可视化展示上述数列求和算法的执行效果:

       

 1 from pyecharts import Line
 2 
 3 n=21
 4 acount = [i for i in range(1, n)]
 5 scale1 = [2*i for i in range(1, n)]
 6 scale2 = [i for i in range(1, n)]
 7 scale3 = [1 for i in range(1, n)]
 8 
 9 line = Line("不同算法的操作数目对比")
10 
11 line.add("scale1(2*n)", acount, scale1, xaxis_type='value')
12 line.add("scale2(n)", acount, scale2, xaxis_type='value')
13 line.add("scale3(1)", acount, scale3, xaxis_type='value', xaxis_name='问题输入规模n', yaxis_name='算法实际操作数量')
14 
15 line
上图可视化代码展示:

     方式2:通过表格对比不同算法的执行效率;

       

    结论:n == 1时,算法C( 2n2+3n+1 )和算法D( 2n3+3n+1 )的操作数量相同;当n越来越大的时候,算法C ( 2n2+3n+1 )的效率远高于算法D ( 2n3+3n+1 );

     结论:判断一个算法的效率时,操作数量中的常数项和其他次要项常常可以忽略,只需要关注最高阶项就能得出结论。