《programming for the puzzled》第11章
涉及到的算法和语言问题:理解列表,递归进行分治搜索。
有2^n×2^n大小的院子,要用面积为3的L形的瓷砖铺满
可以在不突破边界,不破坏瓷砖,瓷砖之间也不重叠的情况下完成吗?答案是不行,因为2^n×2^n不能被3整除,只能被2整除。而如果允许有一个方块的地方可以被剩下来,则2^2n-1则可以被3整除。
有没有一个铺砖的算法能够将任意2^n×2^n大小的院子用面积为3的L形的砖铺满只剩一个方块没铺?
归并排序是分治算法的一个例子。
要排序一个序列(如[a, b, c, d]),可以把这个序列分成两个序列([a,b], [c,d]),然后递归地对两个序列进行排序。如果序列长度为2,则比较这两个元素,结束递归。最后用一个合并的函数将两个列表合并到一起。
1 | # coding:utf-8 |
归并排序要比选择排序高效很多,其时间复杂度为nlog2n.
现在来用分治法解决铺瓷砖的问题。
首先看n=1的情况,那是2×2的地方,L形瓷砖可以占满3个,还剩一个。
这种情况就是我们分治法递归时的基本情况。
可以这么放第一个
然后就缩小为4个更小规模的问题了。
1 | # 用递归法铺砖 |
说实话没太懂。原理懂了,就是分治,缩小问题规模。但具体代码……先这样吧。
本章代码: https://github.com/zwdnet/MyQuant/tree/master/44
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地