一 数据结构与算法入门

本文深入讲解数据结构基础知识,包括线性表、二叉树、图等常见数据结构,以及它们的逻辑与存储结构。探讨数据结构的学习阶段,从理论理解到实际应用,再到综合运用。分析数据元素、数据项、数据对象的概念,以及数据结构在算法设计中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

  • 有哪些数据结构?

线性表,栈,队列,串,数组,广义表,树,二叉树,图

重点是线性表,二叉树

每种数据结构需要掌握,添加、更新、删除、查询、排序等操作的实现

学习数据结构的四种境界:

境界1:听懂理论,听懂算法思路

境界2:完成主要数据结构基本算法的实现(理论+实践,数据结构入门)

境界3:完成更多数据结构更多算法的实现

境界4:融会贯通,举一反三,在后续开发中综合应用数据结构知识。

 

数据(data):  是描述客观事物的数值、字符、以及能输入及其且能被处理的各种符号集合。例如:数值、字符、声音、图像等等。

数据项(data item): 具有原子性,是不可分割的最小数据单位。如学生信息相关的性别。

数据元素(data Element): 数据的基本单位,通常由若干个数据项组成,在计算机程序中通常作为一个整体来处理。如描述一名学生完整信息的数据记录,包含学号、姓名等数据项。

数据对象(data Object): 性质相同的数据元素的集合,数据的子集。如一个学校所有学生的集合。

数据结构(data structure) :互相之间存在一种或多种关系的数据元素的结合,包括逻辑结构,存储结构,数据的运算。

 

  • 数据结构(data structure):相互之间存在一种或多种特定关系的数据元素的集合。

一种是数据结构的逻辑层面,即数据的逻辑结构

一种是存在于计算机的物理层面,即数据的存储结构

  • 数据结构=逻辑结构+存储结构+在存储结构上的运算/操作

 

  

 

  •  数据的逻辑结构:数据元素之间的逻辑关系(和实现无关)

线性结构:有且只有一个开始节点和终端结点,并且所有节点最多只有一个直接前驱和直接后继。

线性表是一个典型的线性结构。

 

  • 分类2:集合结构、线性结构、树状结构、网络结构

逻辑结构有四种基本类型:集合结构、线性结构、树状结构、网络结构。

表和树是最常用的两种高效数据结构。

集合结构:类似数学里的集合。

  • 确定性:集合中的元素必须是确定的
  • 唯一性:集合中的元素互不相同,{1,a},那么a不等于1
  • 无序性:集合中的元素不分先后,{1,2}和{2,1}算同一个集合

线性结构:数据元素之间存在一对一的线性关系的数据关系

树状结构:除了第一个元素以外每个元素有且仅有一个直接前驱元素,但是可以有多个后继元素。一对多的关系。

网状结构:每个数据可以有多个前驱、多个后继。多对多的关系。   

 数据的存储结构:顺序存储、链式存储、索引存储、散列存储。数据元素本身之间的存储和以及数据元素之间的关系表示,数据的逻辑在计算机中的表示。

顺序存储结构:通常借助数组来实现。采用连续的存储空间。把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。

优点:节省存储空间。分配的存储空间用来存储结点的数据,结点之间的逻辑关系不占用存储空间。可以实现对结点的随机存取,一个结点对应一个序号,通过序号得到存储地址,查询方便。

缺点:插入和删除操作需要移动元素,效率低。

链式存储结构:数据元素对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素。

每个结点有数据域和指针域组成,元素之间的逻辑关系通过存储结点之间的链接关系反映出来。

特点:1 比顺序存储结构密度小。

          2 逻辑上相邻的物理结点不必相邻。

          3 插入、删除灵活(不必移动结点,只需要改变其中的指针)。

          4 查询慢

索引存储结构:除建立存储结点信息外,还建立附加索引表来标识结点的地址。主要面向查找操作,比如图书的目录。

散列存储结构:根据结点的关键字通过散列函数计算出该结点的存储地址。

 

数据的运算:

引用型运算:不改变数据结构中原有的数据元素的状态,只根据需要读取某些信息

加工型运算:改变数据结构中数据元素的状态,如内容,个数

 

算法:

 

对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。

 

算法的特点:

有穷性:一个算法必须在有限个步骤之后结束

确定性:一个算法的每一个步骤都有其确切的含义,相同的输入必然有相同的输出

可行性:算法中的每一步必须可以通过基本运算的有限次执行实现

输入:零个或多个,取决于特定的数据对象集合。

输出:一个或多个,输出与输入之间存在某种特定的关系。

 

算法的要求:

正确:算法的执行结果满足预先规定的功能和性能要求

可读:一个算法应当思路清晰,层次分明、简单明了、易读易懂,一个算法不仅是让机器来执行,也是让人来读的

健壮:当输入不合法数据时,算法能够进行适当处理,而不会产生莫名其妙的输出或者引起其他的后果

高效:算法应当具备良好的时空性能

 

算法的性能分析:

时间复杂度:一个算法在计算机上转换成程序并运行所需要的时间,由问题规模决定。

主要取决于以下因素:

  1. 硬件的速度:机器的指令性能和速度,一般来讲64位机比32位机要快,主频为2GHZ高于主频为1GHZ
  2. 书写程序的语言:语言级别越低,运行速度越快: 汇编  > C语言,C++  > Java 
  3. 编译语言所生成的目标代码的质量:对于代码优化比较好的程序,其所生成的目标代码的质量较高
  4. 问题的规模 : 一般来讲,算法的时间复杂度是问题规模n的函数, T(n) = ∑(ti + ci ) , ti是一条语句需要的时间,ci是语句的频度,即次数
  5. 如果没有特别说明,一般是指最坏的时间复杂度

 

空间复杂度:算法运行从开始到结束需要的存储量。

主要由以下构成:

  1. 固定部分:此部分与所处理数据的大小、个数等无关,主要包括程序代码、常量、简单变量、结构变量等决定。
  2. 可变部分:此部分与算法在某次执行中处理的特定数据的大小和规模有关。问题规模较大时,可变部分可能大于固定部分。所以一般讨论算法的渐进空间复杂度。

 

转载于:https://www.cnblogs.com/ltfxy/p/9798825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值