目录
1.了解数据结构
-
定义:
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
实际上程序设计 = 数据结构 + 算法,简单来说数据结构就是数据元素之间存在的一种或多种特定关系的集合。
-
数据结构分类:
数据结构大致可分为逻辑结构和物理结构
其中,逻辑结构是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题。
物理结构是指数据的逻辑结构在计算机中的存储形式。
-
逻辑结构细分:
1)集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。
2)线性结构:线性结构中的数据元素之间是一对一的关系。
3)树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
4)图形结构:图形结构中的数据元素之间是多对多的关系。
深入了解物理结构
根据物理结构的定义,我们实际上研究的是如何把数据元素存储到计算机的存储器中。而存储器主要是针对内存而言的,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。
2.了解数据元素的存储结构形式
数据元素的存储结构形式有两种:顺序存储和链式存储
顺序存储结构是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系的物理关系是一致的。例如之前我们学过的C语言中的数组结构就是这样的。
链式存储结构是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。很明显,这样的话链式存储结构的数据元素存在关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,这样子通过地址就可以找到相关数据元素的位置。这可以比喻成我们在医院排号,当我们拿到自己的号码之后就可以不用像排队买饭那样排成一队,我们可以随意的找一个位置坐下休息,又或是去上厕所、去吃饭,只要保证我们前面的人在看完病之前自己在等候室里就行了。
3.了解算法
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。简单来说就是计算的方法,类似数学中的一些运算。
例如解决一道数学题:从1加到100的和为多少?
这道题对于小学生来说一般就是慢慢的把101个数进行相加,这需要非常大的计算量和耐心,用代码进行操作如下:
#include<stdio.h>
int main()
{
int i=1;
int s=0;
for(;i<=100;i++)
s=s+i;
printf("从1加到100的和为:%d\n",s)
return 0;
而如果让一名高中生来做这道题的话,他也许会这样做:
首先观察式子:1+2+3+...+98+99+100=
可以发现式子的第一项和最后一项的和为101,第二项和倒数第二项的和为101,第三项和倒数第三项的和为101...一直到第五十项和倒数第五十项的和也为101,也就是一共有50个101相加,总和为50x101=5050,这个计算方法的计算量就很少,我们算的也快,同样可以用代码表示出来:
#include<stdio.h>
int main()
{
int i;
int s;
i=100;
s=(i+1)*n/2;
printf("从1到100的和为:%d",s);
return 0;
很明显,第一次代码的运行次数远多于第二次的。虽然以计算机的计算速度,这两个计算方法都可以被瞬间解决,但是如果我们把条件改成1到1千万甚至是1到1亿的话,这两个算法的差距就非常明显了。
4.深入学习算法
算法的五个基本特征:输入、输出、有穷性、确定性以及可行性。
1)输入
--算法具有零个或多个输入。
--尽管对于绝大多数算法来说,输入参数都是必要的。但是有时候,像打印“hello world”就不需要输入参数。
2)输出
--算法至少有一个输出,输出的形式可以是打印形式输出,也可以是输出一个值。
3)有穷性
--即算法在执行有限的步骤后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
4)确定性
--算法的每一个步骤都具有确定的含义,不会出现二义性。
--算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。
--算法的每个步骤都应该被精准定义而无歧义。
5)可行性
--算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。
5.算法设计的要求
通过上面的学习我们可以知道,算法并不是唯一的,对于同一个问题,可能存在着多种能解决问题的算法,这意味着我们可以自己设计出很多的算法,而算法设计的要求有以下几点:
- 正确性
算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。大体分为以下四个层次:
--算法程序没有语法错误。
--算法程序对于合法输入能够产生满足要求的输出。
--算法程序对于非法输入能够产生满足规格的说明。
--算法程序对于故意刁难的测试输入都有满足要求的输出结果。
- 可读性
--算法设计的另外应该目的是为了便于阅读、理解、交流。
- 健壮性
--当输入数据不合法时,算法也能做出相关处理,而不是产生异常、崩溃或者是莫名其妙的结果。
- 时间效率高和存储量低
--好的算法应该在能够解决问题的同时具备高效并且实用的特点
学习感受
本次学习内容是关于数据结构和算法的基本知识,虽然学起来很枯燥乏味,但是这一部分内容又很重要,所以在学习的时候应该苦中作乐,不断坚持和克服乏味。