zoukankan      html  css  js  c++  java
  • 数据结构学习笔记00基础认识

    由于不是计算机专业的学生,很遗憾我们专业并没有开数据结构这门课。现在学习数据结构的网课,也购买了教材;教材上给了大部分的代码,但是我还是打算根据网课和课本整理一遍,自己打一遍代码,去调试通过。呐、希望自己不会半途而废 (^-^)V

    一.关于空间的使用

    Eg:写程序实现一个函数PrintN,使得传入一个正整数N的参数,能顺序打印从1到N的全部正整数。

     1 //循环实现
     2 void PrintN1 (int N)         
     3 {
     4     for (int i = 1; i <= N; i++) {
     5         printf("%d
    ", i);
     6     }
     7 }
     8 //递归实现 
     9 void PrintN2 (int N)        
    10 {
    11     if(N) {
    12         PrintN2(N - 1);
    13         printf("%d
    ", N);
    14     } 
    15 } 

    结果:当测试数N较大时,例如100,000,用循环可以得出结果,而用递归函数则程序停止运行退出。

    递归算法其优点为是代码简洁清楚,易理解;缺点在于对空间的占用大。

    由此例可见,解决问题方法的效率跟空间的利用效率有关。

    二.关于算法效率

    学习计时函数:clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick。其头文件为time.h。

    常数CLK_TCK:机器始终每秒所走的clock tick数。

     1 #include <stdio.h>
     2 #include <time.h>
     3 clock_t start, stop;    //clock_t是clock()函数返回的变量类型
     4 double duration;        //记录被测函数运行时间,以秒为单位
     5 int main()
     6 {
     7     //不在测试范围内的准备工作写在clock()调用之前
     8     start = clock();  //开始计时 此时clock()返回从主函数开始到clock()被调用的时间
     9     MyFunction();     //此处加需测试函数
    10     stop = clock();   //停止计时 此时clock()返回从主函数开始到此clock()被调用的时间
    11     duration = ((double)(stop - start)) / CLK_TCK;
    12     //其他不在测试范围的处理写在后面,例如输出duration的值
    13     return 0; 
    14 }

     Eg:写程序计算给定多项式  在给定点x=1.1处的值f(1.1)。

    方法一:各项展开得易得

    1 double f1(int n, double a[], double x) {
    2     double sum = a[0];    
    3     for(int i = 1; i <= n; i++)
    4         sum += (a[i] * pow(x,i));    
    5     return sum;
    6 } 

    数组a[]存放了x前的系数,n为控制最高项系数。pow(x,y) 为计算x的y次幂,在vc6中定义为double pow(double x, double y)头文件math.h。此处n=9, a[i] = i。

    方法二:

    1 double f2(int n, double a[], double x) {
    2     double sum = a[n];
    3     for(int i = n; i > 0; i--)
    4         sum = a[i-1] + x*sum;
    5     return sum;
    6 }

    少了调用pow()函数,重复多次x自乘,增加了效率。

    用clock()验证,由于一次运行所用时间短于一个clock tick,所以我们重复多次测量。

     1 #include <stdio.h>
     2 #include <time.h>
     3 #include <math.h>
     4 #define MaxN 10         //最高次数
     5 #define Max_count 1e7   //函数被调用的最大次数 
     6 
     7 double f1(int n, double a[], double x); 
     8 double f2(int n, double a[], double x);
     9 
    10 int main()
    11 {
    12     clock_t start, stop;    //clock_t是clock()函数返回的变量类型
    13     double duration;    //记录被测函数运行时间,以秒为单位
    14     //不在测试范围内的准备工作写在clock()调用之前
    15     double a[MaxN];
    16     for(int i = 0; i < MaxN; i++)    //写入系数,存于a[] 
    17         a[i] = i;
    18     start = clock();     //开始计时 此时clock()返回从main函数开始到clock()被调用的时间
    19     for(int i = 0; i < Max_count; i++) 
    20         f1(9, a, 1.1);    //此处加需测试函数 测试函数1 
    21     stop = clock();        //停止计时  此时clock()返回从main函数开始到此clock()被调用的时间
    22     duration = ((double)(stop - start)) / CLK_TCK / Max_count;
    23     //其他不在测试范围的处理写在后面,例如输出duration的值
    24     printf("方法一 所用clock tick: %f
    ", (double)(stop - start));
    25     printf("方法一 所用时间(s): %f
    ", duration);
    26     
    27     start = clock();    //开始计时 此时clock()返回从main函数开始到clock()被调用的时间
    28     for(int i = 0; i < Max_count; i++) 
    29         f2(9, a, 1.1);    //此处加需测试函数 测试函数1 
    30     stop = clock();        //停止计时  此时clock()返回从main函数开始到此clock()被调用的时间
    31     duration = ((double)(stop - start)) / CLK_TCK / Max_count;
    32     //其他不在测试范围的处理写在后面,例如输出duration的值
    33     printf("方法二 所用clock tick: %fd
    ", (double)(stop - start));
    34     printf("方法二 所用时间(s): %f
    ", duration);
    35     return 0; 
    36 } 
    37 //方法一 
    38 double f1(int n, double a[], double x) {
    39     double sum = a[0];    
    40     for(int i = 1; i <= n; i++)
    41         sum += (a[i] * pow(x,i));    
    42     return sum;
    43 } 
    44 //方法二 
    45 double f2(int n, double a[], double x) {
    46     double sum = a[n];
    47     for(int i = n; i > 0; i--)
    48         sum = a[i-1] + x*sum;
    49     return sum;
    50 }
    Test Code

    方法一和方法二时间相差的是数量级!

    由此例可见,解决问题方法的效率跟算法的巧妙程度有关。

    同理。

     1 #include <stdio.h>
     2 #include <time.h>
     3 #include <math.h>
     4 #define MaxN 101         //最高次数
     5 #define Max_count 1e7   //函数被调用的最大次数 
     6 
     7 double f1(int n, double a[], double x); 
     8 double f2(int n, double a[], double x);
     9 
    10 int main()
    11 {
    12     clock_t start, stop;    //clock_t是clock()函数返回的变量类型
    13     double duration;        //记录被测函数运行时间,以秒为单位
    14     //不在测试范围内的准备工作写在clock()调用之前
    15     double a[MaxN];
    16     a[0] = 1.0;
    17     for(int i = 1; i < MaxN; i++)    //写入系数,存于a[] 
    18         a[i] = 1.0 / i;
    19     start = clock();     //开始计时 此时clock()返回从main函数开始到clock()被调用的时间
    20     for(int i = 0; i < Max_count; i++) 
    21         f1(100, a, 1.1); //此处加需测试函数 测试函数1 
    22     stop = clock();         //停止计时  此时clock()返回从main函数开始到此clock()被调用的时间
    23     duration = ((double)(stop - start)) / CLK_TCK / Max_count;
    24     //其他不在测试范围的处理写在后面,例如输出duration的值
    25     printf("方法一 所用clock tick: %f
    ", (double)(stop - start));
    26     printf("方法一 所用时间(s): %f
    ", duration);
    27     
    28     start = clock();    //开始计时 此时clock()返回从main函数开始到clock()被调用的时间
    29     for(int i = 0; i < Max_count; i++) 
    30         f2(100, a, 1.1);        //此处加需测试函数 测试函数1 
    31     stop = clock();        //停止计时  此时clock()返回从main函数开始到此clock()被调用的时间
    32     duration = ((double)(stop - start)) / CLK_TCK / Max_count;
    33     //其他不在测试范围的处理写在后面,例如输出duration的值
    34     printf("方法二 所用clock tick: %fd
    ", (double)(stop - start));
    35     printf("方法二 所用时间(s): %f
    ", duration);
    36     return 0; 
    37 } 
    38 //方法一 
    39 double f1(int n, double a[], double x) {
    40     double sum = a[0];    
    41     for(int i = 1; i <= n; i++)
    42         sum += (a[i] * pow(x,i));
    43 //    printf("%f
    ",sum);    
    44     return sum;
    45 } 
    46 //方法二 
    47 double f2(int n, double a[], double x) {
    48     double sum = a[n];
    49     for(int i = n; i > 0; i--)
    50         sum = a[i-1] + x*sum;
    51 //    printf("%f
    ",sum);    
    52     return sum;
    53 }
    View Code
  • 相关阅读:
    c语言中逆向显示数值
    c语言中无限循环语句
    css静态网页css代码
    css静态网页css代码
    考试html代码
    考试css代码
    考试html框架代码
    css静态网页代码
    5个CSS书写技巧
    5个CSS书写技巧
  • 原文地址:https://www.cnblogs.com/kuotian/p/5293361.html
Copyright © 2011-2022 走看看