遇到一个现实问题,如何建模并程序化解决?
- 万物皆数,数是物质及其运动的形式化(符号化)表示。
- ADT ={ D,S,P } 其中D是数据对象,S是D上的关系集,P是对D的基本操作集。
1.如何看待问题?
面向对象的基础:一切皆是对象。
对象是什么?
在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,他是人类观察问题和解决问题的主要目标。例如,对于一个学校学生管理系统来说,无论是简单还是复杂,始终是围绕学生和老师这两个客体实施。这个客体即对象。
2.如何解决问题?
- 通过数据抽象建立数据的对象模型,通过问题抽象建立问题的数学模型,通过算法进行问题的求解。
- 数学模型是核心,抽象到合适的数学模型后才能应用对应的算法,才能建立数据结构来支持算法实现。
2.1 数据对象的模型
数据对象模型就是数据结构,内涵是数据对象之间的逻辑结构,其实现则包含了数据对象的存储结构及其对应的基本操作。注意数据对象的存储结构也是很重要的,例如,同样是有序表,但有序顺序表、有序链表、有序二叉树所适应的算法显然不同,则适用场景也可能不一样。
建立数据对象模型就是从问题空间识别数据对象并表示(亦即建立),其过程包含认识已有的数据对象,分析数据的本质特征,从而对数据进行选取和组织。
数据对象模型的实现具体到某语言中,就是利用语言中已经实现的基本数据类型来扩展新的数据类型,从而实现复杂的数据结构。
不论数据结构如何,内部基本操作都可分为四类:
- 创建和销毁结构类,包括数据结构的创建、初始化,以及必要的销毁结构操作;
- 属性操作类,包括读取或设置数据结构中的各基本属性的值;
- 查找类,包括特定查找和遍历操作;
- 更新类,包括插入、删除或修改数据元素的内容或更新关系。
常见的数据对象模型有,顺序表、单链表、顺序栈、循环队列、二叉树、邻接表图、哈希表等。学习、领会并实现这些数据对象模型,是应用数据结构的关键。
2.2 问题的数学模型
对于一些简单的问题,往往只靠数据对象模型的建立,就可以解决问题,这时的数据对象模型,实质上就是问题的数学模型。但对于许多复杂的问题,仅有数据对象模型还是不够的,必须在问题定义和分析的基础上,建立问题的数学模型才能求解。
那什么是数学模型呢?“数学模型是对于一个现实对象,为了一个特定目的,根据其内在规律,做出必要的简化假设,运用适当的数学工具,得到的一种数学结构”。这种数学结构是借助于数学符号刻划出来的某种系统的纯关系结构/映射/函数/方程,代表着一类现实问题及其解决方案。所以说,所谓数学模型即是数学理论的具体应用。
数学模型是怎样从一个复杂的现实问题中建立起来的呢?当面对一个新的复杂问题时,不易直接求解,通常的想法是通过对问题的分析,不断地抽象和分解、转化或转换,得到一个与原问题本质相同的,但看起来相对简单的一个问题。我们把初始的问题或对象称为原型,把抽象分解后的理想化对象称为数学模型。由此看来,数学模型的建立过程就是数学思想的应用过程。
数学思想如:
函数方程最重要,分类整合常用到;
数形结合千般好,化归转化离不了;
有限自将无限描,或然终被必然表,
特殊一般多辨证,微元运动极限高.
常见的数学模型分类(按建立模型的数学方法):
- 初等数学
- 几何模型
- 微分方程模型
- 关联分析类(回归分析、相关分析法、熵权法、归一化、主成分分析、聚类分析、典型相关分析、灰色关联度分析、层次分析法、判别分析法、小波分析、灵敏度分析、误差分析、残差检验、回归方程显著性检验)
- 预测类(时间序列、灰色预测、插值拟合)
- 图论模型(最短路问题、图片匹配类模型)
- 最优化类(遗传算法、神经网络、蚁群算法、线性规划、非线性规划、多目标规划、动态规划)
- 等等
3.实例
以四则运算表达式求值问题的求解为例。
假如四则运算表达式的形式为字符串,表达式存储在数组中。数学模型是后缀表达式。问题的定义是,十进制整数的四则运算求解。
若采用顺序栈进行问题求解,则数据对象是特殊线性表的顺序栈。可以采用后缀表达式的求解算法。算法的执行过程是,每次应用一个顺序栈,共应用两次顺序栈。第一次将表达式 转换成后缀式,第二次,对转换后的后缀表达式求值。
若采用二叉树进行问题求解,则求解过程同样可以用到栈,数据对象是二叉树和顺序栈。算法的执行过程是,每次应用一个顺序栈,共应用两次顺序栈。第一次将表达式转换成二叉树,第二次,对转换后的二叉树进行后序遍历(后缀表达式)求值。