第一部分:数据结构漫谈
一、什么是数据结构?
一句话:程序设计=数据结构+算法。简单来说,数据结构就是一种关系,是数据元素相互之间存在的一种或多种特定关系的集合。
二、数据结构的分类
传统上,我们将数据结构分成逻辑结构和物理结构。
1、逻辑结构:数据对象中数据元素之间的相互关系。这也是我们研究的重点。
2、物理结构:数据对象的逻辑结构在计算机中存储的形式。
三、几类逻辑结构
1、集合结构,所有数据元素除了在同一个集合中,他们之间没有任何关系。
2、线性结构:数据结构之间是一对一的关系。
3、树形结构:数据元素之间存在一对多的层次关系。
4、图形结构(最复杂的结构):数据元素之间是多对多的关系。
四、物理结构
物理结构实际上研究的是如何把数据元素储存到存储器中;数据元素存储结构形式有两种;顺序存储和链式存储。
1、顺序存储结构:把数据元素存放在地址连续的存储单元里,数据间的逻辑关系和物理关系是一致的。(例如数组结构)
2、链式存储结构:上面的顺序存储结构,在面对时常变化的结构时,存储结构的基本原则会被破坏,所以在这种变化的情况下,顺序结构并不是万能的,所以需要用到链式存储结构。让我们举个简单的例子来了解这两种存储结构吧:比如排队,在食堂排队打饭,我们必须排在队伍里面,中途你一旦出去了,你就回不到原本的位置,因为没人愿意让你插队,这就是顺序存储结构;而在医院里,大家也是在排队,但是每个人都会领到一个号,在叫到你之前,你可以随便走动,不管你在哪,你只要能及时回来就好,在这种情况下,你关注的是你的前一个号有没有被叫到,这就是链式存储结构,把数据元素存放在任意的储存单元里,这组存储单元可以是连续的,也可以是不连续的。(这样也导致链式存储结构的数据元素存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址。)
第二部分:谈谈算法
一、数据结构和算法的关系?
为什么我们要把数据结构和算法放在一本书来讲解呢?因为二者是不能割裂开来的,不谈算法的数据结构是不完整的数据结构。只有我们在学习的时候把数据结构和算法结合起来才能领会编程语言的美妙。
二、算法初体验(了解算法)
下面我们通过一个场景来体验一下算法:小学的时候,老师让你算1+2+3+......+100,你是怎么算的呢?
很显然,傻子才会一个个去算,数学王子高斯给了我们一个巧妙的算法,只需要算(1+100)*(100/2)即可,注意,我用到了一个词:算法!没错,这就是算法。那我们在C语言中是如何来实现的呢?
int i,sum = 0,n =100;
for(i=1;i<=n;i++)
{
sum = sum+1;
}
printf("%d",sum);
这就是我们讲的傻子的算法,显然需要让计算机运算100次。
如果用上高斯的算法呢?
int i,sum = 0, n=100;
sum = (1+n)*n/2;
printf("%d",sum);
那么,我们只需要运算一次。
所以什么是算法呢?算法无非就是让解决问题的技巧和方式。
注意,就像没有药可以包治百病一样,一个问题可以由多个算法解决,一个算法也不可能具有通解所有问题的能力。
如果要对付考试,那么关于算法还要知道的是,算法有五个基本特征:输入(算法要有0个或多个输入)、输出(至少要有一个或多个输出,这也是程序的要求)、有穷性(经过有限次循环后会自动结束的)、确定性(每一个步骤都是确定的,一定条件下只有一条执行路径,相同的输入只有唯一的输出结果)和可行性(每一步都能通过执行有限次数完成)。
三、算法设计的要求:
1、正确性(语法、输入输出正确、对非法输入有说明)
2、可读性(加注释)
3、健壮性(但数据不合法时,也能做出相关的处理)
4、时间效率高存储量低。
(本节完)
参考资料:
1、数据结构和算法绪论_哔哩哔哩_bilibili 鱼C小甲鱼