理解数据结构

理解数据结构

最近在学习各种数据结构,于是就在想,为什么我们需要数据结构呢? 为什么要设计这么多数据结构?数据结构到底解决了我们什么样的问题?

我们提到 数据结构 时,一般是指计算机科学中的一个概念, 但是从本质上讲,数据结构应该是指对数据的一种组织方式。既然如此,我们没必要非在计算机科学领域中讨论 概念本身,把它放在其它领域中,可能更能加强我们的理解。

就说图书管吧,假如你是一名很久很久以前的图书馆管理员,那时候根本没什么计算机。数据结构?那是什么?

你的任务就是看着图书馆里的一堆书。于是,有一天,图书馆来了一堆书,你把他们堆成一堆,放在馆里。 这时候,有人来借书了,他只能在那一堆书里乱翻,翻来翻去也找不到自己想要的书,因为那是一堆书, 有的书他检查了很多次,有的一次也没检查。

这时候这堆书是一个集合,不方便遍历。

时间长了,抱怨的人很多。

作为一个怕麻烦的管理员,你忍受不了别人的抱怨,于是,你把那 一堆书 变成了 一排书

这下好了,来找书的人,只要从书架左边走到右边,按顺序找就好了。只要书在图书馆里,慢慢找总是可以找到。 但是,随着图书馆的书越来越多,这样找实在是太慢了,因为每次都要从第一本书找到最后一本书。

这时候这堆书是一个列表,方便遍历,但是不方便查找。

时间长了,抱怨的人很多。

作为一个怕麻烦的管理员,你忍受不了别人的抱怨,于是,你把那 一排书 变成了 很多类书

那么,按什么分类呢?按书的大小么?颜色么?退一步讲,分类的依据是什么?

分类是为了加快读者查找书的速度,那么读者查找书的时候,是按什么查找呢?是按书名。所以,我们对书名分类。 按书名分类也有许多种,按书名读音么?按书名笔画吗?按书名字数么?我们很容易想到,按读音分类给读者的压力最小, 也就是查找前的开销最小。否则每次找书之前还要数一下笔画,读者一定又会抱怨。

这时候,我们按读音把书分类,书名第一个字是A的在A书架,是B的在B书架。这下读者查找书的速度大大加快了, 因为一下子就能排除那么多类书,而代价仅仅是想一下书名第一个字的读音。不过,我们马上又发现,有的书架上书实在太多了, 那有什么关系?这个问题我们解决过啊,只要再分类就好了,书名第一个字我们用过了,现在用第二个字。

读者终于大致可以满意了。

这时候这些书架构成了一个查找树,方便查找。

另外,我们注意到,其实对于管理员来说,他的负担是增加了的,比如新来了一本书,如果图书馆是一堆书, 只要把新书扔在那一堆里就好了,如果是一排书,要把新书放在这排书的最后,而如果是分好类的书架, 管理员就要先找到这本书的位置,再把新书放在那儿,而不能随便放。好在分类后,我们添加新书不会花多久, 假如分好类后,读者查找书方便了,但是管理员要把新书放在合适的位置,需要花一年时间, 那这个分类的方法肯定不是一个好方法。(这里有一点需要注意,添加新书的过程,不仅仅包含查找新书位置,再放在此位置,还包含对数据结构的维护,假如把新书放在查找到的位置后,整个数据结构的性质被破坏了,那么还需要花费时间来调整其它书的位置,以便保持数据结构的性质。例如红黑树中,插入操作不仅包含将新结点放入合适位置的操作,还包含此后的一些旋转操作,以便维护红黑树的性质。感谢评论区@zhenglianghui 的指正。)

这告诉我们

维护数据结构很重要。

这时候,我们在不知不觉间居然

设计了一个数据结构

这时候,我们回到开始时的问题,为什么我们需要数据结构?对应上面的故事, 为什么我们要把一堆书变成多类书?简单地说,这样可以使找书的过程变快。 这正印证了维基百科词条中的那句话。

数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。

回头想想,从一堆书变成多类书的过程,其实就是数据的组织方式发生了变化。我们来抽象一下整个过程。

  • 我们有一堆数据D。
  • 数据上最常用的操作是O。
  • 我们的目标是让O很快。
  • 我们设计一个数据结构S来组织数据D。
  • 数据结构S需要额外的信息EI来组织数据D。
  • 数据结构S有性质P,性质P可以使操作O很快。
  • 数据结构除了支持操作O外,还要支持两个最基本的操作,Add:添加数据,Del:删除数据。
  • 数据结构要保持性质P,所以Add,Del需要额外操作EO来保持P。

那么,关键的地方就在于:

根据操作O,找到性质P,设计数据结构S,使S有性质P,同时使额外信息EI,额外操作EO尽量小。

所以,无论是设计数据结构还是学习数据结构,都要弄清楚,

  • 数据结构的关键性质是什么
  • 为什么关键性质可以加快操作
  • 额外信息与额外操作大小如何

故事,有些讲不下去了,感觉还是理解的不够,就到这里吧。今后又了新的感受,再补充。


转载请注明出处:http://blog.csdn.net/on_1y/article/details/13760403

转载于:https://www.cnblogs.com/Iambda/p/3933478.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
项目描述:建立购物小商城平台. 实现了前台页面系统。 技术描述:通过Spring 主框架来管理Struts2和Hibernate 框架搭建的电商小平台,用MySQL数据库并创建了表有用户表,订单表,商品表,商品分类表,商品内容表,购物车表等来存储数据。用到hibernate….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值