前言
《算法4》这本书的第一章,首先介绍的就是Java的基础知识(泛型、面向对象),同时,还有预备的数学知识,例如如何计算时间复杂度O(n),以及预估上下界、接下来就是介绍几个基础的数据结构了,如栈、背包、队列。
这篇文章就是梳理一下书里介绍的内容,再用自己的语言表达出去。最后还有普林斯顿公开课编程大作业的思路介绍。
资源
coursera公开课视频:https://www.coursera.org/learn/algorithms-part1/home/welcome
太卡的话可能需要挂梯子。或者没有梯子的同学直接去B站看,搜名字就有了(不过这样就做不了编程作业了)
要pdf的书可以联系我,直接发云盘链接给你。搭配视频一起学习最佳。
栈
1)栈的英文为(stack),它一个先入后出( FILO-First In Last out)的有序列表。
2)在栈中,允许插入和删除的端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底( Bottom)。
3)可以把栈想象就是一个玻璃瓶子,我们要添加元素,就往瓶中塞东西,而要取元素时,就从最接近瓶口处拿。这么形容就非常贴近我们生活,以便更好的记住。
出入栈:
背包
背包是一种可以容纳元素的容器,可以使用add方法添加元素。
背包不支持从中删除元素的集合数据类型,不过支持遍历(取出元素是无序的),所以当我们想要找出背包其中元素时,只能foreach遍历背包,一个个找出。
先进先出队列
先进先出队列(或简称队列)是一种基于先进先出(FIFO)策略的集合类型(Queue),这个我们可以联系生活中银行办理业务的队伍来思考,先排队先处理业务——先进先出,如下图所示:
队列与栈不同的是,队列添加元素时,是往“瓶底”里面添加的。而取出时,就与栈是一样的,从瓶口取出。
链表
1)链表是以节点的方式来存储是链式存储
2)每个节点包含data域(存放的数据), next域:指向下一个节点,当next指向null时,可以表明才链表元素是尾结点
3)链表的各个节点在内存中不一定是连续的物理存储(像数组就是连续的物理存储),但在逻辑上,他们是串联起来的
链表通过next字段实现了逻辑上的连接,它通过next域里面存储的物理存储地址找到下一个节点。
编程作业
编程作业链接:https://coursera.cs.princeton.edu/algs4/assignments/percolation/specification.php
首先:
先说说一些个人感悟吧,由于我英语不太好,把以上东西看了几遍又几遍,但总是不知其意。坐在电脑面前瞪眼。
这的确是我之前没接触过的领域,虽然我学习好了java基础,但我发现,不会写就是不会写。这时候,那可以去就复现别人的代码,先找一份别人完成了的内容,先看他的代码,然后试试看能不能理解。最后自己写出来。
主要是学习思路,而不是代码如何写。
还有,如果单纯的想要学习基本的数据结构,下面这份编程作业是不需要看的。
思路:
总体来说,这是一个物理的模型吧,从中每次打开一个格子,格子间连通的条件是: 上下左右都是“打开”状态
当最顶部和最底部发生连通时,就可以说这个模型发生渗透。
这个编程作业也提示了,可以虚拟化两个格子出来,然后判断是否连通就可以通过判断这两个格子是否是connected的来完成,就不用每次都从上到下遍历了,这么做好处显而易见,但是也有一个隐藏的坏处,就是backwish,回流。
我对backwish的理解是这样的,由于所有的底层区域都和虚拟底层区域相连,所以一旦当区域渗透,则和其他的底层开启区域相连的区域也显示为区域满状态。
解决方法:另外加一个不使用虚拟底层的模型,将两个模型结合在一起来判断是否渗透,通过浪费一些内存来保证效率。
Percolation
1 | import edu.princeton.cs.algs4.WeightedQuickUnionUF; |
PercolationStats
1 | import edu.princeton.cs.algs4.StdOut; |