写在前面-数据结构与算法分析

没有用的前言

复习了有一段时间了。最近在看前端的东西。js红宝书马上就翻完了,vue文档也又再翻了一遍,基本用法没有太大变化,但还是增删了一些东西。现在回过头来,开始调优自己的代码风格,毕竟以前只顾自己写的开心,代码风格实在是很丑的。前端部分等过段时间整理好了一起做个总结。这两天开始翻数据结构和算法,这里写一下大概的复习计划。

为什么要学算法

其实严格来讲,解决问题的方法,基本都会涉及算法。但是我们讲算法,其实很多时候是追求更高的目标。学习之前,我们会达成一些共识。

1.计算机资源是有限的。包括时间与空间,运算资源等。我们没有无限的时间等待运算,没有无限的空间存储数据,一台计算机单位时间的运算次数是有上限的。

2.我们求解的数据集可能会很大很大。我们不是简单得找出10个数里面的最大数,要考虑如果当数据集大到一定程度,比如一百万个数,一千万个数,甚至更多,求解更加复杂问题时候的场景。

因此,算法的目标就是降低复杂度,如何在有限的时间,空间,更高效得求解问题的答案。我们探讨一个算法,通常会关注这两个方面。

1.时间复杂度。通常我们用T(n)=O(f(n))表示。n代表数据集的大小。当n足够大时,我们算法效率的影响就会很明显。我们很清楚n^3会远大于n,当我们用这两种复杂度的方法来求解想通问题时,在n足够大的情况下,也会发现,执行时间的效率差距会远比一天比一年的差距还大。很直观的体验就是,最初求解八皇后问题时,一开始的算法,运行时间跑了整整一分钟,而在改进算法后,不到一秒钟我就得到了想要的答案。这只是一个简单的例子。

2.空间复杂度。在求解问题时,我们总是会需要用到一些内存的辅助空间。比如存储一些临时变量。但有时所需空间也会变得很大,因为要存更多的数据。还是一样的,如果可以只需要大小为n的辅助空间,我们一般不会选择需要n^3大小辅助空间的方法。当然这不是绝对的,因为时间与空间都是要考虑的。有时候也需要牺牲一点时间来换取空间,或者反过来也一样。

数据结构

这一板块会从基本的数据结构入手,由简入深慢慢探索数据结构的世界。

1.链表。一般用于管理不连续的存储空间,通常只记录第一个节点的指针,即第一个节点在内存中的存储地址。每一个节点中包含下一个节点的指针。

2.栈。一种先进后出,后进先出的数据结构。应用很多。关于它的结构,看一下汉诺塔的样子。会比较直观理解。

3.队列。和栈类似的结构,但存取方式不一样。是先进先出的。它的结构就跟我们排队买饭是一样的。先排队的人总可以先买到饭离开。

4.树。一棵树会有一个根节点。n个点刚好由n-1条边连接起来,不会形成回路。每两个点之间有且只有一条路可以连通。树应该也属于图的一种。树有许多有趣的特性和变种的应用。

5.图。和树不同,图要求是点和边的集合,没有根节点,也没有要求所有节点互相要有通路。图论的问题会更复杂一些。后续再慢慢讨论。

6.其他的后续再补充

算法分析

这一板块由浅入深介绍一些常用算法。主要了解算法思想。会涉及贪心,递归,动态规划等算法的分析。

后记

算法学习越到后面会越觉得有趣。刚开始可能会有点头炸。有很多的在线题库可以做题练习。像leetcode,是现在用得比较多的。以前学习的时候,用过hdoj,poj等,题目数量多。如果是参加ACM或者其他算法比赛的话,hdoj上好像每年都会同步赛题上去。工作面试的话,推荐leetcode的就比较多啦。因为很多都是面试题来的。打比赛的话,codeforce,topcode,都会比较推荐啦,定期都会举办比赛,和全世界各地的小伙伴一起pk。当然时间这一块可能就要自己调整了。因为是国外的站点,会有时差,所以常常会赶到半夜比赛。

突然发现时间太晚了。要睡觉了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值