编程入门-理解数据结构和算法

上一篇文字:https://www.jianshu.com/p/40133cfcd9e3,笔者和大家分享了“什么是编程语言”。之所以编程是一种语言,和我们平时说话所用的语言是一样的,编程语言只是和计算机打交道和交流的语言,因为计算机是一种图灵装置,相对语言的灵活,其实编程语言是比较死板且简单的。

用编程语言写出来的指令集合其实就是程序。类似于我们用中文或其他语言(英语,法语等)写出来的一篇文章,用这篇文章来叙述某些事或表达某些观点。大家知道写文章需要有文章组织结构和写作方法以更好的表达,当然程序也是一样的。

程序的定义

在编程领域有一个很经典的公式:

程序=数据结构+算法

之前已经说过,程序是为了解决某些实际问题而编写的。然而为了解决问题,就需要使用到某些数据结构以及设计一个利用这个数据结构来解决问题的算法。例如:我们日常开车用到的导航功能,用从A点到B点,条条大路通罗马,可以选择有很多条路,高速优先,距离优先,时间优先等,如何让计算机帮你规划,要解决这个问题,必定会使用到图这种数据结构, 然而光有数据结构还不行,要实现这个功能,必须在图这种数据结构的基础上,设计一种算法,一步一步的操作,这些一步一步的操作就是算法,算法是特定问题求解步骤的描述。

什么是数据结构

那么什么是数据结构呢?如果要给一个定义的话(来源于百度百科):

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

从上面的定义来看数据结构需要从3个方面去理解:
(1)数据元素之间的关系:逻辑结构
(2)数据在计算机中的存储方法:物理结构
(3)作用于数据结构上的运算:算法

这样说可能比较抽象,我们用数学化的语言来表达。
一般来讲数据结构按数据之间的逻辑关系分成以下几种:

  • 线性结构
  • 集合结构
  • 图结构
  • 树结构


    10096448-0201ce5693f0c633.png
    数据结构(按逻辑).png

按数据在计算机的存储方法即物理结构分成两种:

  • 顺序存储
  • 链式存储

怎么理解呢?我们还是以上面导航的例子为例,从A点到B点,我们需要框定一个地域范围,列出这个范围内所有的交叉点并用某种数据结构进行表达。最简单的,我们能想到线性表,它是最简单、最基本、也是最常用的一种线性结构。 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,通常记为: (a1,a2,… ai-1,ai,ai+1,…an) ,其中n为表长, n=0 时称为空表。 它有两种存储方法:顺序存储链式存储,它的主要基本操作是插入、删除和检索等。

常用的数据结构包括:

  • 数组
  • 队列
  • 链表
  • 哈希表

什么是算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

要看是否是一个算法,必须满足下面的这些条件

  1. 输入:算法具有0个或者多个输入
  2. 输出:至少有1个或者多个输出
  3. 有穷性:算法在执行有限的步骤之后会自动结束而不会进行死循环状态
  4. 确定性:算法中的每一步都有意义,不会出现二义性
  5. 可行行:算法中每一步都必须可行

看到这些,大家在这里是不是看到很多图灵机定义的影子呢?其实这些都是描述满足图灵机的条件。

既然是算法,算法就有好与坏。那么怎么判断算法的好坏呢?我们知道做任何事情,我们所拥有的资源是有限的,在这有限的资源内怎么把问题解决的更好,就是我们的数据结构和算法设计时需要考虑的。

一般来讲评判一个算法的好坏需要考虑几个方面:
1、正确性:
对于合法输入能够得到满足的结果,即能正确的解决问题。算法能够处理非法处理,并得到合理结果,算法对于边界数据和压力数据都能得到满足的结果

2、可读性:
算法要方便阅读,理解和交流,只有自己能看得懂,其它人都看不懂,谈和好算法。

3、健壮性:
算法不应该产生莫名其妙的结果,一会儿正确,一会儿又是其它结果

4、高性价比
利用最少的时间和资源得到满足要求的结果,可以通过(时间复杂度和空间复杂度来判定)

常见的算法如下:

  • 递推法
  • 递归法
  • 穷举法
  • 贪心算法
  • 分治法
  • 动态规划法
  • 。。。

猜你喜欢

转载自blog.csdn.net/weixin_34320724/article/details/87648200