数据结构(一)数据结构简介

本文介绍了数据结构的基本概念,包括数据、数据元素、数据结构类型(如线性、树形和图状)、存储结构以及算法和算法分析,重点讲述了算法的特性、设计要求和时间复杂度、空间复杂度的评估。

提示:本文仅做简单介绍,部分图来自网络,侵删


一、什么是数据结构

计算机处理具体问题的一般步骤:
1)从具体问题中抽象出一个适当的数学模型;
2)设计一个解决此数学模型的算法;
3)编写出程序;
4)进行测试、调整直至得到最终答案;

与以往的数学问题不同,计算机科学中的大多数问题是非数值计算问题,因而其数学模型不再是数学方程,而是诸如表、树、图之类的数据结构。因此数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象、操作对象之间的关系以及如何操作操作对象的学科
在这里插入图片描述

1968~ 数据结构作为独立学科出现,随后其概念和理论得到大量扩充,可配合《离散结构》学习,值得注意的是“数据结构”的发展一直未结束,而且一直在高速发展。数据结构所处地位:
在这里插入图片描述
涉及数学、计算机软件、计算机硬件三者的一门混合学科

二、基本概念与术语

数据data:客观事物的符号表示,在CS中特指 所有能输入到计算机中,并被计算机程序处理的符号总称
数据元素data element:数据的基本单位,在CS中通常作为一个整体进行考虑和处理。
数据对象data object:性质相同的数据元素的集合,是数据的子集。
数据结构data structure:相互之间存在一种或多种特定关系的数据元素的集合。
集合:数据元素间仅存在同属一个集合的关系;
线性结构:数据元素间存在一对一的关系;
树形结构:数据元素间存在一对多的关系;
图状结构:数据元素间存在多对多的关系;
在这里插入图片描述
数据结构定义形式:
Data_Structure = (D, S)
D 数据元素有限集;
S D上关系的有限集;

这种关系也称数据的逻辑结构;数据在计算机上上表示称为物理结构存储结构,它包含数据元素的表示(映像)和关系。

bit:计算机中表示信息的最小单位,二进制数的一位;
元素 element / 节点node:数据元素包含通常一个或多个位,这些位串组成元素或节点;

数据结构在计算机中有两种存储结构:顺序存储结构和链式存储结构
顺序存储结构:借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系;
链式存储结构:借助指示元素存储地址的指针pointer 表示数据元素之间的逻辑关系;

数据类型data type:一个值的集合以及定义在值集上的一组操作的总称。例如 C语言中的 的int类型变量,以及定义在其上的加减乘除取模操作。

原子类型 atomic data type:该类型的变量是不可分解的,(例如 整形、字符串……);
结构类型:加粗样式可分解的,其值成分的数目可以是确定的(例如 数组……)也可以是不确定的(例如 动态数组……);

抽象数据类型 abstract data type (ADT):一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即无论其内部如何变化,只要其数学特性不变,都不影响其他外部使用。<==> 数学抽象后的数据类型。可表示为:
(D, S, P)
D:数据对象
S:D上的数据关系集
P:D的基本操作

例:
在这里插入图片描述

// 伪代码
#define		TRUE			1
#define		FALSE			0
#define		OK				1
#define		ERROR			0
#define		INFEASIBLE		-1
#define		OVERFLOW		-2
typedef 	int			Status


ADT Triplet{
	// 数据对象:
    D={e1, e2, e3 };
	// 数据关系:
	R1 = {<e1, e2>, <e2, e3>};
	// 基本操作:
    STatus InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3){
      	T = (ElemType *)malloc(3 * sizeof(ElemType));
      	if(!T) {return OVERFLOW;}
      	T[0] = v1, T[1] = v2, T[3] = v3;
      	return OK;
    }		// 构造三元组T,e1,e2,e3分别被赋值v1,v2,v3
	STatus DestroyTrilet(&T){
      	free(T);
      	T = NULL;
      	return OK;
    }		// 销毁三元组T
  	STatus Get(T, i. &e){
      	if(i < 1 || i > 3) {return ERROR;}
      	e = T[i - 1];
      	return OK;
    }		// 使用e获取T的第i个元素
  	STatus Put(&T, i, e){
		if(i < 1 || i > 3) {return ERROR;}
      	T[i - 1] = e;
      	return OK;
    }		// 改变T的第i个元素为e
  	STatus IsAscending(T){
    	return (T[0] <= T[1]) && (T[1] <= T[2]);
    }		// 判断T的元素是否升序排列,是则返回1,否则返回0
  	STatus IsDescending(T){
    	return (T[0] >= T[1]) && (T[1] >= T[2]);
    }		// 判断T的元素是否降序排列,是则返回1,否则返回0
  	STatus Max(T, &e){
    	e = (T[0] >= T[1]) ? ((T[0] >= T[2]) ? T[0]:T[2]):((T[1] >= T[2])? T[1]:T[2])
        return OK;
    }			// e返回T的最大元素值
  	STatus Min(T, &e){
    	e = (T[0] <= T[1]) ? ((T[0] <= T[2]) ? T[0]:T[2]):((T[1] <= T[2])? T[1]:T[2])
        return OK;
    }			// e返回T的最小元素值
}

三、算法和算法分析

**算法 algorithm **:对特定问题求解的一种描述,它是指令的有限序列,其中每条指令表示一个或多个操作,除此之外,算法还具有以下5个重要特性。

  1. 有穷性,一个算法必须在又穷时间内执行有穷步之后结束;
  2. 确定性,每一条指令必须有确定的含义,不能产生二义性;
  3. 可行性,算法中的操作都是通过已经实现的基本运算执行有限次数来实现的;
  4. 输入,必须有零个或多个输入;
  5. 输出,必须有一个或多个输出;

算法设计的要求

  1. 正确性correctness
  2. 可读性readability
  3. 健壮性robustness
  4. 效率与低存储量需求``,

算法效率的度量

  1. 事后统计,受计算机软硬件条件限制,不常用。
  2. 事前分析,常用,具体影响因素有:
  • 算法所采用的策略;
  • 问题的规模;
  • 编写程序的语言;
  • 编译程序产生的机器代码的质量;
  • 机器执行指令的速度;

时间复杂度asymptotic time complexity:算法中基本重复执行的次数(语句频度 frequency count)是问题规模 n 的某个函数 f(n) ,时间复杂度与 f(n) 成正比,算法的时间度量记作: T(n) = O( f(n) ) .

例:

// 1)
{ ++ x; s = 0;} 			// O(1)

// 2)
for(i = 0; i <= n; i ++) { ++ x; s = 0;} 			// O(n)

// 3)
for(i = 0; i <= n; i ++) 
for(i = 0; i <= n; i ++) 
{ ++ x; s = 0;} 			// O(n^2)

算法分析通常考虑输入数据集的期望,此时求得的算法时间复杂度称为平均时间复杂度
当无法确定输入数据集的出现概率的情况下,更常用的是统计最坏情况下的时间复杂度

空间复杂度space complexityS(n) = O( f(n) ),可参考时间复杂度的定义和计算方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值