1.1.0 数据结构在学什么
用程序代码把现实世界的问题信息化
鸡汤,可喝
用计算机高效处理这些信息从而创造价值
1.1.1 数据结构的基本概念
学习建议:概念多 建议抓大放小
什么是数据:
什么是数据元素、数据项:
排队顾客:每一波顾客是数据元素,每一波顾客的具体元素是数据项
个人理解:类似于结构体和属性
什么是数据结构、数据对象:
排队顾客:
同一门店前后两拨顾客是两个数据元素,他们之间有先后关系,他们的集合是数据结构
两个门店的排队顾客没有直接关系,但是两者有相同的性质,他们的集合是数据对象
什么是数据类型、抽象数据类型:
数据类型是一个值的集合和定义在此几何上的一组操作的总称,每个类型包含一集合法的数据对象,并规定了这些对象的合法操作。:
1)原子类型:其值不可再分的类型,如bool类型,int类型
2)结构类型:其值可以再次份截为若干成分(分量)的数据类型,如结构体
抽象数据类型(Abstract Data Type,ADT)是抽象数据组织以及与之相关的操作:
抽象数据类型的基本思想是把数据定义为抽象的对象集合,只为它们定义可用的合法操作,并不暴露其内部实现的具体细节,不论是数据的表示细节还是操作的实现细节。当然,要使用一种对象,首先需要能构造这种对象,而后能操作它
(取自https://blog.csdn.net/Galen_xia/article/details/116278834 有不懂可以去看看大神的文章)
个人感觉:ADT与结构类型的差别是包含了具体的方法,类似于Java里的类
数据结构的三要素:
逻辑结构:数据元素之间的逻辑关系是什么
集合:基本不讨论
线性结构:数据元素之间一对一,一前一后,如排队
树形结构:数据元素之间一对多,一前多后
图(网)状结构:数据元素之间多对多
数据的物理结构(存储结构):如何让用计算机表示数据元素的逻辑关系
顺序存储:在逻辑上相邻的元素存贮在物理位置上也相邻的存贮单元里,元素之间的关系由存贮单元的邻接关系来体现
链式存储:逻辑上相邻的元素在物理存储上可以不相邻,借助元素存储地址的指针来表示元素之间的逻辑关系
索引存储:在存储信息的同时,还建立附加的索引表,索引表中的项称为索引项,索引项的一般形式是(关键字,地址)
散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希(hash)存储,较难,后续摸索
要点:
1、若采用顺序存储,各个元素在物理上必须是连续的;若采用非顺序存储,则各个元素在物理上可以是离散的。
2、数据的存储结构会影响存储空间分配的方便程度
3、数据的存储结构会影响数据运算的速度
数据的运算:施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤
1.2.1 算法的基本概念
什么是算法?
程序 = 数据结构 + 算法
算法:如何处理这些信息,以解决实际问题
算法的特性:
有穷性:算法必须在又穷步之后结束,且每一步都可以在又穷的时间内完成(算法是又穷的的,程序可以是无穷的)
确定性:算法中的每条指令必须有确切的含义,对于相同的输入有相同的结果
(个人疑问:如果我写一个生成随机数的小程序,这个程序输入一个整数表示要输出几个随机数,相同的输入几乎不可能会有相同的结果,那么这个怎么理解)
可行性:算法中描述的操作可以通过已经实现的基本运算执行有限次来实现
输入输出:一个算法中有零个或多个输入,有一个或多个输出
好算法的特质:
1、正确性:算法能够正确的解决问题
2、可读性:能够让其他人读懂,没有歧义(算法可以用伪代码表示,甚至是文字)
3、健壮性:输入非法数据时,算法能适当的做出反应和处理,而不会产生莫名其妙的输出
4、高效率和低存储量需求:执行速度快,时间复杂度低;不费内存,空间复杂度低(最多研究)