数据结构与算法概述

497 阅读2分钟

从问题入手比如人狼羊菜过河问题。 问题抽象:首先需要分析和抽象问题的需求和限制,简历问题模型。 目的:把人狼羊菜运到对岸 条件:

  • 只有热能乘船
  • 船只有两个人
  • 狼羊,羊菜不能再没人时共处

数据抽象:接下来我们需要恰当的数据结构来描述这个数学模型。 简单排列组合我们发现系统一共有16种状态(包括空状态),但是按照条件我们能够踢出:狼羊,人菜(与前者互补状态),羊菜,人狼,狼羊菜,人这6种状态。 那么问题就转化为一个图模型,寻找一条路径使得起始状态人羊狼菜转换为空状态,就获得问题的解。

数据结构:接着我们需要思考怎么用计算机表示这个模型,可以采用相邻矩阵。

算法抽象:接下来我们需要考虑怎么实现这算法,求图的最短路径问题。

这样我们就能够求解这个问题。

那么什么是数据结构? 数据结构可以说是:逻辑+存储+运算。 从逻辑上分为:

  • 线性结构
    • 线性表(表,栈,队列等)
  • 非线性结构
    • 树(二叉树,Huffman树等)
    • 图(有向图,无向图等)

当然他们之间存在包含关系:图≥树≥二叉树≥线性表 存储结构则是逻辑结构到物理结构的映射。

  • 在内存中是随机访问的
  • 对于逻辑结构中的每一个节点都会对应唯一的连续存储区域
  • 主要是有顺序存储(对应线性结构),链接(对应非线性结构),索引和散列

但是随着模块化思想的发展,我们希望隐藏运算的细节和内部的数据结构,只留下逻辑与运算接口以实现软件复用,随意诞生了抽象数据类型(ADT)。比如C++的各种数据结构模板库。 抽象数据类型实现数据元素定义及数据之间的关系以及数据操作的封装。 那么怎么取实现ADT呢,我们需要先定义逻辑结构(即数据对象及其关系,再定义运算也即函数)