① 互聯網公司最常見的演算法面試題有哪些
很多人都搞不清辭職的流程方法,所以才會遇到這種尷尬的局面。
提出離職之前,應當先提出加薪申請。如果加薪通過,你繼續安心幹活,如果加薪申請被駁回,直接辭職信奉上,再也不要相信任何挽留的條件。
當然,你提出加薪申請的時候,千萬不要流露出老子早找好下家了,不給加薪老子就炒你魷魚這樣的表情,這對於談判沒什麼幫助。多談談自己對公司的貢獻,不要說公司之外的事情。 來自職Q用戶:蘿卜三人行
幾乎必問排序,排序演算法不下十種,不一定非要用快排,這種問題答的越多越好。 來自職Q用戶:兔小灰
② 深度學習(視覺)面試中常問的知識點有哪些
一些基礎演算法題。包含但不僅限於大學裡面ACM-ICPC競賽中的數論、圖論、數據結構、動態規劃、幾何數學等。不過鑒於很多面試官不是選手出身,所以你被問到的很可能是「Google面試題」、「Facebook面試題」、「國內某BATM面試題」之類的演算法題,你可以以這些為關鍵字上網搜搜看,或者上LeetCode之類的刷題網站(ps:我沒有用過)刷刷題找找感覺。
情景題。面試官可能會給你出一個情景題「在XXX情況下(此處省略100字),你有什麼比較好的方案」。比如說你面試的是搜索引擎,面試官就和可能和你聊一些搜索引擎的問題;比如你面試的是在線廣告競價,他可能就會和你聊一聊一些小網站裡面的小廣告;又或者你去面試游戲,可能會被問怎麼解決當攝像頭跑到牆後面時候的問題。你這里是深度學習,可能也會被問到以後這方面的情景題吧,你要准備一下。不過其實你回答不出來也沒有很大問題(如果你是校招或者剛剛轉行想做這個),這方面主要考考你的邏輯思維和口頭表達能力。
專業知識。深度學習這方面的專業知識。具體看公司要求了。如果他是想要找一些底子好的苗子自己培養,你這塊懂不懂也沒有太大關系。不過這是一個現實的社會,基本上都是要你在深度學習(視覺)方面的能力達到他們的需求的。而且我要是剛剛把你培養出來你就跳槽了那公司不就虧大了,所以現在招工基本上都要招能馬上上手的。
聊聊夢想。其實你在去面試之前,HR就可能做好了背景調查,所以你可能已經是他們想要的人了。這個時候面試官可能忽略上述條件直接和你聊生活聊理想了。這個時候要切記工資是否達到了你的要求,將來是否有長足的發展,因為如果飯都吃不飽,還談個什麼理想!不過也有可能是在測試你的溝通能力。
③ 如何准備演算法面試
主要介紹演算法面試的一些問題、以及如何准備演算法面試
!--more--
演算法面試不僅僅是正確的回答問題
對於面試中遇到的大多數問題,都能有一個合理的思考路徑
讓大家在面對面試中的演算法問題時,有一個合理的思考路徑:
不代表能夠「正確」回答每一個演算法問題,但是合理的思考方向其實更重要,也是正確完成演算法面試問題的前提
演算法面試優秀不意味著技術面試優秀
技術面試優秀不意味著能夠拿到Offer
演算法面試的目的不是給出一個「正確」答案,
而是展示給面試官你思考問題的方式。
演算法面試不是高考。
把這個過程看作是和面試官一起探討一個問題的解決方案。
對於問題的細節和應用環境,可以和面試官溝通。
這種溝通本身很重要,它暗示著你思考問題的方式。
我們需要對一組數據進行排序
設計排序介面,標准庫的設計,業務中排序演算法。
排序是基礎操作,很重要。
解決
快速排序演算法:O(nlogn)
忽略了演算法使用的基礎環境。要動態選擇。
(向面試官提問):這組數據有什麼樣的特徵?
有沒有可能包含有大量重復的元素?
如果有這種可能的話,三路快排是更好地選擇。
普通數據:普通快速排序就行了;java語言標准庫排序使用的三路快排。
是否大部分數據距離它正確的位置很近?是否近乎有序?
如果是這樣的話,插入排序是更好地選擇。
按照業務發生順序,先發生先完成,幾乎有序,插入排序是更好的選擇。
是否數據的取值范圍非常有限?比如對學生成績排序。
如果是這樣的話,計數排序是更好地選擇。高考成績取值范圍有限:計數排序更好。
(向面試官提問):對排序有什麼額外的要求?
是否需要穩定排序?
如果是的話,歸並排序是更好地選擇。
(向面試官提問):數據的存儲狀況是怎樣的?
是否是使用鏈表存儲的?
如果是的話,歸並排序是更好地選擇。
快排依賴於數組的隨機存取。
(向面試官提問):數據的存儲狀況是怎樣的?
數據的大小是否可以裝載在內存里?
數據量很大,或者內存很小,不足以裝載在內存里,需要使用外排序演算法。
有沒有可能包含有大量重復的元素?
是否大部分數據距離它正確的位置很近?是否近乎有序?
是否數據的取值范圍非常有限?比如對學生成績排序。
是否需要穩定排序?
是否是使用鏈表存儲的?
數據的大小是否可以裝載在內存里?
正確除了你能把代碼編出來運行出正確的結果。正確還包含對問題的獨到見解;優化;代碼規范;容錯性;
o 不僅僅是給出解決演算法問題的代碼,還要把上面因素包括。
o 如果是非常難的問題,對你的競爭對手來說,也是難的。
關鍵在於你所表達出的解決問題的思路。
甚至通過表達解題思路的方向,得出結論:這個問題的解決方案,應該在哪一個領域,我可以通過查閱或者進一步學習解決問題。
演算法面試只是面試的一部分
演算法面試只是技術面試的一部分。
根據你的簡歷和應聘職位的不同,勢必要考察其他技術方面。
項目經歷和項目中遇到的實際問題
o 解決能力,是否參與
o 深入思考
o 技術態度
面試前梳理自己簡歷上所寫到的項目:整理一下可能會問到的。
你遇到的印象最深的bug是什麼?
面向對象
設計模式
網路相關;安全相關;內存相關;並發相關;…
系統設計;scalability(大規模)
技術面試只是面試的一部分。面試不僅僅是考察你的技術水平,還是了解你的過去以及形成的思考行為方式。
關於過去:參與項目至關重要
工作人士
研究生
本科生
o 畢業設計
o 其他課程設計(大作業)
實習
創建自己的項目
o 自己做小應用:計劃表;備忘錄;播放器…
o 自己解決小問題:爬蟲;數據分析;詞頻統計...
o 「不是項目」的項目:一本優秀的技術書籍的代碼整理等…(github)
o 分享:自己的技術博客;github等等
通過過去了解你的思考行為方式:
遇到的最大的挑戰?
犯過的錯誤?
遭遇的失敗?
最享受的工作內容?
遇到沖突的處理方式?
做的最與眾不同的事兒?
具體闡述:我在某某項目中遇到一個怎樣的演算法問題:這個問題是怎樣的。它是我遇到的最大的挑戰,我是如何克服解決的。
整個小組的大概運行模式是怎樣的?
整個項目的後續規劃是如何的?
這個產品中的某個問題是如何解決的?
為什麼會選擇某些技術?標准?
我對某個技術很感興趣,在你的小組中我會有怎樣的機會深入這種技術?
演算法面試仍然是非常重要的一部分
如何准備演算法面試
准備面試和准備演算法面試是兩個概念
演算法面試,只是面試中的一個環節。
遠遠不需要啃完一本《演算法導論》
o 強調理論證明
o 第一遍讀不需要弄懂證明
o 前幾遍閱讀應該記住結論就行了,不需要弄懂證明。把更多的精力放在演算法思想上。
針對演算法面試,演算法導論裡面的理論推導和證明不是很重要的方面。
選擇合適的oj
leetcode
o Online Portal for IT Interview
o 真實的面試問題
o http://www.leetcode.com
HankeRank
o 特點是對於問題的分類很詳細。偏難,不過可以對某一類細分問題解決。
o http://www.hackerrank.com
在學習和實踐做題之間,要掌握平衡
基礎演算法實現與演算法思想
如何回答演算法面試問題
注意題目中的條件
o 給定一個有序數組...(二分法)
有一些題目中的條件本質是暗示
o 設計一個O(nlogn)的演算法(分治:在一顆搜索樹中完成任務,對於數據排序)
o 無需考慮額外的空間(用空間換時間上的優化)
o 數據規模大概是10000(O(n^2)就可以)
當沒有思路的時候
自己給自己幾個簡單的測試用例,試驗一下
不要忽視暴力解法。暴力解法通常是思考的起點。
例子
LeetCode 3 LongestSubstringWithout Repeating Characters
在一個字元串中尋找沒有重復字母的最長子串
如」abcabcbb」,則結果為」abc」
如」bbbbb」,則結果為」b」
對於字元串s的子串s[i...j]
使用O(n^2)的演算法遍歷i,j,可以得到所有的子串s[i...j]
使用O(length(s[i...j]))的演算法判斷s[i...j]中是否含有重復字母
三重循環:復雜度O(n^3),對於n=100的數據,可行
遍歷常見的演算法思路
遍歷常見的數據結構
空間和時間的交換(哈希表)
預處理信息(排序)
在瓶頸處尋找答案:O(nlogn)+ O(n^2); O(n^3)
o O(n^2)能否優化。
什麼樣的問題使用什麼樣的思路和數據結構。
極端條件的判斷
o 數組為空?
o 字元串為空?
o 數量為0?
o 指針為NULL?
代碼規范:
o 變數名
o 模塊化
o 復用性
④ 數據分析常見面試題有哪些
1、如何理解過擬合?
過擬合和欠擬合一樣,都是數據挖掘的基本概念。過擬合指的就是數據訓練得太好,在實際的測試環境中可能會產生錯誤,所以適當的剪枝對數據挖掘演算法來說也是很重要的。
欠擬合則是指機器學習得不充分,數據樣本太少,不足以讓機器形成自我認知。
2、為什麼說樸素貝葉斯是“樸素”的?
樸素貝葉斯是一種簡單但極為強大的預測建模演算法。之所以稱為樸素貝葉斯,是因為它假設每個輸入變數是獨立的。這是一個強硬的假設,實際情況並不一定,但是這項技術對於絕大部分的復雜問題仍然非常有效。
3、SVM 最重要的思想是什麼?
SVM 計算的過程就是幫我們找到超平面的過程,它有個核心的概念叫:分類間隔。SVM 的目標就是找出所有分類間隔中最大的那個值對應的超平面。在數學上,這是一個凸優化問題。同樣我們根據數據是否線性可分,把 SVM 分成硬間隔 SVM、軟間隔 SVM 和非線性 SVM。
4、K-Means 和 KNN 演算法的區別是什麼?
首先,這兩個演算法解決的是數據挖掘中的兩類問題。K-Means 是聚類演算法,KNN 是分類演算法。其次,這兩個演算法分別是兩種不同的學習方式。K-Means 是非監督學習,也就是不需要事先給出分類標簽,而 KNN 是有監督學習,需要我們給出訓練數據的分類標識。最後,K 值的含義不同。K-Means 中的 K 值代表 K 類。KNN 中的 K 值代表 K 個最接近的鄰居。
⑤ 做圖像類演算法面試的時候會不會面試數學
我在《再談逗我是怎麼招程序員地》中比較保守地說過,逗問難的演算法題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。地,今天,我想加強一下這個觀點——我反對純演算法題面試!(注意,我說的是純演算法題)圖片源Wikipedia(點擊圖片查看詞條)我再次引用我以前的一個觀點——能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。好了,讓我們來看一個示例(這個示例是昨天在微博上的一個討論),這個題是——逗找出無序數組中第2大的數地,幾乎所有的人都用了O(n)的演算法,我相信對於我們這些應試教育出來的人來說,不用排序用O(n)演算法是很正常的事,連我都不由自主地認為O(n)演算法是這個題的標准答案。我們太習慣於標准答案了,這是我國教育最悲哀的地方。(廣義的洗腦就是讓你的意識依賴於某個標准答案,然後通過給你標准答案讓你不會思考而控制你)功能性需求分析試想,如果我們在實際工作中得到這樣一個題 我們會怎麼做看我一定會分析這個需求,因為我害怕需求未來會改變,今天你叫我找一個第2大的數,明天你找我找一個第4大的數,後天叫我找一個第100大的數,我不搞死了。需求變化是很正常的事。分析完這個需求後,我會很自然地去寫找第K大數的演算法——難度一下子就增大了。很多人會以為找第K大的需求是一種逗過早擴展地的思路,不是這樣的,我相信我們在實際編碼中寫過太多這樣的程序了,你一定不會設計出這樣的函數介面 —— Find2ndMaxNum(int* array, int len),就好像你不會設計出 DestroyBaghdad(); 這樣的介面,而是設計一個DestoryCity( City& ); 的介面,而把Baghdad當成參數傳進去!所以,你應該是聲明一個叫FindKthMaxNum(int* array, int len, int kth),把2當成參數傳進去。這是最基本的編程方法,用數學的話來說,叫代數!最簡單的需求分析方法就是把需求翻譯成函數名,然後看看是這個介面不是很二看!(註:不要糾結於FindMaxNum()或FindMinNum(),因為這兩個函數名的業務意義很清楚了,不像Find2ndMaxNum()那麼二)非功能性需求分析性能之類的東西從來都是非功能性需求,對於演算法題,我們太喜歡研究演算法題的空間和時間復雜度了。我們希望做到空間和時間雙豐收,這是演算法學術界的風格。所以,習慣於標准答案的我們已經失去思考的能力,只會機械地思考演算法之內的性能,而忽略了演算法之外的性能。如果題目是——逗從無序數組中找到第K個最大的數地,那麼,我們一定會去思考用O(n)的線性演算法找出第K個數。事實上,也有線性演算法——STL中可以用nth_element求得類似的第n大的數,其利用快速排序的思想,從數組S中隨機找出一個元素X,把數組分為兩部分Sa和Sb。Sa中的元素大於等於X,Sb中元素小於X。這時有兩種情況:1)Sa中元素的個數小於k,則Sb中的第 k-|Sa|個元素即為第k大數;2) Sa中元素的個數大於等於k,則返回Sa中的第k大數。時間復雜度近似為O(n)。搞學術的nuts們到了這一步一定會歡呼勝利!但是他們哪裡能想得到性能的需求分析也是來源自業務的!我們一說性能,基本上是個人都會問,請求量有多大看如果我們的FindKthMaxNum()的請求量是m次,那麼你的這個每次都要O(n)復雜度的演算法得到的效果就是O(n*m),這一點,是書獃子式的學院派人永遠想不到的。因為應試教育讓我們不會從實際思考了。工程式的解法根據上面的需求分析,有軟體工程經驗的人的解法通常會這樣:1)把數組排序,從大到小。2)於是你要第k大的數,就直接訪問 array[k]。排序只需要一次,O(n*log(n)),然後,接下來的m次對FindKthMaxNum()的調用全是O(1)的,整體復雜度反而成了線性的。其實,上述的還不是工程式的最好的解法,因為,在業務中,那數組中的數據可能會是會變化的,所以,如果是用數組排序的話,有數據的改動會讓我重新排序,這個太耗性能了,如果實際情況中會有很多的插入或刪除操作,那麼可以考慮使用B+樹。工程式的解法有以下特點:1)很方便擴展,因為數據排好序了,你還可以方便地支持各種需求,如從第k1大到k2大的數據(那些學院派寫出來的代碼在拿到這個需求時又開始撓頭苦想了)2)規整的數據會簡化整體的演算法復雜度,從而整體性能會更好。(公欲善其事,必先利其器)3)代碼變得清晰,易懂,易維護!(學院派的和STL一樣的近似O(n)復雜度的演算法沒人敢動)爭論你可能會和我有以下爭論,如果程序員做這個演算法題用排序的方式,他一定不會像你想那麼多。是的,你說得對。但是我想說,很多時候,我們直覺地思考,恰恰是正確的路。因為逗排序地這個思路符合人類大腦處理問題的方式,而使用學院派的方式是反大腦直覺的。反大腦直覺的,通常意味著晦澀難懂,維護成本上升。就是一道面試題,我就是想測試一下你的演算法技能,這也扯太多了。沒問題,不過,我們要清楚我們是在招什麼人看是一個只會寫演算法的人,還是一個會做軟體的人看這個只有你自己最清楚。這個演算法題太容易誘導到學院派的思路了。是的這道逗找出第K大的數地,其實可以變換為更為業務一點的題目——逗我要和別的商戶競價,我想排在所有競爭對手報價的第K名,請寫一個程序,我輸入K,和一個商品名,系統告訴我應該訂多少價看(商家的所有商品的報價在一數組中)地——業務分析,整體性能,演算法,數據結構,增加需求讓應聘者重構,這一個問題就全考了。你是不是在說演算法不重要,不用學看千萬別這樣理解我,搞得好像如果面試不面,我就可以不學。演算法很重要,演算法題能鍛煉我們的思維,而且也有很多實際用處。我這篇文章不是讓大家不要去學演算法,這是完全錯誤的,我是讓大家帶著業務問題去使用演算法。問你業務問題,一樣會問到演算法題上來。小結看過這上面的分析,我相信你明白我為什麼反對純演算法面試題了。原因就是純演算法的面試題根本不能反應一個程序的綜合素質!那麼,在面試中,我們應該要考量程序員的那些綜合素質呢看我以為有下面這些東西:會不會做需求分析看怎麼理解問題的看解決問題的思路是什麼看想法如何看會不會對基礎的演算法和數據結構靈活運用看另外,我們知道,對於軟體開發來說,在工程上,難是的下面是這些挑戰:軟體的維護成本遠遠大於軟體的開發成本。軟體的質量變得越來越重要,所以,測試工作也變得越來越重要。軟體的需求總是在變的,軟體的需求總是一點一點往上加的。程序中大量的代碼都是在處理一些錯誤的或是不正常的流程。所以,對於編程能力上,我們應該主要考量程序員的如下能力:設計是否滿足對需求的理解,並可以應對可能出現的需求變化。
⑥ 計算機視覺演算法工程師筆試主要什麼內容
你好,領學網為你解答:
計算機視覺部分:
1、考察特徵點匹配演算法,輸入兩幅圖像中的特徵點對,輸出匹配的特徵點對,(128維描述子)距離計算函數已給出無需考慮復雜度。編寫偽代碼,分析演算法復雜度;
2、考察圖像旋轉。左邊圖像時旋轉一定角度後的圖像(有黑邊),右邊為正常圖像。已知兩幅圖像都為WxH,以及左圖像與四邊的切點A1A2A3A4,設計旋轉演算法使左圖像變換矯正成右圖像,編寫偽代碼,分析演算法復雜度及優缺點;
3、主要考察雙目視覺中的標定知識。給出了雙目視覺的成像原理圖及相關定理和表達。第一小題,需要證明x'Fx=0 x'x為左右圖像中的匹配點對,並要求給出F矩陣的秩;第二小題要求推導出最少可由多少對左右圖像中匹配點可以推導出F矩陣;
4、要求寫出圖像處理和計算機視覺在無人飛行器中的3個重要應用。給出理由和解決方案並分析。
圖像處理部分:
1、主要考察一維中值濾波,退化為區間濾波 編寫偽代碼,分析演算法復雜度;
2、主要考察二維中值濾波,編寫偽代碼,分析演算法復雜度;
3、如何去除脈沖雜訊,圖像中有大量隨機產生的255和0雜訊;
4、考察加權中值濾波公式推導以及一維加權中值濾波
控制部分:
對象舉例均為四旋翼無人飛行器,各題目要求設計控制器,給出控制率,還有觀測方案設計等等;有一題比較簡單就是說明PID的各部分含義以及如何調節。
希望幫到你!
⑦ 演算法面試
我在《再談「我是怎麼招程序員」》中比較保守地說過,「問難的演算法題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。」,今天,我想加強一下這個觀點——我反對純演算法題面試!(注意,我說的是純演算法題)圖片源Wikipedia(點擊圖片查看詞條)我再次引用我以前的一個觀點——能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。好了,讓我們來看一個示例(這個示例是昨天在微博上的一個討論),這個題是——「找出無序數組中第2大的數」,幾乎所有的人都用了O(n)的演算法,我相信對於我們這些應試教育出來的人來說,不用排序用O(n)演算法是很正常的事,連我都不由自主地認為O(n)演算法是這個題的標准答案。我們太習慣於標准答案了,這是我國教育最悲哀的地方。(廣義的洗腦就是讓你的意識依賴於某個標准答案,然後通過給你標准答案讓你不會思考而控制你)功能性需求分析試想,如果我們在實際工作中得到這樣一個題 我們會怎麼做?我一定會分析這個需求,因為我害怕需求未來會改變,今天你叫我找一個第2大的數,明天你找我找一個第4大的數,後天叫我找一個第100大的數,我不搞死了。需求變化是很正常的事。分析完這個需求後,我會很自然地去寫找第K大數的演算法——難度一下子就增大了。很多人會以為找第K大的需求是一種「過早擴展」的思路,不是這樣的,我相信我們在實際編碼中寫過太多這樣的程序了,你一定不會設計出這樣的函數介面 —— Find2ndMaxNum(int* array, int len),就好像你不會設計出 DestroyBaghdad(); 這樣的介面,而是設計一個DestoryCity( City& ); 的介面,而把Baghdad當成參數傳進去!所以,你應該是聲明一個叫FindKthMaxNum(int* array, int len, int kth),把2當成參數傳進去。這是最基本的編程方法,用數學的話來說,叫代數!最簡單的需求分析方法就是把需求翻譯成函數名,然後看看是這個介面不是很二?!(註:不要糾結於FindMaxNum()或FindMinNum(),因為這兩個函數名的業務意義很清楚了,不像Find2ndMaxNum()那麼二)非功能性需求分析性能之類的東西從來都是非功能性需求,對於演算法題,我們太喜歡研究演算法題的空間和時間復雜度了。我們希望做到空間和時間雙豐收,這是演算法學術界的風格。所以,習慣於標准答案的我們已經失去思考的能力,只會機械地思考演算法之內的性能,而忽略了演算法之外的性能。如果題目是——「從無序數組中找到第K個最大的數」,那麼,我們一定會去思考用O(n)的線性演算法找出第K個數。事實上,也有線性演算法——STL中可以用nth_element求得類似的第n大的數,其利用快速排序的思想,從數組S中隨機找出一個元素X,把數組分為兩部分Sa和Sb。Sa中的元素大於等於X,Sb中元素小於X。這時有兩種情況:1)Sa中元素的個數小於k,則Sb中的第 k-|Sa|個元素即為第k大數;2) Sa中元素的個數大於等於k,則返回Sa中的第k大數。時間復雜度近似為O(n)。搞學術的nuts們到了這一步一定會歡呼勝利!但是他們哪裡能想得到性能的需求分析也是來源自業務的!我們一說性能,基本上是個人都會問,請求量有多大?如果我們的FindKthMaxNum()的請求量是m次,那麼你的這個每次都要O(n)復雜度的演算法得到的效果就是O(n*m),這一點,是書獃子式的學院派人永遠想不到的。因為應試教育讓我們不會從實際思考了。工程式的解法根據上面的需求分析,有軟體工程經驗的人的解法通常會這樣:1)把數組排序,從大到小。2)於是你要第k大的數,就直接訪問 array[k]。排序只需要一次,O(n*log(n)),然後,接下來的m次對FindKthMaxNum()的調用全是O(1)的,整體復雜度反而成了線性的。其實,上述的還不是工程式的最好的解法,因為,在業務中,那數組中的數據可能會是會變化的,所以,如果是用數組排序的話,有數據的改動會讓我重新排序,這個太耗性能了,如果實際情況中會有很多的插入或刪除操作,那麼可以考慮使用B+樹。工程式的解法有以下特點:1)很方便擴展,因為數據排好序了,你還可以方便地支持各種需求,如從第k1大到k2大的數據(那些學院派寫出來的代碼在拿到這個需求時又開始撓頭苦想了)2)規整的數據會簡化整體的演算法復雜度,從而整體性能會更好。(公欲善其事,必先利其器)3)代碼變得清晰,易懂,易維護!(學院派的和STL一樣的近似O(n)復雜度的演算法沒人敢動)爭論你可能會和我有以下爭論,如果程序員做這個演算法題用排序的方式,他一定不會像你想那麼多。是的,你說得對。但是我想說,很多時候,我們直覺地思考,恰恰是正確的路。因為「排序」這個思路符合人類大腦處理問題的方式,而使用學院派的方式是反大腦直覺的。反大腦直覺的,通常意味著晦澀難懂,維護成本上升。就是一道面試題,我就是想測試一下你的演算法技能,這也扯太多了。沒問題,不過,我們要清楚我們是在招什麼人?是一個只會寫演算法的人,還是一個會做軟體的人?這個只有你自己最清楚。這個演算法題太容易誘導到學院派的思路了。是的這道「找出第K大的數」,其實可以變換為更為業務一點的題目——「我要和別的商戶競價,我想排在所有競爭對手報價的第K名,請寫一個程序,我輸入K,和一個商品名,系統告訴我應該訂多少價?(商家的所有商品的報價在一數組中)」——業務分析,整體性能,演算法,數據結構,增加需求讓應聘者重構,這一個問題就全考了。你是不是在說演算法不重要,不用學?千萬別這樣理解我,搞得好像如果面試不面,我就可以不學。演算法很重要,演算法題能鍛煉我們的思維,而且也有很多實際用處。我這篇文章不是讓大家不要去學演算法,這是完全錯誤的,我是讓大家帶著業務問題去使用演算法。問你業務問題,一樣會問到演算法題上來。小結看過這上面的分析,我相信你明白我為什麼反對純演算法面試題了。原因就是純演算法的面試題根本不能反應一個程序的綜合素質!那麼,在面試中,我們應該要考量程序員的那些綜合素質呢?我以為有下面這些東西:會不會做需求分析?怎麼理解問題的?解決問題的思路是什麼?想法如何?會不會對基礎的演算法和數據結構靈活運用?另外,我們知道,對於軟體開發來說,在工程上,難是的下面是這些挑戰:軟體的維護成本遠遠大於軟體的開發成本。軟體的質量變得越來越重要,所以,測試工作也變得越來越重要。軟體的需求總是在變的,軟體的需求總是一點一點往上加的。程序中大量的代碼都是在處理一些錯誤的或是不正常的流程。所以,對於編程能力上,我們應該主要考量程序員的如下能力:設計是否滿足對需求的理解,並可以應對可能出現的需求變化。
⑧ 諾瓦星雲演算法圖像工程師面試好過沒
好過。
1、諾瓦星雲演算法圖像工程師的面試首先是電話面試,回答一些基本問題。
2、然後是自我介紹和最後的反問,真正的面試時間就十幾分鍾,側重點在項目上,沒有關於通用能力的問題,所以好過。
⑨ AI面試題第二彈(神經網路基礎)
提取主要特徵,減小網路參數量,減小計算量
層層傳遞的梯度>1 梯度爆炸
層層傳遞的梯度<1 梯度消失
與權重有很大關系,激活函數的影響較小。
每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層「預訓練」(pre-training);在預訓練完成後,再對整個網路進行「微調」(fine-tunning)。Hinton在訓練深度信念網路(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP演算法對整個網路進行訓練。
這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個范圍之內。這可以防止梯度爆炸。
比較常見的是l1l1l1正則,和l2l2l2正則,在各個深度框架中都有相應的API可以使用正則化
反向傳播中,經過每一層的梯度會乘以該層的權重。
舉個簡單例子:
為了得到一致假設而使假設變得過度復雜稱為過擬合(overfitting), 過擬合表現在訓練好的模型在訓練集上效果很好,但是在測試集上效果差 。也就是說模型的泛化能力弱。
過擬合主要由兩個原因造成,數據集太小或模型太復雜
(1). 數據集擴增(Data Augmentation)
(2). 改進模型
·Early Stopping。在模型效果比較好的時候便提前停止訓練
·正則化(regularization)
L1:稀疏參數
L2:更小參數
·Dropout
·多任務學習
深度學習中兩種多任務學習模式:隱層參數的硬共享和軟共享
硬共享機制是指在所有任務中共享隱藏層,同時保留幾個特定任務的輸出層來實現。硬共享機制降低了過擬合的風險。多個任務同時學習,模型就越能捕捉到多個任務的同一表示,從而導致模型在原始任務上的過擬合風險越小。
軟共享機制是指每個任務有自己的模型,自己的參數。模型參數之間的距離是正則化的,以便保障參數相似性。
見後文
leaky relu
輸入是x輸出是y,正常的流程是:我們首先把x通過網路前向傳播,然後把誤差反向傳播以決定如何更新參數讓網路進行學習。使用Dropout之後,過程變成如下:
(1)首先隨機(臨時)刪掉網路中一半的隱藏神經元,輸入輸出神經元保持不變(圖中虛線為部分臨時被刪除的神經元)
(2) 然後把輸入x通過修改後的網路前向傳播,然後把得到的損失結果通過修改的網路反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b)。
(3)然後繼續重復這一過程:
恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)
從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數)。
對一小批訓練樣本,先前向傳播然後反向傳播損失並根據隨機梯度下降法更新參數(w,b) (沒有被刪除的那一部分參數得到更新,刪除的神經元參數保持被刪除前的結果)。
不斷重復這一過程。
沒有對數據進行歸一化
忘記檢查輸入和輸出
沒有對數據進行預處理
沒有對數據正則化
使用過大的樣本
使用不正確的學習率
在輸出層使用錯誤的激活函數
網路中包含壞梯度
初始化權重錯誤
過深的網路
隱藏單元數量錯誤
網路設計不合理(任務-網路不匹配)
機器學習有個很重要的假設:就是假設訓練數據和測試數據是滿足獨立同分布的,這保障了通過訓練數據獲得的優秀模型也能夠在測試集獲得好的效果。但是在機器學習訓練中輸入層的每個批量(X,Y)中X的分布是不一致的,並且神經網路的隱藏層的輸入分布在每次訓練迭代中發生變化。 BatchNorm就是在深度神經網路訓練過程中使得每一層神經網路的輸入保持相同分布的。
BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前(激活前)的 輸入值 (就是那個x=WU+B,U是輸入) 隨著網路深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近 (對於Sigmoid函數來說,意味著激活輸入值WU+B是大的負值或正值),所以這 導致反向傳播時低層神經網路的梯度消失 ,這是訓練深層神經網路收斂越來越慢的 本質原因 , 而BN就是通過一定的規范化手段,把每層神經網路任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布 ,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是 這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。
但是接下來的問題是:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了,意味著網路的非線性表達能力下降了, 所以BN為了保證非線性的獲得,對變換後的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift), 每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於激活前的值經過標准正太分布歸一化後再從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網路收斂速度太慢
Batch Normalization 好處:(1)提高了訓練速度,收斂速度也大大加快(2)另外調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等 (3)可以防止梯度消失(4)BN類似於Dropout的一種防止過擬合的正則化表達方式,可以有效防止過擬合,不用太依賴dropou和正則化
以下情況最好不要使用BN:(1)數據不平衡(2)batch_size太小
batch_size是機器學習中的一個重要參數,決定了梯度下降的方向,如果數據集比較小,完全可以採用全數據集的形式計算梯度,由全數據集確定的梯度方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。對於大型數據集則需要使用mini-batch_size,因為隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。
當batch_size=1,即在線學習,模型難以達到收斂 。
合理增加batch_size好處 :
(1)內存利用率提高了,大矩陣乘法的並行化效率提高
(2)跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
(3)在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小
盲目增大 Batch_Size 壞處 :
(1)內存利用率提高了,但是內存容量可能撐不住了
(2)跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同精度所需要的 epoch 數量越來越多,花費的時間越長
(3)大的batchsize收斂到sharp minimum,而小的batchsize收斂到flat minimum,後者具有更好的泛化能力。
總之batchsize在變得很大(超過一個臨界點)時,會降低模型的泛化能力。在這個臨界點之下,模型的性能變換隨batch size通常沒有學習率敏感
目標所在的真實框(ground truth) 與演算法預測的目標所在的框(bounding box)的交集與並集的比值,我們會用IOU閾值來判定預測的bounding box是否有效。一般閾值會設定在0.5,當IOU的值大於等於0.5時,我們會把這個預測的bounding box 歸為正類,而小於0.5的歸為負類。
牛頓法使用的是目標函數的二階導數,在高維情況下這個Hessian(n*n維度)矩陣非常大,計算復雜度是n*n,計算和存儲都是問題
(1) 通過控制卷積核個數實現升維或者降維,從而減少模型參數和計算量
(2) 用於不同channel上特徵的融合
(3)1x1的卷積相當於全連接層的計算過程,並且加入了非線性激活函數,從而增加了網路的非線性,使得網路可以表達更加復雜的特徵。
它能夠把輸入的連續實值變換為0和1之間的輸出,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1
缺點:
(1)函數的飽和區,導致梯度幾乎為0,造成梯度消失問題
(2)Sigmoid 的 output 不是0均值,具體解釋見 https://blog.csdn.net/tyhj_sf/article/details/79932893
(3)其解析式中含有冪運算,計算機求解時相對來講比較耗時。對於規模比較大的深度網路,這會較大地增加訓練時間。
它解決了Sigmoid函數的不是零均值輸出問題,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。
(1)在正區間解決了梯度消失的問題
(2)函數簡單,計算速度快,收斂速度遠快於sigmoid和tanh
缺點:
(1)Relu函數輸出不是0均值
(2)神經元壞死問題:指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新,有兩個主要原因導致這種狀況發生
(1) 非常不幸的參數初始化,這種情況比較少見
(2) learning rate太高導致在訓練過程中參數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的演算法
為了解決ReLU函數帶來的神經元壞死問題 , 提出了將ReLU的前半段設為αx,α通常設為0.01,,另外一種直觀的想法是基於參數的方法PReLU函數, α可由方向傳播演算法學習出來。
ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:(1)不會有神經元壞死現象(2)函數輸出均值接近於0
但是ELU的小問題就是計算量稍微有點大。
1、使用不同的激活函數,比如Relu,Leak-Relu,PRelu,elu等激活函數代替sigmoid函數
2、使用Batch Normalizaion(批量歸一化)
3、使用殘差網路
4、預訓練加微調
1、梯度裁剪
2、權重正則化
兩個3x3的卷積核的感受野比5x5的卷積核的感受野大,在保持相同感受野的同時,用3x3的卷積核可以提升網路的深度,可以很明顯的減少計算量。
1、局部連接
2、權值共享:減小參數量
3、池化操作:增大感受野
4、多層次結構:可以提取low-level以及high-level的信息
1、數據集太小,數據樣本不足時,深度學習相對其它機器學習演算法,沒有明顯優勢。
2、數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單片語合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習演算法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。
作用 :對輸入的特徵圖進行壓縮,
一方面使特徵圖變小,簡化網路計算復雜度;
一方面進行特徵壓縮,提取主要特徵。
通常來講,max-pooling的效果更好,雖然max-pooling和average-pooling都對數據做了下采樣,但是 max-pooling感覺更像是做了特徵選擇,選出了分類辨識度更好的特徵,提供了非線性 。 pooling的主要作用一方面是去掉冗餘信息,一方面要保留feature map的特徵信息,在分類問題中,我們需要知道的是這張圖像有什麼object,而不大關心這個object位置在哪,在這種情況下顯然max pooling比average pooling更合適。在 網路比較深的地方,特徵已經稀疏了,從一塊區域里選出最大的,比起這片區域的平均值來,更能把稀疏的特徵傳遞下去 。
average-pooling更強調對整體特徵信息進行一層下采樣,在減少參數維度的貢獻上更大一點,更多的體現在 信息的完整傳遞這個維度 上,在一個很大很有代表性的模型中,比如說DenseNet中的模塊之間的連接大多採用average-pooling,在減少維度的同時,更有利信息傳遞到下一個模塊進行特徵提取。
average-pooling在 全局平均池化操作 中應用也比較廣,在ResNet和Inception結構中最後一層都使用了平均池化。有的時候在模型接近 分類器的末端使用全局平均池化還可以代替Flatten操作 ,使輸入數據變成一位向量。
CNN網路中另外一個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化(步長也為2),假設那麼第l+1層的feature map有16個梯度,那麼第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把 某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變 ,圖示如下 :
(2) max pooling
max pooling也要滿足梯度之和不變的原則 ,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼 反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。 所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id,這個變數就是記錄最大值所在位置的,因為在反向傳播中要用到,那麼假設前向傳播和反向傳播的過程就如下圖所示 :
28、細粒度分類
29、LSTM&RNN
30、解釋LSTM結構(相對於RNN)的好處
31、RNN的梯度消失原因和解決辦法
32、Object Detection
33、Unet的介紹
34、FCN和Unet的區別
35、RCNN系列的演算法流程和區別
36、Fast RCNN中 bbox 回歸的損失函數什麼
37、解釋 ROI Pooling 和 ROI Align
38、Mask RCNN中 mask branch 如何接入 Faster RCNN中
39、解釋 FPN
40、解釋 ROI Align
41、簡述 YOLO 和 SSD
42、簡述 Hough 直線檢測、Sobel 邊緣檢測演算法流程
43、Mask RCNN中的anchors如何判定為正負樣本
44、簡述 NMS 演算法流程
45、attention起源是用在哪裡?pixel還是frame,是soft還是hard
46、anchor的正負樣本比是多少
47、演算法和激活函數等
48、BN的原理和作用
49、BN層反向傳播,怎麼求導
50、BN 的作用和缺陷,以及針對batch_size小的情況的改進(GN)
51、BN層,先加BN還是激活,有什麼區別
52、手推BP
53、優化演算法舉例和他們的區別(SGD、SGDM、RMSprop、Adam)
54、隨機梯度下降和梯度下降
55、訓練不收斂的原因有哪些
56、簡述 SVM 流程、核函數尋參及常見的核函數舉例
57、batch_size 和 learning rate 的關系(怎麼平衡和調整二者)
58、解釋過擬合和欠擬合,以及解決方法
59、激活函數有哪些,各自區別
60、損失函數有哪些
61、Sigmoid 和 ReLu 對比(各自優缺點)
62、為什麼不用sigmoid而用relu?做出了哪些改進?
63、梯度消失和梯度爆炸的原因和解決方法
64、Precision 和 Recall 的定義
65、精確率高、召回率低是為什麼
66、SVM,線性回歸和邏輯回歸的原理及區別
67、PCA原理,PCA和SVD的區別和聯系
68、正則化怎麼選擇,有哪些方式
69、L1、L2范數,區別
70、boost、Adaboost
71、dropout和batch normalization
72、講一下決策樹和隨機森林
73、講一下GBDT的細節,寫出GBDT的目標函數。 GBDT和Adaboost的區別與聯系
74、偏差、方差
75、距離度量公式哪些,區別
76、多標簽識別怎麼做
77、data argumentation怎麼處理的
78、數據不均衡怎麼處理、只有少量帶標簽怎麼處理
79、權重初始化方法都有哪些
80、權值衰減這個參數怎麼設置
81、分類問題有哪些評價指標?每種的適用場景。
82、無監督學習了解哪些
83、圖像處理Opencv
84、邊緣檢測運算元有哪些
85、霍夫變換
86、直方圖是什麼
87、canny運算元是怎麼做的
88、圖像的特徵提取有哪些演算法,適用范圍、優缺點
參考:
https://blog.csdn.net/bluesliuf/article/details/89389117
https://zhuanlan.hu.com/p/107279000
https://zhuanlan.hu.com/p/56475281
⑩ android 面試,演算法題。
final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}
不知道你是不是這個意思。