数据结构 第一章 基本概念

很久之前学的数据结构,现在开始重新学习,尽量每一个行代码都会给解释,加加油!

一、基本概念:
数据(data)是对客观事物的符号表示,指所有能输入到计算机中的并被计算机程序处理的符号的总称。例如,一个利用数据分析方法解代数方程的程序,其处理对象是整数和实数;一个编译程序或文字处理程序,其处理对象就是字符串,也就是所谓的数据。
数据元素(data element)是数据的基本单位,在计算机中程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个 数据项组成。例如:一本书的书目信息为一个数据元素,而书目信息中的每一项(如书名,作者名等)为一个数据项。数据项是数据的不可分割的最小单位。
数据对象(data object)是性质相同的数据元素的集合
数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。在计算机中,用一个由若干位组合起来形成的一个位串表示一个数据元素(如用一个字长的位串表示一个整数,用八位二进制数表示一个字符串等),通常称这个位串位元素(element)或结点(node)。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域。因此,元素或结点可看成时数据元素在计算机中的映像。
数据类型(data type) 用以刻画(程序)操作对象的特性。在用高级程序语言编写的程序中,每个变量、常量或表达式所有可能取值的范围,以及在这些值上允许进行的操作,因此数据类型是一个值的集合或定义在这个值集上的一组操作的总称。
按 “值“的不同特性,高级程序语言中的数据类型可分为两类:一类是非结构的原子类型。原子类型的值是不可分解的(例如,C语言中的基本类型,整形,实型,字符型)另一类是结构类型,结构类型的值是由若干成分按某种结构组成的,因此是可以分解的,并且它的成分可以是非结构的,也可以是结构的。(例如数组的值是由若干分量组成,每个分量可以是整数,也可以是数组等)在某种意义上,数据结构可以看成是”一组具有相同结构的值“,则结构类型可以看成由一种数据结构和定义在其上的一组操作组成。
抽象数据类型(Abstruct Data Type):是指一个数学模型以及定义在该模型上的一组操作,抽象数据类型的定义仅取决于它的一组逻辑特性,而于其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。一个含抽象数据类型的团建模块通常应包含定义、表示和实现三个部分。
抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。若按其值的不同特性,可细分为下列三种类型:
(1)原子类型 (atomic data type)属原子类型的变量的值是不可分解的,
(2)固定聚合类型(fixed-aggregate data type)属该类型的变量,其值由确定数目的成分按某种结构组成。
(3)可变聚合类型(variable-aggregate data type)构成可变聚合类型“值”的成分的数目不确定
数据元素之间的关系在计算机中又两种不同的表示方式: 顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构件。
(1)顺序映像:
特点时借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
(2)非顺序映像
特点时借助值是元素存储地址的指针(pointer)表示数据元素之间的逻辑关系
结构(structure):在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在这某种关系,这种数据元素之间关系的不同特性,通常有下列四类基本结构:
(1)集合:结构中的数据元素之间处理“同属于一个集合”的关系外,别无其他的关系
(2)线性结构:结构中的数据元素之间存在一个对一个的关系
(3)树形结构:结构中的数据元素之间存在一个对多个的关系
(4)图状结构或网状结构:结构中的数据元素之间存在多个对多个的关系

二、抽象数据类型的表示与实现
抽象数据类型可通过固有数据类型来表示和实现,即利用处理器中存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
(1)预定义常量和类型:

//函数结果状态代码
#define TRUE           1
#define False          0
#define OK             1
#defing ERROR          0
#define INFEASIBLE    -1
#define OVERFLOW      -2 

(2)数据结构的表示(存储结构)用类型定义(typedef)描述。数据元素类型约定为ElemType,由用户在使用该数据 类型是自行定义。
(3)基本操作的算法都用一下形式和函数描述:

     函数类型   函数名  (函数参数表){
       //算法说明
       语句序列
     } //函数名

(4)循环语句:

 for语句       for (赋初值表达式序列;条件;修改表达式序列)语句;
 while语句     while(条件)语句;
 do-while语句  do{
                 语句序列;
              }while(条件);

(5)结束语句

函数结束语句    return 表达式;
               return;
case结束语句    break;
异常结束语句    exit(异常代码)

三、抽象数据类型Triplet的表示和实现

//   -------采用动态分配的顺序存储结构
Status InitTriplet(Triplet &T, ElemType ,ElemType       v2,ElemType v3){
 //构造三元组T,以此置T的三个元素的初值为v1,v2,v3
T = (ElemType *)malloc(3*sizeof(ElemType));//分配三个元素的存储空间
if(!T) exit(OVERFLOW);//分配存储空间失败,T不存在
T[0] = v1; T[1] = v2; T[2] = v3;
return OK; 
}//InitTriplet
Status DestroyTriplet(Triplet &T)//销毁三元组T
{
    free(T);//释放三元组
    T= null;//将指针T置为空                          
    return OK;
}

Status Get(Triplet T,int i,ElemType &e){、、取值
    if(i < 1 || i > 3) return ERROR;//用e返回T中的第i元的值
	e = T[i-1];
	return OK;
}//Get

Status Put(Triplet &T, int i, ElemTrip e)//赋值
{
    if(i < 1 || i > 3) return ERROR;
	T[i - 1] = e;//把第i个元赋值为e
	return OK;
}//Put

Status IsAscending(Triplet T)//判断是否是按升序排列的
{ 
	return (T[0] <= T[1]) && ([1] <= T[2]);
    
}
 
Status IsDescending(Triplet T)//判断是否是按降序排列的
{
    return (T[0] >= T[1]) && (T[1] >= T[2]);
}

Status Max(Triplet T, ElemType &e)
{
    e = (T[0] >= T[1]) && ((T[0] >= T[2]) ? T[0]: T[2])
                       :(T[1]>=T[2]?T[1]:T[2]);
	return OK;
}//Max


Status Min(Triplet T, ElemType &e)
{
    e = (T[0] <= T[1]) && ((T[0] <= T[2]) ? T[0]: T[2])
                       :(T[1]<=T[2]?T[1]:T[2]);
	return OK;
}//Min

四、算法和算法分析
算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条指令表示一个或多个操作。算法具有的五个特性:
(1)有穷性 一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
(2)确定性 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有惟一的一条执行路径,即对于相同的输入只能得出相同的输出。
(3)可行性 一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
(4)输入 一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
(5)输出 一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。

算法设计的要求:
(1)正确性 算法应当满足具体问题的需求,通常一个大型问题的需求,要以特定的规格说明方式给出,而一个实习问题或练习题,往往就不那么严格,就目前多数是用自然语言描述需求,它至少应当包括对于输入、输出和加工处理等的明确的无歧义的描述。设计或选择的算法应当能正确的反映这种需求;否则,算法的正确与否的衡量准则就不存在了。
”正确”一词的含义在通常的用法中有很大差别,大体可分为以下四个层次:
a:程序不含语法错误
b:程序对于几组输入数据能够得出满足规格说明要求的结果
c:程序对于精心选择的典型、苛刻而带有刁难性几组输入数据能够得出满足规格说明要求的结果
d:程序对于一切合法的输入数据都产生满足规格说明要求的结果。
(2)可读性(readability)算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解
(3)健壮性(robustness)当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。并且,处理出错的方法应是返回一个表示错误或错误性质的值,而不是打印错误信息或异常,并中止程序,以便在更高的抽象层次上进行处理
(4)效率与低存储量需求 通俗的说,效率指的是算法执行的时间。对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间。效率与低存储量需求这两者都与问题的规模有关。

[这是我看了数据结构书,之后自己总结的,也抄了很多书上的东西,若有不足或者错误之处,虚心接纳]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值