陈越、何钦铭《数据结构》第一讲基本概念 笔记

本文详细记录了《数据结构》第一讲的内容,包括数据结构的基本概念,如数据组织、空间使用和算法效率。通过图书摆放、PrintN函数和计算多项式值的示例,探讨了数据组织方式对效率的影响。此外,还讨论了算法的定义、好算法的标准以及复杂度分析。最后,通过最大子列和问题展示了不同算法的实现和性能比较。
摘要由CSDN通过智能技术生成

《数据结构》第一讲基本概念 

1.1什么是数据结构

1.1.1关于数据组织-例:图书摆放

”数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相应的函数来给出。“ Sartaj Sahni《数据结构、算法与应用》

”数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现“ Clifford A.Shaffer 《数据结构与算法分析》

”数据结构(data structure)是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。“   中文维基百科

例1:如何在书架上摆放图书?

数据如何组织和规模有关系。

图书的摆放要使得两个操作方便实现,操作1:新书怎么插入。操作2:怎么找到某本指定的书。

方法1:随便放。操作1:哪里有空放哪,一步到位。操作2:难以实现。

方法2:按照书名的拼音字母顺序排放。操作1:难以实现,比如新进一本《阿Q正传》,则要将之后的书一本一本往后错位,直到前面留出空当为止。操作2:二分查找。

方法3:把书架划分成几块区域,每块区域指定摆放某种类别的书,每种类别内,按照书名的字母拼音顺序排放。操作1:先定类别,二分查找确定位置,移出空位。操作2:先定类别,再二分查找。

基于方法3,问题:空间如何分配?类别应该分多细?

上述例子说明,解决问题方法的效率,跟数据的组织方式有关。

讨论1.1 对中等规模、大规模的图书摆放,你有什么更好的建议?

答:先分大类,大类可以再细分小类,基于合适的数量时,再利用拼音字母顺序摆放。也可以利用计算机建立索引目录,对所有书按类别,按出版时间,按作者等以不同方式进行编号,可以通过不同的检索条件,快速查找到图书。

1.1.2关于空间使用-例:PrintN函数实现

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

循环实现:

[cpp]  view plain copy
  1. void PrintN(int N)  
  2. {  
  3.     for(int i = 1;i < N;i++)  
  4.         printf("%d\n",i);  
  5.     return;  
  6. }  
递归实现:

[cpp]  view plain copy
  1. void PrintN(int N)  
  2. {  
  3.     if(N)  
  4.     {  
  5.         PrintN(N - 1);  
  6.         printf("%d\n",N);  
  7.     }     
  8.     return;  
  9. }  
递归实现没有用到临时变量i,看上去更简洁,输入比较小的正整数时,两个版本的结果也类似,但在我的电脑上,当N大于等于65081时,循环实现还是可以正常运行,而递归实现没有打印出任何数,如下图所示。

因为递归程序对空间占用很大,上述程序就是因为递归程序用完了能用的空间,非正常终止了。

上述例子说明,解决问题方法的效率,跟空间的利用效率有关。

1.1.3关于算法效率-例:计算多项式值

例3:写程序计算给定多项式在给定点x处的值

多项式:f(x) = a0 + a1*x + a2*x^2 + ……+ an-1*x^(n-1) + an*x^n

最直接的算法:

[cpp]  view plain copy
  1. double f1(int n,double a[],double x)  //n为阶数,系数放在数组a中,x为要计算的点   
  2. {  
  3.     int i;  
  4.     double p = a[0];  
  5.     for(i = 1;i <= n;i++)  
  6.         p += (a[i] * pow(x,i));  
  7.     return p;  
  8. }  
多项式另一种写法( 秦九韶算法):f(X) = a0 + x*(a1 + x*(…+x*(an-1 + x*(an))…)

[cpp]  view plain copy
  1. double f2(int n,double a[],double x) //n为阶数,系数放在数组a中,x为要计算的点   
  2. {  
  3.     int i;  
  4.     double p = a[n];  
  5.     for(int i = n;i > 0;i--)  
  6.         p = a[i-1] + x * p;  
  7.     return p;  
  8. }  

我们开始比较两种函数的运行时间:

C语言提供了clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即”时钟打点“。常数CLK_TCK:机器时钟每秒所走的时钟打点数。

常用的计算函数运行时间的模板:

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

下面给定具体多项式
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值