程序+数据结构+算法,一个公式展示了程序的本质
一数据结构是用来干什么的???
早期的计算机主要是用来进行数值计算,比如计算线性方程组,或者计算某一个数学模型,
随着计算机应用领域不断扩展,如今越来越多的被用于非数值运算了,比如说对信息进行处理,比如我们的教务系统,里面有很多非数值的信息。
比如有删除信息,查询,修改等等操作,其对象不是数值,这叫做线性表,其数据结构就是线性数据结构
还可以用于人机对弈问题,(每种的格局组到一起像一棵倒置的树)
还有就是文件系统的系统结构图
这也是典型的树形结构
还有就是地图导航球最短路径,这叫做求最短通路问题(离散数学中学过呀)
这些都是非数值计算。
这些非数值计算的数学模型是诸如表,树,图之间具有逻辑关系的数据。
数据结构就是研究非数值计算的程序设计中计算机的操作对象和他们之间的关系作的学科。
二接下来是基本概念和术语
1数据
是能够输入计算机并且能够被计算机处理的各种符号的集合,是信息的载体。是对客观事物的符号化表示,并且能够被计算机识别,储存和加工
包含数据型和非数据型
一个人的所有信息。就是一个数据元素
有时候称为记录,接丢按,或者顶点(导航问题)
每个数据元素包含若干个数据项,是最小的不可分割的单位,比如这个人的性别
数据元素和数据对象的关系,
数据对象就是某个性质相容的数据元素的集合,当然也是数据的子集(真或不真)
什么是数据结构?
数据元素相互之间的关系称为结构,
相互之间存在一种或者多种特定关系的数据元素的集合就成为数据结构
好了,数据结构包括以下三个方面的内容,
首先是数据元素之家的逻辑关系。称为逻辑结构
就是数据元素之间的逻辑关系
逻辑结构有哪些种类?
线性结构:有一个开始节点,只有一个开始和一个终端节点
非线性结构:可以有多个直接前趋和直接后继,例如树和图
这是第二种划分方法
集合就是知识存在一个集合中,没有其关系
树就是存在一对多的关系
存储结构
按照顺序依次存储在内存当中,很好理解
有前趋和后继,并且只有一个,按照元素顺序存储。
链式存储结构是什么
是按照任意的存储单元进行存储
,但是元素之间的逻辑关系使用指针来连起来
就是你这个元素的信息包含了下一个元素的信息了。
要不然叫做链表呢
还有一个索引存储结构,在建立存储节点信息的时候,存储一个索引表
其实就是一个目录。
抽象数据类型就是一个数学模型以及在此数学模型上的一组操作
抽象数据类型先不管怎么存储的
抽象数据类型的形式定义???
说白了就是对象,关系,操作
代码中是一这么一个东西来进行实现的,这个叫做格式
还有操作的格式
这波叫做传进去一个地址,指针用的好啊
还有条件和操作结果
举例子()
circle的定义吧
这里是伪代码,当然具体的代码实现我也不清楚,还不会用,呜呜呜
接下来看看复数吧
定义完了以后你就可以进行操作了
这种事是需要返回值的,所以得加连字符
这种情况,逐渐熟悉了,你得先定义两个复数,用你的新做出来的数据类型,然后对这两个复数进行这么一个运算,其中,要进行返回值的操作,那么你就先做出来一个sum,是你常用的int就可以,然后你的add操作就会把他们的和发送到你的sum之中去
有点明白了,你的这个操作就类似整数的加减乘除这样的运算,并不神秘。
三 抽象数据类型的实现
先复习一下,数据结构包括数据元素和他们之间的关系
之前只是大概,现在来用c语言来实现吧
比如,使用c语言来实现复数
接下来是我自己用c语言实现的详细代码
typedef struct {
float realpart;
float imagpart;
}complex;
//这波是定义结构体,叫做复数;
//接下来准备声明几个函数,一会计算用;放在前面的话太杂乱了,直接放在后面吧
void assign(complex *A,float real,float imag);//
void add(complex *A,complex B,complex C);
void minus(complex *A,complex B,complex C);
void multiply(complex *A,complex B,complex C);
void divide(complex *A,complex B,complex C);
#include<stdio.h>
int main()
{
complex A,B,C;//A是最终结果,
float a,b;
assign(&A,a,b);
float c=8,d=6;
assign(&B,c,d);
float e=4,f=3;
assign(&C,e,f);
complex xia;//这是分母
add(&xia,B,C);
complex shang;//这是分子
multiply(&shang,B,C);
divide(&A,shang,xia);
printf("%f\n%f",A.realpart,A.imagpart);
}
void assign(complex *A,float real,float imag)
{
A->realpart=real;
A->imagpart=imag;
}
void add(complex *A,complex B,complex C)
{
A->realpart=B.realpart+C.realpart;
A->imagpart=B.imagpart+C.imagpart;
}
void multiply(complex *A, complex B,complex C)
{
A->realpart=B.realpart*C.realpart-B.imagpart*C.imagpart;
A->imagpart=B.realpart*C.imagpart+B.imagpart*C.realpart;
}
void divide(complex *A,complex B,complex C)
{
A->realpart=(B.realpart*C.realpart+B.imagpart*C.imagpart)/(C.realpart*C.realpart+C.imagpart*C.imagpart);
A->imagpart=(-B.realpart*C.imagpart+B.imagpart*C.realpart)/(C.realpart*C.realpart+C.imagpart*C.imagpart);
}
这就是运行结果啦。
接下来我们说说算法,简单来说就是解决问题的方法和步骤。
算法怎么描述呢,请看图。
反正是个人都可以看懂。
接下来说说算法特性
1有穷性
2确定性,不能模棱两可
3可行性,(废话嘛这不)
4零个输入或者多个输入
5得有输出。
接下来说说对算法设计的要求。
1正确性,
多测试测试
2可读性,
3健壮性,
不会轻易乱套
不容易得病
4高效性
花时间少,存储要求低