数据结构作业(1)
1.术语简答
数据:是用于描述对象的符号。一切能输入到计算机中并能被计算机程序识别和处理的符号集合。包括数值数据和非数值数据。
数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据结构:是研究数值与非数值计算问题中计算机的操作对象以及它们之间的关系和操作的学科。
数据类型:包括数值范围和一系列操作。
2. 逻辑结构与物理结构的区别和联系是什么?
区别:
1、含义不同,逻辑结构的意思是对数据之间关系的描述,而物理结构的意思是数据元素在计算机中的存储及其逻辑关系的表现
2、任务不同,逻辑结构的主要任务是把基本的概念模型图变成和选中的数据模型相吻合的逻辑结构。而物理结构的主要任务则是通过计算机系统的特点 ,为选定的数据模型确定一个合理的存储结构以及存取方法。
3、反应数据成分不同。逻辑结构反映的是数据之间的逻辑关系。而物理结构反映的是数据在计算机里面的存储安排。
联系:
所设计的逻辑结构决定应该采用何种存储结构
选择合适的存储结构表达清晰的逻辑结构
3. 算法分析的目的是什么?如何评价一个算法?
算法分析的目的
评价算法的效率,通过评价可以选用更加好更加适合的算法来完成。
如何评价一个算法:
标准:
① 正确性(Correctness ):算法应满足具体问题的需求。
② 可读性(Readability):算法应容易供人阅读和交流。可读性好的算法有助于对算法的理解和修改。
③ 健壮性(Robustness):算法应具有容错处理。当输入非法或错误数据时,算法应能适当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
④ 通用性(Generality):算法应具有一般性,即算法的处理结果对于一般的数据集合都成立。
⑤ 效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。
分析一个算法主要是对该程序的时间,空间复杂性的估算分析。
评价算法效率的方法
事后统计:将算法实现,测算其时间和空间的开销。
事前分析:对算法所消耗资源的一种估算方法。
4. 解释程序设计中的数据类型和数据结构中的抽象数据类型的概念以及相互关系。
概念
数据类型指的是数值范围和一系列操作。定义为二元组(D,S)
抽象数据类型(ADT)的定义仅是一组逻辑特性描述, 与其在计算机内的表示和实现无关。因此,不论ADT的内部结构如何变化,只要其数学特性不变,都不影响其外部使用。定义为三元组(D, S, P)
关系
抽象数据类型本质是数据类型。抽象数据类型在数据类型的基础上添加P(基本操作集)。“抽象数据类型”是“物理”概念,“数据结构”是“逻辑”概念。“抽象数据类型”来实现“数据结构”。
5.分析以下程序段的时间复杂度。
Sum1( int n ){
int p=1, sum=0, m ; //1
for (m=1; m<=n; m++){ //n+1
p*=m ; sum+=p ; //2*n
}
return (sum) ; //1
}
Total time:
3
n
+
3
3n+3
3n+3
Sum2( int n ){
int sum=0, m, t ; //1
for (m=1; m<=n; m++){ //n+1
p=1 ; //n
for (t=1; t<=m; t++){ //n*(n+3)/2
p*=t ; //n*(n+1)/2
}
sum+=p ; //n
}
return (sum) ; //1
}
Total time:
x
2
+
5
n
+
3
x^{2}+5n+3
x2+5n+3
6.绘制流程图部分
(1)分别用while 和for 两种循环,求5~100自然数累加和的算法。
(2)分别用while 和for 两种循环,求5~100自然数中所有偶数的累加和。
(3)已知一组(n个)自然数的范围是1~1000,求出其中最大值和最小值。
(4)已知一组(n个)自然数的范围是-1000~1000,统计其中正数和负数的数目。
7. 熟练指针的题目(自行在计算机上进行编程练习)。
① 建立单链表
② 单链表上按位置查找
③ 单链表上按值查找
④ 删除单链表中的元素
⑤ 两个递增有序的单链表合并
struct Node{
ElemType data;
struct *Node;
}Node;
① 建立单链表
void AddNode(Node *head,Node *end,ElemType _data){
Node *temp=new Node;
temp.data=_data;
temp.next=NUll;
if(NULL==head){
head=temp;
return;
}else{
end.next=temp;
}
end=temp;
return ;
}
② 单链表上按位置查找
bool FindByNum(int i){
if(NULL==head){
return false;
}
Node *temp=head;
cnt=0;
while(temp!=NULL){
if(cnt==i){
return true;
}else{
temp=temp->next;
cnt++;
}
}
return false;
}
③ 单链表上按值查找
bool FindByVal(ElemType _data){
if(NULL==head){
return false;
}
Node *temp=head;
while(temp!=NULL){
if(temp.data=_data){
return true;
}else{
temp=temp->next;
}
}
return false;
}
④ 删除单链表中的元素
bool delete(ElemType _data){
if(NULL==head){
return false;
}
Node *temp=head;
while(temp.data==_data){
Node *t=temp;
head=head->next;
delete t;
}
while(temp->next!=NULL){
if(temp->next.data==_data){
Node *t=temp->next;
temp=temp->next->next;
delete t;
}else{
temp=temp->next;
}
}
return true;
}
⑤ 两个递增有序的单链表合并
//考虑简单情况,两个链表非空
void MergeOrderedLists(Node *List1,Node *List2){
Node *p1=List1,*p2=List2;
Node *head=*end=NULL;
while(p1||p2){
if(p1&&p2){
if(p1.data<p2.data){
AddNode(head,end,p1.data)
p1=p1->next;
}else{
AddNode(head,end,p2.data)
p2=p2->next;
}
}else if(p1&&!p2){
Node *temp=p1;
while(p1!=NULL){
AddNode(head,end,p1.data);
p1=p1->next;
}
}else{
Node *temp=p2;
while(p2!=NULL){
AddNode(head,end,p2.data);
p2=p2->next;
}
}
}
return true;
}