数据结构基本概念
前言
计算机解决问题的步骤:
- 从具体问题中抽象出数学模型
- 设计一个解决这个模型的算法
- 编写程序,进行测试、调整得到最终结果
寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些对象之间的关系,然后用数学语言加以描述。
数据结构三要素:逻辑结构、存储结构、数据运算
算法:是对特定问题求解步骤的描述
基本概念
数据
数据(data)是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号集合。是计算机程序加工的“原料”。
数据元素
数据元素是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
程序=数据结构+算法
数据对象
数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据类型
数据类型是一个值的集合和定义在这个集合上的一组操作的总称。
- 原子类型:原子类型的值是不可分解的。例如基本类型、指针类型和空类型。
- 结构类型:结构类型的值是由若干成分按某种结构组成的,是可分解的。
抽象数据类型是一个数学模型及定义在该模型上的一组操作,通常用(数据对象,数据关系,基本操作集)表示
数据类型:数据对象集、数据集合相关联的操作集
抽象:描述数据类型的方法不依赖于具体实现。与存放数据的机器无关,与数据存储的物理结构无关,与实现操作的算法和编程语言均无关
只描述数据对象集和相关操作集“是什么”,并不涉及“如何做到”的问题
数据对象必定与一系列加在其上的操作相关联,完成这些操作所用的方法就是算法
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据元素不是孤立存在的,它们之间的关系称为结构。
-
逻辑结构:是指数据元素之间的逻辑关系。它与数据的存储无关,是独立于计算机的。
线性结构:线性表、栈、队列
非线性结构:集合、图状结构或网状结构、树形结构 -
存储结构:数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。在计算机中表示信息的最小单位是二进制数的一位,叫做位(bit)。在计算机中,我们可以用一个由若干位组合起来形成的一个位串表示-一个数据元素(如用一个字长的位串表示一个整数,用8位二进制数表示一个字符等),通常称这个位串为元素D(element)或结点(node)。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域(data field)。 因此,元素或结点可看成是数据元素在计算机中的映像。
数据的存储结构是用计算机语言实现的逻辑结构,它依赖于计算机语言。
顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的单元中,元素之间的关系由存储单元的邻接关系来体现。
链式存储:用指针表示元素之间的逻辑关系,能充分利用所有存储单元。
索引存储:建立附加的索引表。
散列存储:哈希存储。 -
数据运算
施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体步骤。
数据结构的形式定义:Data Structure = (D,S)
。其中:D是数据元素的有限集,S是D上关系的有限集。
数据的逻辑结构和存储结构是密不可分的两个方面,算法的设计取决于所选定的逻辑结构,算法的实现依赖于所采用的存储结构。
在探讨一种数据结构时:
①定义逻辑结构(数据元素之间的关系)
②定义数据的运算(针对现实需求,应该对这种逻辑结构进行什么样的运算)
③确定某种存储结构,实现数据结构,并实现一些对数据结构的基本运算
算法和算法分析
算法:是对特定问题求解步骤的描述
算法的五个特性:有穷性、确定性、可行性、输入、输出
算法是有穷的,程序可以是无穷的
算法设计的要求:正确、可读、健壮、高效率与低存储需求
正确的四个层次:
- 程序不含语法错误
- 程序对于一般的输入数据能够得出满足规格说明的要求的结果
- 程序对于精心挑选的典型、苛刻的输入数据够得出满足规格说明的要求的结果
- 程序对于一切合法的输入数据够得出满足规格说明的要求的结果
解决问题方法的效率,与数据的组织方式、空间利用效率、算法的巧妙程度有关。
平均情况复杂度
最坏情况复杂度
时间复杂度
T(n) 根据算法写成的程序在执行时耗费时间的长度。
影响因素:
- 算法策略
- 问题规模
- 书写程序的语言(语言越高级,效率越低)
- 编译程序产生的机器代码的质量
- 机器执行指令的速度
事先分析估算法
渐进表示法,T(n)=O(f(n))
算法的执行时间与基本操作的重复的执行次数成正比
事后统计法
有些算法是不能事后统计的
用时钟打点计时得到运行时间
#include<stdio.h>
#include<time.h>
#include<math.h>
#define MAXK 1e7 /*被测函数最大重复调用次数*/
···
int main (){
start = clock () ;
for ( i=0; i<MAXK; i++ ) /* 重复调用函数以获得充分多的时钟打点数*/
f1 (MAXN-1,a,1.1) ;
stop = c1ock () ;
duration = ( (double) (stop - start)) /CLK_ TCK/MAXK; /*计算函数单次运行的时间*/
printf ("ticks1 = 8f\n",(doub1e) (stop - start)) ;
printf ("duration1 = 86.2e\n", duration) ;
...
return 0;
}
空间复杂度
S(n) 根据算法写成的程序在执行时占用存储单元的长度
其中n为问题的规模(或大小)。一个上机执行的程序除了需要存储空间来寄存本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输人数据所占空间只取决于问题本身,和算法无关,则只需要分析除输人和程序之外的额外空间,否则应同时考虑输人本身所需空间(和输人数据的表示形式有关)。若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。又如果所占空间量依赖于特定的输入,则除特别指明外,均按最坏情况来分析。
本文来自博客园,作者:Patrick-Rex,转载请注明原文链接:https://www.cnblogs.com/patrickrex/p/18028768
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升