数据结构与算法的基本概念


前言

  T_T此专栏用于记录数据结构及算法的(痛苦)学习历程,便于日后复习(这种事情不要啊)。所用教材为《数据结构 C语言版 第2版》严蔚敏。


一、数据与数据结构

1.数据

  数据的定义:客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。
  数据元素是数据的基本单位,在程序中常作为一个整体进行考虑和处理,也称为元素或记录、节点和顶点。构成数据元素的最小单位是数据项。例如学生包含姓名学号等等,全部学生构成一个数据,单个学生是一个数据元素,单个学生的姓名则是数据元素的数据项。
  数据对象:指具有相同性质的数据元素的集合,是数据的一个子集。例如所有男生是所有学生的一个子集。

2.数据结构

  数据结构:指相互之间存在一种或多种特定关系的数据元素的集合,包括数据的逻辑结构、数据的物理结构。
  逻辑结构:即指数据的逻辑关系,例如a=b。逻辑结构可分为线性结构和非线性结构。
    线性结构:有且仅有一个节点只有后继节点(开始节点),有且仅有一个节点只有前驱节点(终端节点),并且所有其余节点仅有一个前驱和一个后继节点。想象一些人在玩老鹰抓小鸡,小鸡一方第一个即为开始节点,最后一个即为终端节点。(老鹰老鹰别吃我T~T)常见线性结构有:线性表、栈、队列和串。(这些是什么?我现在也不知道?_?)
    非线性结构:一个节点可能有多个前驱或后继节点。例如一人脚踏两只船??常见的非线性结构有:树、图。
在这里插入图片描述

  逻辑结构亦可分为四大逻辑结构:
    集合结构:数据元素之间除了同属一个集合外,互相无其他关系。
    线性结构:数据元素之间是一对一的,如大头儿子对小头爸爸。
    树形结构:数据元素之间是一对多的关系,如一个父亲两个孩子。
    图形/网形结构:数据元素之间是多对多的关系。
在这里插入图片描述

  由此可知,集合、树形、网形结构均为非线性结构。
  物理结构:即数据的存储方式。物理结构分为顺序存储结构和链式存储结构。
    顺序存储结构:即给分配一段连续的空间存储数据,例如数组。
    链式存储结构:数据在空间中的存储位置并非连续,而是呈现满天飞的形式。数据间通过一条无形的链连接起来,即指针。从而,使用链式存储结构的数据域,同时应具有对应的指针域,数据域存放数据,指针域指示其后继的信息。

二、数据类型与抽象数据类型

1.数据类型

  数据类型定义:数据类型是一个值的集合和定义在这个值集上的一组操作的总称。例如,C语言中的整型,其值为某个区间上的整数(区间大小依赖于不同的机器),定义在其上的操作为加、减、乘、除和取模等算术运算。

2.抽象数据类型

2.1抽象数据类型定义

  抽象,即抽取出实际问题的本质。在计算机中使用二进制数来表示数据,在汇编语言中则可给出各种数据的十进制表示,它们是二进制数据的抽象,使用者在编程时可以直接使用,不必考虑实现细节。
  抽象数据类型 (Abstract Data Type, ADT), 一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。
  (看到这无法理解?是的我学的时候也是这样——往下看!)
在这里插入图片描述

2.2为什么要有抽象数据类型(教材版)

  在高级语言中,出现了数据类型,如整型、实型、字符型等,利用这些类型可以构造出线性表、栈、队列、树、图等复杂的抽象数据类型。运用抽象数据类型描述数据结构,有助于在设计一个软件系统时,不必首先考虑其中包含的数据对象,以及操作在不同处理器中的表示和实现细节,而是在构成软件系统的每个相对独立的模块上定义一组数据和相应的操作,把这些数据的表示和操作细节留在模块内部解决,在更高的层次上进行软件的分析和设计,从而提高软件的整体性能和利用率。(是不是想起来什么?类?结构体和函数的封装??)

2.3为什么要有抽象数据类型(胡乱理解版)

  考虑对一个人进行特征描述,需要知道其身高体重和姓名,此时我们会发现,我们既无法通过float型变量来描述(因为float型变量无法存储字符),也无法通过char型变量来描述(因为char型变量无法存储小数)。因此我们需要创建一个新的变量类型——人型。
  例如:

struct person{
float height;
float weight;
char name;
};

  在创建完新的变量类型后,我们需要对其进行相应的操作,如int型可以加减一样。因此我们需要创建相应的函数对新的变量类型进行操作。

2.4抽象数据类型示例

  以复数为例,给出一个完整的抽象数据类型的定义、表示和实现。
在这里插入图片描述
  具体实现:
在这里插入图片描述
在这里插入图片描述
  这样定义之后,就可以在主程序中通过调用Create函数构造一个复数,调用 Add 或Sub函数实现复数的加法或减法运算,用户可以像使用整数类型那样使用复数类型了。
  总结:抽象数据类型,即针对问题抽象出一个新的数据类型,并通过函数封装给出对该数据类型可能的各种操作。(再次胡乱理解)

三、算法是什么?

  算法指用于解决某个问题所采取的方法。(通俗的来说)例如计算从1加到100,你可以选择逐一个数字加起来,或者选择(1+100)*100/2。显然,后者效率更高。用专业术语来说,后者算法时间复杂度为O(1),而前者为O(n)。(什么是时间复杂度?嗯。。。)
  算法的五个基本特征:输入、输出、有穷性、确定性和可行性。
  算法设计的要求:
  (1)正确性:在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
  (2) 可读性:一个好的算法,首先应便千人们理解和相互交流,其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法易千隐藏错误,且难千调试和修改。
  (3) 健壮性:当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
  (4) 高效性:高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标。一般来说主要以降低时间复杂度为优先。


总结

  路漫漫其修远兮,吾将上下而开摆。
  有任何疑问和补充,欢迎交流。(但我显然不会)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值