这次真的是拖了好久才把那周课和作业写完,前后四天!
这次讲了两个东西,第一个是maxflow-mincut,第二个是 radix sort,其实就是string sort。
先讲下最大流吧。
还是有权图中的一个问题。怎么切,可以得到的capacity最小。
然后为了解决这个问题,给每条边加上另外一个成员,flow,flow <= capacity.
然后设计出了一个 Fordxxxxx的算法。可以找出什么时候 flow最大。然后证明,在这个时刻,和源点s以某种规则联系在一块的点的集合,就是mincut.
所以我觉得是先有了mincut这个问题,然后设计出maxflow的模型来解决这个问题。
我觉得里面比较绕的就是 residualFlow这样的东西。但是自己仔细想了之后差不多也可以理解了。
剩余的意义在于,还剩多少flow可以从这个源点发出去。
第二是string sort。
首先讲了定长字符串排序的一种方法,LST.
之所以会这么快,是使用了一种key-indexed counting方法。
这个方法之所以这么快,是因为在排序中,他并没有不断地比较。而是自然而然生成了一个由小到大的序列。
其实字符串的确不需要比较啊。他的大小已经是规定好了的,每个字符都有自己规定好的位置。所以直接把他们放在应该在的地方,然后记录他们重复出现的次数,最后还原就可以了。
那么不定长字符串怎么排序呢?
就有了MST。从右边开始,然后使用 recursive的思想。根据首字母分成不同的集合,再分别依次再次使用key-indexed counting,直到结束。
但是这样子开销太大了。
于是将MST于quicksort相结合,形成了一个新的算法叫做, 3-way radix quicksort.
我觉得更像是 quicksort。
然后讲了suffix array。也就是 获得子字符串 这样的方法有什么用。其实还是很有用的。
我是这么理解的。
加入你现在用的是浏览器, CTRL+F是搜索功能。然后你搜索什么他可以快速帮你找到。他是怎么找的呢?难道就是简单地不断地把你输入的字符串和网页内容比对?那太慢了,而且搜索时间什么的完全由你的输入决定,网页做不了什么提前准备的工作来降低搜索时间。于是,可以假设网页文本内容在一个大string里面,suffix 这个string。
比如
string a = "helloworldhello"
h e l l o w o r l d h e l l o
e l l o w o r l d h e l l o
l l o w o r l d h e l l o
l o w o r l d h e l l o
o w o r l d h e l l o
w o r l d h e l l o
o r l d h e l l o
r l d h e l l o
l d h e l l o
d h e l l o
h e l l o
e l l o
l l o
l o
o
然后使用我刚刚说的 3-way sort 或者 MST排序。
d
e l l o
e l l o w o r l d
h e l l o
h e l l o w o r l d h e l l o
l d h e l l o
l l o
l l o w o r l d h e l l o
l o
l o w o r l d h e l l o
o
o r l d h e l l o
o w o r l d h e l l o
r l d h e l l o
w o r l d h e l l o
可以看到经过排序之后,这个string里面含有的信息会被自动归类,按字母排序。重复的首单词会集中在一块。
然后如果这就是一个网页里面的内容,我在该网页搜索, lowor
他就会首先使用二分查找法,binary seach,先找到l首字母。再在里面继续根据第二个字母使用binary search。直到最后找到需要的东西。
当然我这里说的是一个比较简单的模型。也是我自己理解的。现实情况应该会更加复杂。但基本原理应该相近。服务器会先把网页内容处理下,让搜索操作耗时更少。
然后说下这次作业。
这次作业最大的难点,时间复杂度和空间度复杂度好像都没有了。所以代码可以随便写,只要能实现要求就可以了。
我觉得得搞清楚如何使用maxflow-mincut模型来解决这个问题。之前看人给的提示,说是,当右边全满时,如果左边的有未全满的,那么就一定eliminated的了。我也是照着这个写的。后来发现这样子是不全面的。
我的思路是,遍历左边的每条边,某条边没满时,查找到这条边to结点对应的那场比赛的双方,在右侧对应的两条边,看下这两条边是否已经满了。如果没满,那就一定eliminated的了。
如果右侧有边直接capacity < 0,那就直接退出这个方法了。这是我之前没想到的。我以为其他的仍然也需要验证,然后放进subset。但这里显然进行了简单处理。
另外,我觉得处理输入的字符串,构造多个数组,这一块儿,我并没能一次通过,因为有好多情况没考虑到。然后不断地换新的输入,不断地改进自己的constructor才搞好。是不是有一些模板式的处理方法我不知道?或者说有一些string类函数可以直接调用?但是中间可能有三个空格,两个空格,一个空格。结尾处可能是空格,也可能单纯的就是数字。我就是用一个头指针一个尾指针不停地扫描出来的。所以经常出错。
Anyway, 又熬过了一次作业。。
前段时间也不是自己不要好。说下情况吧。
一般十一点起,然后玩下手机,十一点半起床。
一般得搞点中饭吃吃,一般懒得做就吃两个荷包岛(结果就是四点开始就很恶了)。
然后一般一点半这样开始看书。两点半这样进入状态。
然后三点二十这样又得开始考虑给女朋友打电话。一打一般就是大半个小时。之后就是四点。
然后讲完话后,人的状态没了。而且写代码这个东西,真的不能中途停!一停,之前的那些东西全忘了。所以人也很烦躁。然后,又开始饿了。
效率极低的磨到六点,开始准备晚饭。吃完出去散个步。回来九点,又困了。
然后睡到零点。起床又觉得看不动算法了。
每天都这样,很痛苦。所以打算和妹子说清楚,以后通电话的时间可能得改变了。否则我实在是应付不了目前的情况了。
当然,前段时间自己也有些飘飘然。现在好了。觉得自己踩在大地上了。
不管怎么样,都要前行。
女朋友很努力。不管怎么样,一起前行。
马上打算先吃两个荷包蛋。。。
然后洗个澡。
然后把学校考试的课件都整理下。打算先复习A1吧。这个比较熟悉。
签证的事,晚上睡觉前查一下。也要开始考虑了。
Good luck, Richardo!