当前位置: 首页 > news >正文

计算机数据结构之——什么是艺术品?

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/11395381

 

Jack:为什么我们要学习数据结构和算法呢?

我:我建议你看一下《计算机程序设计艺术》,在这里你能找到你想要的答案。

Jack:为什么不是《算法导论》呢?

我:《算法导论》会告诉你基础的算法、数据结构是什么,但是不会告诉你为什么计算机要使用数据结构以及数据结构能在计算机里发挥什么样的作用。

Jack:这有区别吗?

我:你研究一个东西需要知道这个东西能解决什么样的问题以及没有这个东西会出现什么样的问题。简单的说,需要把出发点或者说是方向找好。

Jack:如果没有找好方向会怎么样?

我:会有两个问题:

1、方向错了,你跑得越快离目标就越远。

2、即便你方向蒙对了,但是不明白所以然,充其量,只是个“武夫”。

Jack:从你的理解来看,数据结构要解决什么样的问题呢?

我:从起源讲起吧。在上世纪50年代的时候计算机内存还很小。那个时候只要能把stack的内存使用好就行了。在那个年代,计算机程序就是单纯的逻辑代码。程序员一直在抱怨内存太小,计算机能做的事情非常有限。10年之后,内存容量扩大了很多,这个时候程序员迷茫了——他们不知道怎么样才能把这么大的内存使用好!

Jack:这好比一个穷人整天幻想能有1个亿。但是,当有一天,他真的中了1亿的彩票后,他会发现他自己其实根本不具备管理好这1个亿的能力——糟蹋了!

我:是的。早期的程序员惯性思维是,内存就是要以数组类型的固定大小使用,突然之间内存大了那么多,反而不知道怎么用了。一个或者多个数组有什么样的描述能力呢?答案是几乎没什么描述能力——相对于今天的技术。

Jack:那后来是怎么解决这个“大内存”问题的呢?

我:这个时候有一些计算机业内的先驱(具备数学家背景),他们把数学上的一些理论嫁接到计算机上来。比如说,常见的线性结构、树形结构等等。

Jack:也就是说,其实计算机技术就是数学的技术?

我:这个说法是不合理的。计算机技术有一部分数学的移植成分。就是说,如果计算机理论要有一个新的突破,需要数学做支撑,但是,并是说数学的理论都能适用到计算机。

Jack:那数据结构解决了什么样的问题呢?

我:在复杂的数据结构出现之前,stack里的数据大都是“逻辑”性的数据,代码不具备复杂信息的描述能力。复杂的数据结构好比是heap里的骨架,它能够串接起复杂的信息,而使起具备某种规律,使这些数据具备可控性。一句话,如果没有复杂的数据结构,计算机其实就是个计算器!

Jack:那你理解的程序设计的艺术是什么呢?

我:所有的程序,无论是操作系统内核,还是高性能server,它具有精妙的结构体设计,精妙的数据结构来管理heap内存(恰如其分地描述你的需求,同时查找、排序的时间复杂度、空间复杂度完美结合),它就是一个艺术品。

Jack:用一句话概括呢?

我:你在一大块内存里画出一幅漂亮的数据结构图形,这就是一个艺术品

转载于:https://www.cnblogs.com/pangblog/p/3310850.html

相关文章:

  • 开发人员如何了解用户和需求
  • list 导出为excel
  • 软考--系统开发与软件工程
  • 分布式设计与开发(六)------让memcached分布式
  • poj 2421 Constructing Roads 解题报告
  • 发布一个基于 Reactor 模式的 C++ 网络库
  • 定长度结构体数组、不定长度结构体指针初始化
  • 软考--数据库SQL
  • C++默认参数不能是一个引用
  • 【转】一致性哈希算法
  • 面试时,我说谎了——Leo网上答疑44
  • 转载百度百科上的强回复,关于spring的IOC和DI
  • CakePHP 编程笔记
  • EPiServer 简单项目总结
  • 小修改,让mvc的验证锦上添点花(1)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • fetch 从初识到应用
  • gitlab-ci配置详解(一)
  • isset在php5.6-和php7.0+的一些差异
  • java8-模拟hadoop
  • Java知识点总结(JavaIO-打印流)
  • Material Design
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • spring security oauth2 password授权模式
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 读懂package.json -- 依赖管理
  • 工程优化暨babel升级小记
  • 类orAPI - 收藏集 - 掘金
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用SAX解析XML
  • 算法-图和图算法
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 小试R空间处理新库sf
  • 函数计算新功能-----支持C#函数
  • 选择阿里云数据库HBase版十大理由
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​linux启动进程的方式
  • #HarmonyOS:Web组件的使用
  • (二)学习JVM —— 垃圾回收机制
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三)终结任务
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET多线程执行函数
  • .NET实现之(自动更新)
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [20170713] 无法访问SQL Server
  • [bzoj1912]异象石(set)
  • [C++打怪升级]--学习总目录
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [Django开源学习 1]django-vue-admin