Algorithm-4th part I 学习进度 (7/12)

cousera跟着书的原作者学习《算法》第四版。记录以下学习进度。

课后习题代码见我的GitHub

2018.09.22 : Priority Queues

  使用完全二叉树实现优先队列

  传统算法都好神奇,这里只需要用一个数组就可以表示完全二叉树。然后通过这个完全二叉树实现优先队列、优先排序。

  然后作业的数字推盘游戏实现前完全没有头绪怎么做,实际上就是一个启发式搜索,使用了优先队列来判断下一个搜索方向。优雅的实现 ​​​​

2018.09.18 : Mergesort

  归并排序,迭代的方法来实现的。现在感觉过视频的方法记忆不太深刻,要搭配这多写点代码了。

2018.09.11 : Elementary Sorts

  学习了三个初级排序方法,选择排序,插入排序,希尔排序。希尔排序通过改造插入排序,只增加少量代码,并且不适用额外空间的情况下,加快了排序速度,很适合嵌入式或简陋的环境下使用。之后又讲了洗牌,小bug造成大错误啊,要训练自己少犯。

2018.09.11 : Stacks and Queues

  讲栈和队列,虽然之前对定义有了解,但是并没有深入了解、实现。这里学会了使用链表和变长数组实现,并且讨论了两者的区别,见下表。变长数组占用更少的内存,两者平摊时间相同,但是最坏的情况(需要改变数组长度)时,单次时间较长。当需要考虑系统实时性时,使用链表实现,其他情况可使用变长数组。

  内存 平摊时间(amortized time) 单次时间
链表 40N constant O(1)
变长数组 8N~32N constant O(N)

  对于java语言特性,学到了泛型编程和迭代器。都是好东西,要多用用。

  算法题真的能惊艳到自己,这一节中,两个题让我很震惊。

    一个是使用两个栈来实现队列,并要求做到constant amoritized time.具体的解答在SO上有。how-to-implement-a-queue-using-two-stacks

    另一个就是题目里的extra部分,学到了一个叫水塘抽样(Reservoir sampling)的方法,这个真的节约内存。具体见wiki:水塘抽样

2018.09.02 : Union−Find & Analysis of Algorithms

  入个门,简单了解了java语法,完成了作业。系统自动批改作业反馈真详细啊,这应该就是写的好的单元测试。

 

posted @ 2018-09-22 15:55  huipengly  阅读(138)  评论(0编辑  收藏  举报