数据结构-引言

说来惭愧,我是学通信专业的,没学过数据结构。虽然计算机二级考试的时候看过一点数据结构,但是考完试就忘了。在编程的过程中,逐步体会到了数据结构是多么重要,趁现在还比较年轻,打算仔细的学学。

首先,数据结构是干什么的?为什么它总是跟算法扯上关系?概括的说,要用计算机求解实际问题需要做两件事:第一,把实际问题用计算语言描述;第二,用计算机语言求解这个问题。第一件事情是数据结构干的,第二件事情就是算法干的。有一个著名的公式:

程序 = 数据结构 + 算法

非常形象的描述了它们之间的关系。

通常,我们都是介绍一种数据结构,然后介绍对应于这种结构的算法。
先看数据结构。举一个例子:学生的信息。有人可能觉得,学生的信息储存很简单啊,把学号、姓名、年龄、性别等等做成一个结构体,然后做成一个数组不就行了么?但是你是否考虑过一下问题:第一,万一有人退学、插班,条换专业,那么这个数组中元素的顺序如何管理?第二,学校有几万人,数组要求连续存放,你能保证有这么大的连续存储空间么?也许你为这个看似复杂的问题想破了脑袋,都没有想出来怎么解决,但是如果你学过数据结构,就能迎刃而解了,用一个链表就能实现:每个一个学生中都有一个指针,指向它的下一个元素,依次类推。这样既不需要连续的空间,也可以灵活的进行插入、删除等操作。

可见,数据结构是对现实中问题的高度抽象。那么世界上的问题千奇百怪,抽象出来的数据结构有多少种呢?答案只有3中:线性结构、树、图。通常,如果是把数据放在一起,而不考虑它们之间的关系的话,使用线性结构就可以了,比如我们的学生信息;而对于那些互相连续的数据,也许就需要树来表示了,比如:一个学校分成了很多学院、每个学院又分成了多个专业,每个专业又分成了几个班;最后,如果前两个种结构都没法解决,我们就要用到图了。比如有A、B、C、D、E、F、G七个地方,它们之间有的相通,有的不相通,我想从一个地方到达另一个地方,走那条路最近。


再看算法:有的算法比较简单,比如链表的插入,删除之类的,有的算法却异常复杂,比如那个求最短路径的问题(如果我没有记错,维特比算法就是解决这类问题的方法之一,这个算法在卷积码译码、隐马尔科夫链等等领域有重要应用。这里就不展开说了)。很多人写论文也经常写算法,那么到底什么是算法呢?就是解决问题的方法步骤,它必须包含以下要求:
1.有输入。它能够处理你让它处理的数据。
2.有输出。它能够诉你计算的结果。
3.有穷性。这里的有穷不是数学上的有穷,每个算法总是针对于特定应用的。如果对于这个应用来说,算法太慢了也不行。比如,对一个实时监控系统,我们希望检测画面内是否有运动目标。如果你的算法过了一天才能计算出结果,那也不行。
4.每一步都是明确的。
5.每一步可实现。
那么如何评价算法呢?算法是在电脑上算的,所以算法好不好得电脑说了算。那无非就是两种:算的快不快,占用的内存多不多。后一种很好理解,前一种就要费点脑筋了。我们不能简单把程序搬到电脑上执行来比较快慢,因为各个电脑的差别是很明显的:配置不同,新旧不同等等。我们通常采用数学的方法来估计执行算法大约需要多少步骤。当你的算法与问题规模的增长速度相同时,你的算法复杂度就称为O(n)。比如如果你的算法中主要的工作是一个for循环执行了n次;如果你的算法中是两个嵌套的for循环,那么就是O(n^2)。这里使用的是高等数学中无穷小的阶数的概念,也不多说了。
其实,完整的评价一个算法考虑的因素很多,有的算法很精细,但是执行速度慢,有的算法计算效果一般,但是执行速度很快;还有的算法,虽然又快又好,但是健壮性很差;甚至有些算法很好,但是由于理论过于高深,在很长是一段时间内都没有被大家接受。所以,咱们还是不要贸然评价别人的算法了吧,时间会证明一切。

最后说几句题外话,数据结构解决的是一些具体的问题,而不是帮你架构整个程序的。在一些面向过程的语言中(比如C语言),表现的很明显。所以很多数据结构的书,都是C语言写的。对于一些面向对象的语言,都对一些数据结构进行了封装,只要调用函数就可以了,掩盖了数据结构的本质,比如C++中的STL库。

 


 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值