Menu Sidebar
Menu

January 2020

Understanding LSTM Networks

链接: https://colah.github.io/posts/2015-08-Understanding-LSTMs/ LSTM比其他Neural Networks有更好的上下文能力. RNN的上下文能力, 来自于loop. 需要处理上下文中word之间的gap. 比如猜测” I grew up in France… I speak fluent French. “最后一个字French, 需要直到France, 但是France和French之间有gap. 这种gap如果一直存在, 影响随着loop会越来越明显. 虽然理论上不会有这种问题, 但是实际上是经常存在的. LSTM就是用来解决上面这个问题的. LSTM最大的优势是, 他不只是一个单层的网络结构, 而是四层. LSTM使用了gate的概念, gate决定是否让一个information传递到下一个神经元. LSTM通常有3个gates. 使用forget gate layer (sigmoid) 来遗忘不重要的数据, 0表示完全遗忘, 1表示完全传递. 使用input gate layer(sigmoid+tanh)来决定记住那些数据, sigmoid用来判断那个需要update, tanh来决定update多少. 最后通过一层的filter layer(tanh)来决定h 一个变种是添加了一个peephole(探孔)来让gate有”全局观”, 数学上就是把上次的参数加入这次的gate的计算中. 另一个变种是让forget gate和input gate之间产生联系. 还有一种变种结合了forget和input, 变成了update gate, 这种方法叫GRU.

Smallest Subsequence of Distinct Characters

给一个字符串数组, 求一个最小的子序列, 其中包含不同的字符. 并且要求是字典序的顺序. 这个题开始的时候想复杂了, 我以为要用pq去排序字符串, 后来做的过不去test case, 然后看了眼答案, 发现可以用stack解决顺序的问题. 就是用一个数组记录一下是否已经在stack中, 然后stack里如果顶部的字符小于当前字符, 并且当前字符没有其他的, 就放到答案里, 如果不是就弹出.

Smallest Sufficient Team

给一个数组, 里面是完成一个任务需要的技能, 另一个数组是每个人有的技能, 求完成任务的最少人的数组. 这个题是一个set cover问题, 因为set cover的k决定性问题是NPC, 但是set cover本身不是, 所以这个题应该可以在多项式时间内解决. 首先hints中提示了要做bit编码, 那么就用过反转index,找到每个skill对应的数字, 然后通过左移(<<)标记在int中. 然后就是算法部分. 通过hint2得知, 这题是类似于背包问题的dp问题, 所以我们用一个loop扫描每个人, 然后用一个数组装所有可能的需要完成任务的技能的combination, 比如n个需要的技能, 那么就是 1 << 个位置. 所以我们的答案就在all[(1<<n) – 1]这个位置上.我们比较每个可能技能下的需要的人数, 就可以得知这种组合下的人的最优解(人数最少). 最后要解决的问题是, 如何匹配组合的技能和人的技能.int comb = k | pSkill; k遍历所有的技能, 然后通过与运算和pSkill进行匹配. 对技能的编码如下: {“java”:0,”nodejs”:1,”reactjs”:2} , 而pSkill的编码比如people: [[“java”,”nodejs”,”reactjs”]] 编码为111. 即表示这个人会所有技能, 那么如果是 people: [[“java”,”reactjs”]], 编码为101, k则从1一直遍历到1 << 3,也就是7(111), 这样可以覆盖所有可能的组合, 我们通过k一直update每个人的技能与当前team的匹配结果, 最后得出答案.

Building H2O

多线程的题, 给两个方法, 一边是h一边是o, 问如何即时返回水(h2o). 通过观察可以看到, 水是两个h一个o, 那么当一个o出现的时候, 我们就检查是否有两个h. 当h不够2的时候, 就等h够2再继续运行. 所以一个互斥锁即可.

Older Posts

书脊

这青苔碧瓦堆, 俺曾睡风流觉, 将五十年兴亡看饱.

January 2020
M T W T F S S
 12345
6789101112
13141516171819
20212223242526
2728293031