他暗骂了自己一声。
确实漏了。
他开始改了。
在哈希函数里加了一个判断,把“liang”和“lian”分开处理。
五分钟,改完。
重新编译,重新运行,测试用例全部通过。
再次按下“提交”。
大屏幕上,图标变绿。
通过。
用时:四十五分钟。
林东靠在椅背上,长出一口气。
李虎在旁边嘿嘿笑了一声:“吓我一跳。”
“继续。”林东说。
阶段一完成了,但其他人的阶段一还没完成。
张扬队那边,阶段一还没提交。
陈龙和许藏一直没动手,在等林东和李虎写完阶段一,好接着做阶段二。
“阶段二,谁来?”林东问。
许藏开口了:“我来。”
林东看了他一眼。
“需要什么?”林东问。
“阶段一的代码。”许藏说,“还有词库。”
林东把阶段一的代码发给他。
许藏打开,从头到尾看了一遍,没说话。
然后打开编辑器,开始写。
林东没打扰他,靠在椅背上看着。
许藏的思路和他不一样。阶段二要求词组联想—一输入一个词,系统自动预测下一个可能的词。
常规做法是统计词与词之间的共现频率,词库10万词条,两两组合就是100亿对,根本存不下。
许藏用的不是常规做法。
他把每个词映射成一个固定维度的矢量,然后计算矢量之间的相似度。相似度高的词,就是可能的下一个词。
这个思路,林东想过,但没往深了想。
因为矢量维度太高,计算量太大。但许藏用了降维一用哈希把高维矢量压缩成低维,计算量从0(n2)降到了0(n)。
许藏写得很快,代码量很少,但逻辑很绕。
林东看了一遍,看懂了。陈龙也凑过来看了一遍,没说话,但推了推眼镜。
五十分钟后,许藏停下手指。
“写完了。”他说。
“检查了吗?”陈龙问。
“没有。”许藏说。
林东愣了一下:“没检查?”
许藏看了他一眼:“你帮我检查。”
林东没说话,把代码拿过来,一行一行地看。
哈希函数,没问题。
矢量降维,没问题。
相似度计算,边界条件没处理。
他改了一行代码,加了一个判断。
“好了。”他说。
许藏点了点头,按下“提交”。
大屏幕上,四大天王队的图标亮了—一提交。
观众席上又是一阵骚动。
“阶段二也交了?这么快?”
“张扬队阶段二开始还没有多久。”
几秒钟后,图标变绿。
通过。
用时:五十分钟。
李虎兴奋得差点从椅子上跳起来,被陈龙按住了。
“别激动。”陈龙说,“还有阶段三。”
林东看了一眼大屏幕上的时间。
倒计时还剩一小时二十五分钟。张扬队阶段一刚通过,用时六十五分钟。
四大天王总用时一个小时三十五分钟,比张扬队快了将近二十分钟。
但阶段三才是最难的部分。
词频动态调整。
用户的使用习惯实时影响候选词排序。常规做法是用LRU或LFU算法,维护一个词频表,每次输入后更新权重。。。再加LRU的双向链表,肯定超。
林东有另一个办法。
他第二轮结束后研究过这个算法—一—近似计数算法。
固定大小的二维数组,不存具体词频,只存近似值。。
当时不是为决赛准备的,只是觉得“以后可能用得上”,顺手写了一个de
。没想到今天真用上了。
他打开编辑器,开始写。
算法不复杂。
一个二维数组,d行,w列。每个输入进来,哈希到某一行某一列,计数加一。查询的时候,取该位置的最小值作为近似计数。误差可控,内存固定。
他写得很快。每一个变量,每一个函数,每一行代码,都在他脑子里过了无数遍。
李虎凑过来看了一眼,看了半天,问了一句:“你这个算法,跟第