一眼。
「需要什麼?」林東問。
「階段一的代碼。」許藏說,「還有詞庫。」
林東把階段一的代碼發給他。
許藏打開,從頭到尾看了一遍,沒說話。
然後打開編輯器,開始寫。
林東沒打擾他,靠在椅背上看著。
許藏的思路和他不一樣。階段二要求詞組聯想—一輸入一個詞,係統自動預測下一個可能的詞。
常規做法是統計詞與詞之間的共現頻率,詞庫10萬詞條,兩兩組合就是100億對,根本存不下。
許藏用的不是常規做法。
他把每個詞映射成一個固定維度的向量,然後計算向量之間的相似度。相似度高的詞,就是可能的下一個詞。
這個思路,林東想過,但沒往深了想。
因為向量維度太高,計算量太大。但許藏用了降維一用哈希把高維向量壓縮成低維,計算量從0(n2)降到了0(n)。
許藏寫得很快,代碼量很少,但邏輯很繞。
林東看了一遍,看懂了。陳龍也湊過來看了一遍,沒說話,但推了推眼鏡。
五十分鐘後,許藏停下手指。
「寫完了。」他說。
「檢查了嗎?」陳龍問。
「沒有。」許藏說。
林東愣了一下:「沒檢查?」
許藏看了他一眼:「你幫我檢查。」
林東沒說話,把代碼拿過來,一行一行地看。
哈希函數,沒問題。
向量降維,沒問題。
相似度計算,邊界條件沒處理。
他改了一行代碼,加了一個判斷。
「好了。」他說。
許藏點了點頭,按下「提交」。
大屏幕上,四大天王隊的圖標亮了—一提交。
觀眾席上又是一陣騷動。
「階段二也交了?這麼快?」
「張揚隊階段二開始還沒有多久。」
幾秒鐘後,圖標變綠。
通過。
用時:五十分鐘。
李虎興奮得差點從椅子上跳起來,被陳龍按住了。
「別激動。」陳龍說,「還有階段三。」
林東看了一眼大屏幕上的時間。
倒計時還剩一小時二十五分鐘。張揚隊階段一剛通過,用時六十五分鐘。
四大天王總用時一個小時三十五分鐘,比張揚隊快了將近二十分鐘。
但階段三才是最難的部分。
詞頻動態調整。
用戶的使用習慣實時影響候選詞排序。常規做法是用LRU或LFU算法,維護一個詞頻表,每次輸入後更新權重。
但0.5MB的內存,存不了多少數據。10萬詞條,每個詞條存一個整數詞頻,就是40萬字節,差不多0.4MB。再加LRU的雙向鏈表,肯定超。
林東有另一個辦法。
他第二輪結束後研究過這個算法—一—近似計數算法。
固定大小的二維數組,不存具體詞頻,隻存近似值。內存占用固定0.3MB,響應時間0(1)。
當時不是為決賽準備的,隻是覺得「以後可能用得上」,順手寫了一個demo
。沒想到今天真用上了。
他打開編輯器,開始寫。
算法不複雜。
一個二維數組,d行,w列。每個輸入進來,哈希到某一行某一列,計數加一。查詢的時候,取該位置的最小值作為近似計數。誤差可控,內存固定。
他寫得很快。每一個變量,每一個函數,每一行代碼,都在他腦子裡過了無數遍。
李虎湊過來看了一眼,看了半天,問了一句:「你這個算法,跟第二輪那道題有點像?」
林東沒抬頭:「嗯。」
李虎撓了撓頭,沒再問了。
他想起自己第二輪結束後重寫那道題的時候,林東站在他後麵看了一眼。當時他以為林東隻是隨便看看。
現在他知道了,林東他把那個數據結構的精髓全看懂了,還用到了這裡。
」?的寫候時麼什你,法算個這「:鏡眼推了推,秒幾了看,眼一了看來過湊也龍陳
。說東林」。前之「
。了問再沒龍陳
。指手下停東林,後鐘分多十二
w t . p o o問訪請容內說小多更
。說他」。了完寫「
。問龍陳」?嗎了查檢「
。遍一了看己自,答回沒東林
。內圍範受接可在差誤的數計似近,題問沒界邊組數,題問沒數函希哈
。製限的BM2於低遠,BM82.1共總,BM4.0的二段階,BM85.0的一段階上加。BM3.0,下一了算他一—用占存內
。sm7——間時應響。過通部全例用試測——」行運「下按再。過通——」譯編「下按他
。」交提「下按,氣口一吸深他
。交提一—了亮標圖的隊王天大四,上幕屏大
。標圖個那著盯在都人有所。來下靜安上席眾觀
。綠變標圖後鐘秒幾
。過通
。鐘分十四:時用
」!了過全段階三!了過通「:龍陳的邊旁住抱把一後然,秒一了愣虎李
。開掙沒但,氣過不喘得勒他被龍陳
。下一了彎角嘴,幕屏大眼一了看,睛眼開睜藏許
。氣口一出長,上背椅在靠東林
。鐘分五十時小個二。鐘分五十三百一,鐘分十四加鐘分十五加鐘分五十四:時用總
。寫在還,三段階。度進的邊那隊揚張眼一了看他
。交提隊揚張,鐘分十四近將了過又
。過通
。鐘分十四近將了多王天大四比經已時用總但
。光目回收東林
。了輸隊揚張
。擊打維降是,法算數計似近的用他。用夠不存內,下景場個這在但,解優最規常是URL。對不數路的們他為因