为了控制问题问题解决过程的复杂度,利用抽象来保持问题的 “整体感”,而不会陷入到过多的细节中去。

那么这就要求对现实问题进行建模的时候,对算法所要处理的数据,也要保持与问题本身的一致性,不要有太多与问题无关的细节。
01_解决问题.png

1. 数据抽象(ADT)

过程抽象 启发我们进行 **数据抽象**

相对于程序设计语言中基本数据类型,抽象数据类型(ADT:Abstrack Data Type)
02_抽象数据类型.png
所以用户在进行数据描述的时候,只需要通过调用抽象数据结构的数据接口,就可以实现问题的解决,而不需要关心这些接口内部的结构是怎么实现的。这样就可以把一些复杂的实现的问题 “往后推”。

1.1 封装

抽象数据类型ADT 建立了一种对数据的 封装(Encapsulation)

  • 封装技术将可能处理实现的细节隐蔽起来,能有效的控制算法的复杂度
  • 同一个ADT 可以采用不同的数据结构来实现。

1.2 ADT 的实现

数据结构(Data Structure)是对 ADT 的具体实现

采用程序设计语言中的控制结构基本数据类型来实现ADT所提供的逻辑接口,属于ADT 的 ”物理“ 层次。而 “接口和接口的功能描述” 则是属于 “逻辑” 层次。

ADT 是对数据实现 “逻辑” 层次和 “物理” 层次 的 分离。这样就可以定义复杂的数据模型来解决问题,而不需要立即考虑模型如何实现。
03_数据结构.png

2. 接口的两端:抽象与实现

抽象:抛弃与问题无关的信息;抛弃底层的实现细节。

实现:针对具体应用环境,用某种特定的技术让逻辑功能 “落实” 。

  • 对抽象数据类型可以有多种实现方案;
  • 独立于实现的数据类型:
    • 让底层开发程序员专注于实现和优化数据处理,又不改变数据的使用接口;
    • 让用户专注于用数据接口来进行问题的解决,而无需考虑如何具体实现这些接口。
  • 通过层层抽象降低问题解决过程的复杂度。

3. 为什么要研究和学习算法

既然有了这些 封装 抽象数据类型以后,算法更偏向于底层方面,那么为什么要研究和学习算法呢?

3.1 学习各种不同问题的解决方案

有助于我们在面对未知问题的时候,能够根据 类似问题 的解决方案来更好的解决

3.2 各种算法通常有较大的差异

  • 我们可以通过算法分析技术来 评判算法 本身特性,而不是根据实现算法的程序在特定机器和特定数据上运行的表现来评判它。
  • 即使同一个程序,在不同的运行环境和输入数据的情况下,其表现的差异可能也会很大。
  • 在某些情况下,当我们碰到棘手的难题,需要能够区分这种问题是不是根本不存在算法,只能近似的去处理它;还是能找到算法,但需要耗费大量的资源。
  • 某些问题解决需要一些 折中的处理方式,我们要学会在不同算法之间进行选择,以适合当前条件的要求。