輕輕的它走了,憶一憶記住了什麼?——圖靈月刊(第一期)
這個8月即將滑落,在這個月裡,大家都記住了哪些事情?
國際上:倫敦奧運會結束了,新的英雄誕生了。
國內: 8月17日摩托羅拉中國區裁員拉開帷幕
小編身邊的事情:公司組織我們去了美麗的廬山,因為雨、霧的關係,真正體會到了"不識廬山真面目,只緣身在此山中“的意境。回來就是各種各樣的技術會,圖靈社群裡圖書在更新、討論的熱點在更新、大家注意的內容也悄悄的在改變。
相關連結:
每天都有事情在發生,我們的周圍在不經意間一點點改變著,小編整理了一些剛剛和正在發生的事情,希望對大家有所幫助!
一、熱點
1、IT人員面試難
引子: 8月21日,微博上酷殼博主@左耳朵耗子——陳皓,發文寫道,“面試中編碼題:‘找出某陣列第2大的數’,被面的8個人中,只有一人用了排序,結果他被我司的面試官們無情地滅掉了,說是一看就沒寫過程式。依我看,這堆面試官全都應該被滅了。因為,排序演算法可以應變需求變化的——找到第K大的數,工程中,能寫出可維護有擴充套件性的程式才是編碼高手。”
22日,@左耳朵耗子繼續發文“為什麼我反對純演算法面試題”,在文中寫道,“演算法面試是中國應試教育的毒瘤!而很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。純演算法的面試題根本不能反應一個程式的綜合素質!”
軟體開發者面試冷笑話
如果要像漫畫中的程式設計師那樣,可以肯定每次面試都將無法通過了。
一個程式人員到底要如何準備應對演算法面試呢?這對於那些剛畢業,即將步入職場的畢業生來說,更是一個非常大的困擾。
《金領簡歷》的作者,曾在谷歌工程部門就職三年,在此期間擔任了谷歌招聘委員會成員,並面試過120多名求職者的麥克道爾 (McDowell,G.L.),也許可以給你一些很好的建議。
科技公司需要什麼樣的人才?他們希望找到富有激情、創意無限、積極主動且聰明睿智的人才,這些人最好還能有一種“把事情做好”的工作態度。在面試中一定要突出表現這些方面的潛質。就非技術層面而言,你可以參考這篇文章“寫給剛入職場的你 進入科技公司的面試寶典”,在此就不多贅述。以下主要講講麥克道爾告訴大家的應對演算法面試的建議。
演算法問題:五種建立演算法的方法
世界上沒有什麼完美方法能解決棘手的演算法問題,不過以下的方法會很有用。請記住熟能生巧,一定要多練習。而且你要記住,這五種方法是可以“混搭的”。也就是說,應用過“簡化和歸納”的方法之後,接下來還可以採用“模式匹配”的方法。
方法一:例證法
我們先來講“例證法”,因為這可能是最廣為人知的方法(儘管單從名字上看不出來)。“例證法”的意思是你先舉出一些特定例子,然後再看看能否從中總結出一般規律。
舉個例子。給你個具體時間,計算在對應鐘表上時針與分針之間的角度。
我們可以以3點27分為例。先畫一個時鐘圖,看看3點的時針在哪裡,27分的分針又在哪裡。
請注意時針是連續移動的,而不是隨著時間的變化做離散運動。
通過處理這個例子,我們可以總結出一個規律。
分針的角度(從12點整開始算起):360 × 分鐘數 / 60
時針的角度(從12點整開始算起):360 ×(小時數 % 12)/ 12 + 360 × (分鐘數 / 60 )×(1 / 12)
分針和時針之間的角度:(時針的角度分針的角度) % 360
簡化之後,我們將整個算式精簡為 “30 × 小時數5.5 × 分鐘數”。
方法二:模式匹配
模式匹配指的是將現有問題與相似問題作類比,然後看一看你是否可以修改之前的方案來解決新問題。這也就是熟能生巧的意義所在:解決過的問題越多,解決問題的能力就越強。
舉個例子。排好序的陣列中某個節點被調換了一下,現在裡面的數字可能是3 4 5 6 7 1 2這樣的順序。你怎樣才能找出陣列裡面最小的那個元素?
這個問題和以下兩個著名的問題很像。
在一個沒排好序的陣列中找出最小的元素。
在一個陣列中找出某個特定的元素(比如,通過二分查詢法)。
在一個沒排好序的陣列中找出最小元素的演算法沒什麼太大意思(你可以遍歷所有的元素),同時它也無法利用給出的資訊(也就是陣列是排過序的)。該問題對你並沒有什麼幫助。
然而,二分查詢法卻非常有用。你知道這個陣列是排好序的,而且在某個地方順序被調換了一下。所以它的排列肯定是從小到大,然後在某個地方變小,又開始從小到大排列。所以,這個“轉折點”正是那個最小的元素。
如果你將第一個元素與最中間的元素做比較(3和6),就會發現它仍然是從小到大排列的。這就意味著那個轉折點肯定是在6之後(或者3就是那個最小的元素,這個陣列根本沒被調換過順序)。我們仍然可以運用二分法找出一個範圍(“左邊的元素”>“右邊的元素”),從而定位到這個轉折點。如果“左邊的元素”<“右邊的元素”,那轉折點就不在其中。如果恰好“左邊的元素”>“右邊的元素”,那就找到了目標。
方法三:簡化和推廣
其中,我們會修改一些限制條件(資料型別、大小等)來簡化問題,然後嘗試著去解決這個簡化過的問題。如果想出瞭解決此“簡化”問題的演算法,就可以推回到原始問題。這下你明白了吧?
舉個例子。人們可以從雜誌裡剪下語句來拼成一張勒索字條。你怎樣才能推斷出贖條(一個字串)是不是由某本雜誌(另外一個字串)裡的語句組成的呢?
我們可以先這樣簡化此問題:暫時不考慮語句,只當它是字元。也就是說,假設我們從雜誌裡剪下了一些字元來組成了這張勒索字條。
於是,我們可以建立一個字元陣列並數一數裡面有多少個字元。陣列中的每一個元素代表一個字母。首先,我們可以數數每一個字元出現在贖條中的次數,然後再回到雜誌中查詢我們是否擁有贖條上的全部字元。
如果將這個演算法推廣開來,接下來要做的事情也差不多。這一次,我們建立的不是字元陣列,也不需要數這些字元出現的次數,我們建立的是雜湊表。每一個單詞對應有它出現的次數。
方法四:通過基本案例構建整體
通過基本案例構建整體意味著我們先得解決基本案例(比如說,只有一個元素)的演算法。然後,在得到了元素一的解法之後,再去解決元素一和元素二。再然後,有了元素一和元素二的解法,我們就可以解決元素一、元素二和元素三。
你會發現通過基本案例構建整體的演算法其實很自然地就是一種遞迴演算法。
舉個例子。設計一個演算法,使它列印出一個由字串內字元組成的所有可能字串。為了簡化問題,我們假設字串中的所有字元互不重複。
比如考慮一下這個字串:abcdefg。
只有“a”時的情況下,結果是:{a}
然後是“ab”, 結果是:{ab, ba}
然後是“abc”,結果會是什麼呢?
這時候問題開始變得“很有趣”。如果我們知道了P(“ab”)的答案,那如何得到P(“abc”)的答案呢?很簡單,新加的字元是“c”,那我們只需要給前面的任何答案加上一個 c 就好了。也就是:
Merge(c, ab),結果是:{cab, acb,abc}
Merge(c, ba),結果是:{cba, bca, bac}
我們採用遞迴演算法來解決這個問題。首先,迴圈往復“砍掉”最後一個字元,併產生s[ 1…n1 ]的所有可能結果,如此來產生所有可能的字串,然後,將s[n]插入到字串中的每一個位置。
方法五:資料結構頭腦風暴
這種“資料結構頭腦風暴”法很需要技巧,不過這個方法非常管用。此方法的精髓在於我們得遍歷全部資料結構列表並嘗試去應用每一個結構。此方法的可行之處在於,一旦我們找到了合適的資料結構,很多問題也就迎刃而解。
舉個例子。我們隨機產生了一些數字並將它們儲存在一個(可擴充的)陣列中。怎樣才能找到中間值?
開始我們的資料結構頭腦風暴吧。
連結串列?恐怕不行——對於數字的訪問和排序,連結串列貌似不太在行。
陣列?也許可以,不過你已經有一個陣列了。你可以對這個陣列裡的元素進行排序嗎?恐怕開銷會比較大。我們先暫時不考慮它,如果有需要的話,回頭再想想。
二叉樹?這個是有可能的,因為二叉樹非常適合處理排序的問題。實際上,如果這是一個完全平衡的二叉樹,中間值可能就在樹的最頂端。不過,你要小心——如果它包含偶數個元素,那實際上中間值就應該是最中間兩個元素的平均值。而最中間的兩個元素不可能都在最頂端。所以,這也許可行,我們待會兒再來看看。
堆?堆非常適用於基本的排序,並且能夠記錄最大值和最小值。它實際上也很有意思——如果你有兩個堆,就能夠跟蹤最大的那一半元素和最小的那一半元素。最大的一半儲存在小頂堆(min heap)裡,其中最小的那個元素在頂端。最小的一半則儲存在大頂堆(max heap)裡,其中最大的那個元素在頂端。現在,有了這些資料結構,整個陣列中的中間數就很有可能位於這兩個堆的頂端。如果這兩個堆的大小不一樣,你還可以從一個堆裡取出一個元素將它推進到另外一個堆裡,很快地將它們“調整”好。
演練的問題越多,你的直覺就會越靈敏,知道該採用哪一種資料結構。雜湊表、樹、Trie樹和堆是一些能解決問題的最好的資料結構。
相關圖書:
相關閱讀
2. 搜尋領域硝煙再起 360進軍搜尋市場
據IT媒體訊息,上週四360推出的綜合搜尋引發各方關注。前天起(8月21日),360自主搜尋引擎替換谷歌,成為360網址導航的預設搜尋引擎。在一些版本的360瀏覽器搜尋框中,360搜尋也已經被設定為預設搜尋引擎。
2010年穀歌宣告退出中國以後,原本谷歌百度二虎相爭的競爭格局開始被打破。谷歌的流量一落千丈,百度侵蝕了谷歌中國的大部分市場份額。而360的加入使得搜尋市場又開始風起雲湧。據悉短短的幾天之內,360已經佔據了搜尋市場10%的份額。一位搜狗前網頁搜尋效果及廣告演算法負責人估計,稱截至目前這個數字(360搜尋獲10%份額)應該達到了13%—16%,絕大部分來自網址導航頁和瀏覽器產品的捆綁。“現在的狀況是,360還沒有完全在所有產品線鋪開搜尋捆綁,如果再加上安全衛士、防毒和360桌面,這種增長將更加明顯。”
對於使用者最為關心的搜尋質量問題,來自競爭對手搜狗的評測報告稱,360搜尋整體效果略優於搜搜,但落後於百度、谷歌和搜狗。其中,360搜尋在熱詞查詢上效果較好,和百度、搜狗持平,明顯好於谷歌和搜搜;而在長尾詞效果上目前表現還較差。
其實從360搜尋迅速增長的市場份額可以看出,它的增長完全得益於360的產品線。以及使用者對於360產品的使用習慣。360瀏覽器、360網址導航、360防毒等產品在上網使用者中擁有廣泛的使用者基礎。
360瀏覽器的月度活躍使用者為2.72億,市場滲透率為61%。,360網址導航及其下屬頁面的日均獨立訪問使用者為8300萬人,日均點選量約為3.68億次。據360釋出2012年第二季度財報,報告顯示期內營收為7280萬美元,比去年同期的3510萬美元增長107.3%;淨利潤為700萬美元,比去年同期的1110萬美元下滑36.9%。其中綜合搜尋也被提及,財報稱,“公司將繼續集中資源在產品和技術的積極研發上,特別是手機網際網路,雲端服務和搜尋”。
360的營收與它如此巨大的使用者基礎及使用流量是不相匹配的。其實從這些跡象不難看出,360如何將如此巨大的流量轉化應收,確實是其不得不考慮的問題。而進軍搜尋市場應該是早有準備之舉。360在之前剛和騰訊有過交鋒,而在未來360與百度的衝突將不可避免。而未來中國的搜尋市場是三足鼎立、還是七雄爭霸,大家只能拭目以待。
相關圖書
相關閱讀:
二、圖靈參會記
8月驕陽似火,各種技術大會也是辦的紅火。上週末,有多個圖靈贊助的活動同時進行。沒辦法只好有所取捨,並兵分多路出擊,參加不同的活動。
8月18、19日,連續兩天。HTML5峰會在北京國際會議中心舉行,眾多HTML的開發者和移動網際網路產業企業齊聚北京,圍繞著“HTML5在路上”的主題展開了五大專場討論,圖靈作為技術圖書出版商也參與了此次大會,並帶去了大量前端好書。在活動現場還進行了“圖靈暑期大型贈書活動”,吸引了大量讀者來到圖靈展位“圍觀”,場面曾一度HOLD不住。
8月18日,第四屆HDCon人本設計大會在上海楊浦區創智天地召開,本次大會設計界的大牛雲集,guang.com創始人,UCDChina 發起人白鴉、中國使用者體驗專業行業組織(UPA)共同創始人&主席黃峰、活力公司創意設計總監(同時也是圖靈圖書的譯者)向怡寧、國內最早研究網頁視覺的設計師樑景紅、創新工場使用者體驗總監吳卓浩等。
8月19日,中國加速2012創業團隊見面會在中關村創業基地創業主題咖啡廳舉辦,本次活動有來自中國加速今年投資的世界各地的10個專案團隊參加。參會者們共同探討高科技領域創業的經驗與歷程,結識志同道合的朋友。現場的幸運者還獲得了圖靈的圖書《他山之石:TechStars孵化器中的創業真經》一本。
8月19日,2012北京軟體測試管理沙龍在中國國際科技展覽中心舉行。本次沙龍是“2012年CSTQB軟體測試系列沙龍北京站”活動。來自北京,天津,上海,南京等各地軟體測試經理和測試工程師齊聚一堂,共同探討了軟體測試的挑戰與職業發展。獲獎參會者還獲得了圖靈出版的《軟體測試(第3版)》、《軟體測試基礎教程(第2版)》、《敏捷武士:看敏捷高手交付卓越軟體》等軟體測試方面的好書。
8月25-26日,2012移動開發者大會將在北京京儀大酒店舉行,圖靈將會親臨現場參加。移動網際網路正迎來黃金十年,面對如此龐大的市場,各領域開發者在迎接機遇的同時,也需看準領域及提升自身競爭力,如何瞭解業界趨勢,把握最新技術?
本屆大會分為趨勢篇與技術篇,並從iOS、Android、Windows Phone、Html5、Air、Unity3d等多領域展開話題,眾多產業領袖與技術大咖首度雲集,為廣大社群聯盟的會員及觀眾帶來一場精彩絕倫的腦力提升盛宴。
相關圖書:
相關閱讀:
三、新書速遞
四、 精彩書評
從一個菜鳥的視角看Node.js--《Node.js開發指南》樣張書評
計算機體系結構:量化研究方法(第5版) ——與時俱進的教科書
五、下週看點
移動網際網路行業的技術交流盛會,2012(秋季)CocoaChina開發者大會將於9月1日在北京國家會議中心舉辦。本屆大會將以"//And One For All "為主題,就移動遊戲跨平臺的產品研發與市場推廣展開深入的探討和交流,同時分享Cocos2D-X等跨平臺引擎與開發工具的最新技術與心得。圖靈也將設展參加,9月1日大會現場見。
即將上市新書
本文主編:袁野 副主編:劉紫鳳
相關文章
- Java記憶體模型FAQ(一) 什麼是記憶體模型Java記憶體模型
- Android 輕鬆解決記憶體洩漏Android記憶體
- 鴻蒙輕核心原始碼分析:虛擬記憶體鴻蒙原始碼記憶體
- 舉一個有趣的例子,讓你輕鬆搞懂JVM記憶體管理JVM記憶體
- 什麼是記憶體記憶體
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- Java記憶體模型是什麼,為什麼要有Java記憶體模型,Java記憶體模型解決了什麼問題?Java記憶體模型
- 萬字解讀鴻蒙輕核心實體記憶體模組鴻蒙記憶體
- MongoDB 如何使用記憶體?為什麼記憶體滿了?MongoDB記憶體
- MongoDB如何使用記憶體?為什麼記憶體滿了?MongoDB記憶體
- 什麼是Java記憶體模型?Java記憶體模型
- 什麼是Java記憶體模型Java記憶體模型
- Spark中的記憶體計算是什麼?Spark記憶體
- 顯示卡的視訊記憶體是什麼?記憶體
- 物件為什麼活在記憶體的解析物件記憶體
- Java記憶體模型FAQ(五)舊的記憶體模型有什麼問題?Java記憶體模型
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- Java記憶體對映,上G大檔案輕鬆處理Java記憶體
- 虛擬記憶體有什麼用 虛擬記憶體不足怎麼解決記憶體
- 電腦記憶體選購知識,什麼樣的記憶體適合自己?記憶體
- 掌握鴻蒙輕核心靜態記憶體的使用,從原始碼分析開始鴻蒙記憶體原始碼
- Android記憶體分配/回收的一個問題-為什麼記憶體使用很少的時候也GCAndroid記憶體GC
- SQL Server為什麼這麼耗記憶體SQLServer記憶體
- 物件記憶體圖物件記憶體
- 教你如何擴大電腦的虛擬記憶體? 什麼是虛擬記憶體?記憶體
- 解決Android記憶體洩漏;輕鬆降低100MAndroid記憶體
- 什麼是伺服器記憶體?如何選擇伺服器記憶體?伺服器記憶體
- 什麼是記憶體管理?其最主要作用?OC記憶體管理機制?記憶體
- Python記憶體檢視是什麼Python記憶體
- Win10記憶體要求是什麼?Win10記憶體
- 第一期前端技術月刊(一月)前端
- 詳解JVM中的記憶體模型是什麼?JVM記憶體模型
- 騰訊一面:記憶體滿了,會發生什麼?記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- 圖靈圖書伴你春運回家路 旅途中的輕鬆讀物圖靈
- 記憶體條頻率越高越好嗎 記憶體條頻率高了有什麼用記憶體
- 為什麼 Linux 需要虛擬記憶體Linux記憶體
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型