数据结构与算法——解决计算机具体问题的步骤和方法

Posted 代码规划师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法——解决计算机具体问题的步骤和方法相关的知识,希望对你有一定的参考价值。

        用计算机求解任何问题都离不开程序设计,程序设计的实质是数据表示和数据处理。

        数据要能被计算机处理,首选必须能够被存储在计算机的内存中,这项任务称为数据表示,其核心是数据结构;一个实际问题的求解必须满足各项处理要求,这项任务称为数据处理,其核心是算法。

        数据结构主要研究数据表示和数据处理的基本方法。

        程序设计的一般过程如图所示:



        由问题到想法需要分析问题,抽象出具体的数据模型(待处理的数据以及数据之间的关系,即数据结构),形成问题求解的基本思路;由想法到算法需要完成数据表示(将数据以及数据之间的关系存储到计算机的内存中)和数据处理(具体的操作步骤,将问题求解的基本思路形成算复杂);由算法到程序需要将算法的操作步骤转换为某种程序设计语言对应的语句,换言之,就是用某种程序设计语言描述数据处理的过程。

        数据结构+算法=程序。

        数据结构和算法是构成程序的两个重要的组成部分,一个“好”程序首先是将问题抽象出一个适当的数据结构,然后基于该数据结构设计一个“好”算法。对于许多实际的问题,写出一个可以正确运行的程序还不够,如果这个程序在规模较大的数据集上运行,那么运行效率就成为一个重要的问题。

        计算机能够求解的问题一般可以分为数值问题和非数值问题。数值问题抽象出的数据模型通常是数学方程,非数值问题抽象出的数据模型通常是线性表、树、图等数据结构。

        非数值问题的数据组织和数据处理主要分为以下部分:

        逻辑结构:线性表、树、图等数据结构,核心是如何组织待处理的数据以及数据之间的逻辑关系。

        存储结构:如何将线性表、树、图等数据结构存储到计算机的存储器中,核心是如何有效地存储数据以及数据之间的逻辑关系。

        算法:如何基于数据的某种存储结构实现插入、删除、查找等基本操作,核心是如何有效地处理数据。

        常用的数据处理技术包括查找技术、排序技术、索引技术等。

        数据的逻辑结构是从具体问题抽象出来的数据模型, 是面向问题的,反映了数据元素之间的关联方式或邻接关系。

        逻辑结构与数据元素本身的形式、内容无关,与数据元素的相对位置无关,与数据元素的个数无关,与数据的存储无关,是独立于计算机的。

        数据的存储结构是面向计算机的,其基本目标是将数据及其逻辑关系存储到计算机的内存中。

        数据是信息的载体,信息是数据的内容或表达形式。数据能够被计算机识别、存储和处理,是计算机程序加工的原料。

        计算机处理的是数据,而不是信息,也就是说,信息必须转换成数据才能在计算机中进行处理,而这些数据应该恰当地表示要处理的信息。

        有时,信息和数据基本上是相同的,但是,通常情况下,信息要想被计算机程序处理,首先需要被转换成数据,这个转换过程有时是很复杂的。

        在科学研究中,为了把握一个复杂对象,往往将这个复杂对象分解成一些较简单的成分,再考察这些成分之间的关系(即结构)。数据是一种较复杂的对象,为了完成数据表示,将数据分解成数据元素,然后再研究数据元素之间的关系。在任何问题中,数据元素都不是孤立存在的,他们之间总是存在着某种关系,数据元素之间的逻辑关系的整体构成数据的逻辑结构。

        完成从数据这样的复杂对象到数据元素这样的简单成分的分解过程,叫做数据抽象。

        无论是数学领域还是程序设计领域,抽象的能力都源于这样一个事实:一旦一个抽象的问题得到解决,则很多同类的具体问题便可迎刃而解。抽象还可以实现封装和信息隐藏,例如C++语言将能够完成某种功能并可重复执行的一段程序抽象为函数,在需要执行这种功能时调用这个函数,从而将“做什么”和“怎么做”分离开来,实现算法细节和数据内部结构的隐藏。

        在选择数据结构时,需要完成以下步骤:

        1.确定表示问题所需的数据及其特性;

        2.确定必须支持的基本操作,并度量每种操作所受的时间、空间资源限制;

        3.选择或设计最接近这些开销的数据结构。

        在设计算法时,遵循以下原则:

        1.理解问题

        准确理解问题中的输入是什么,理解问题要做什么,理解问题的边界条件是什么,也就是问题的输入、输出和约束条件。

        2.预测所有可能的输入

        预测算法所有可能的输入,包括合法的输入和非法的输入,保证算法的健壮性(鲁棒性),考虑问题和数据的全面性,处理所有的特殊情况,可以更快速地成功构造算法。

        3.抽象分级,使解决方案模块化

        不仅从整体上理解算法要完成什么任务是重要的,清晰地划分解决方案地各个部分同样也是重要的。抽象和模块化可以有效地帮助我们解决复杂问题,抽象可以实现模块化,而模块化使指令的影响局部化,这种局部化可以帮助算法设计者找到难以发现的逻辑错误。好的抽象要求我们将解决方案组合成较小的逻辑模块,使每个子模块及整个算法都比较容易诊断和恢复。

        4.跟踪代码

        逻辑错误无法由计算机检测出来,因为计算机只会执行程序,而不会理解动机。经验和研究表明,一个算法设计者发现算法中的逻辑错误的唯一重要的方法就是系统地跟踪算法代码。跟踪必须要用“心和手”来进行,因为设计者要像计算机一样,用一组输入值来执行该算法, 并且这组输入值要能最大可能地暴露算法中的错误。

——摘编自《数据结构(C++版)》(第2版)王红梅/编著

以上是关于数据结构与算法——解决计算机具体问题的步骤和方法的主要内容,如果未能解决你的问题,请参考以下文章

算法和数据结构解析:1-算法简介

算法和数据结构解析:1-算法简介

数据结构与算法之算法篇

时间复杂度怎么算?

数据结构-绪论

初始程序设计步骤