導航:首頁 > 源碼編譯 > c面試演算法題

c面試演算法題

發布時間:2023-03-30 01:43:26

Ⅰ C語言題目,因為是初學者,寫出解題過程及原因,謝謝了!

、我們要正確認識c語言,到底值得學嗎?答案是肯定的。
學習它是個長期的過程,要不斷的總結經驗,我們學習就怕不能持之以恆。關於這點大家比我更清楚。一旦你學會了它,其他的語言就可以觸類旁通了,例如:C++,C#,JAVA,VB,DELPHI......這些學起來就會比那些C語言基礎不扎實的人要輕松得許多!
學習C語言始終要記住「曙光在前頭」和「千金難買回頭看」,「千金難買回頭看」是學習知識的重要方法,就是說,學習後面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識,這是我們學生最不易做到的,然而卻又是最重要的。比如:在C語言中最典型的是關於結構化程序設計構思,不管是那種教材,一開始就強調這種方法,這時也許你不能充分體會,但是學到函數時,再回頭來仔細體會,溫故知新,理解它就沒有那麼難了。學習C語言就是要經過幾個反復,才能前後貫穿,積累應該掌握的C知識。
那麼,我們如何學好《C程序設計》呢?
一.學好C語言的運算符和運算順序
這是學好《C程序設計》的基礎,C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。在學習中,只要我們對此合理進行分類,找出它們與我們在數學中所學到運算之間的不同點之後,記住這些運算也就不困難了,有些運算符在理解後更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。
先要明確運算符按優先順序不同分類,《C程序設計》運算符可分為15種優先順序,從高到低,優先順序為1 ~ 15,除第2、3級和第14級為從右至左結合外,其它都是從左至右結合,它決定同級運算符的運算順序。下面我們通過幾個例子來說明:
(1) 5*8/4%10 這個表達式中出現3種運算符,是同級運算符,運算順序按從左至右結合,因此先計算5 *8=40,然後被4除,結果為10,最後是%(求余數)運算,所以表達式的最終結果為10%10 = 0;
(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;
對於c=++a*b來說,按表中所列順序,+ +先執行,*後執行,所以+ + a執行後,a的值為4,由於+ +為前置運算,所以a的值4參與運算,C的值計算式為4*5=20而不是3*5=15了;而對於d=a++*b來說,由於a + +為後置運算,所以a值為4參與運算,使得d的值仍為20,而a參與運算後其值加1,值為5。 這個例子執行後亂灶首,a的值為5,b的值為5,c的值為20,d的值也是20;
(3)(a = 3,b = 5,b+ = a,c = b* 5)
例子中的「,」是逗號結合運算,上式稱為逗號表達式,自左向右結合,最後一個表達式的結果值就是逗號表達式的結果,所以上面的逗號表達式結果為40,a的值為3,b的值為8,c的值為40。
(4)a=5;b=6;c=a>b?a:b;
例中的a>b?a:b是一個三目運算,它的功能是先做關系運算a>b部分,若結果為真,則取問號後a的值,否則取冒號後b的值,因此c的值應該為6,這個運算可嘩數以用來代替if…else…語句的簡單應用辯轎。
二.學好C語言的四種程序結構
(1)順序結構
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
例如;a = 3,b = 5,現交換a,b的值,這個問題就好象交換兩個杯子水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正確的程序為: c = a; a = b; b = c; 執行結果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。 順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結構,例如計算圓的面積,其程序的語句順序就是輸入圓的半徑r,計算s = 3.14159*r*r,輸出圓的面積s。不過大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的復合語句、循環結構中的循環體等。
(2) 分支結構
順序結構的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。對於要先做判斷再選擇的問題就要使用分支結構。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。分支結構適合於帶有邏輯或關系比較等條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然後根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪制的程序執行流程圖。
學習分支結構不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執行的功能,嵌套結構也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結構。
①if(條件)
{
分支體
}
這種分支結構中的分支體可以是一條語句,此時「」可以省略,也可以是多條語句即復合語句。它有兩條分支路徑可選,一是當條件為真,執行分支體,否則跳過分支體,這時分支體就不會執行。如:要計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0) x=-x;
②if(條件)

else

這是典型的分支結構,如果條件成立,執行分支1,否則執行分支2,分支1和分支2都可以是1條或若干條語句構成。如:求ax^2+bx+c=0的根
分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復根。其程序段如下:

d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(「x1=%8.4f,x2=%8.4f\n」,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(「x1=%8.4f+%8.4fi\n」r, i);
printf(「x2=%8.4f-%8.4fi\n」r,i)
}
③嵌套分支語句:其語句格式為:
if(條件1) ;
else if(條件2)
else if(條件3)
……
else if(條件n)
else
嵌套分支語句雖可解決多個入口和出口的問題,但超過3重嵌套後,語句結構變得非常復雜,對於程序的閱讀和理解都極為不便,建議嵌套在3重以內,超過3重可以用下面的語句。
④switch開關語句:該語句也是多分支選擇語句,到底執行哪一塊,取決於開關設置,也就是表達式的值與常量表達式相匹配的那一路,它不同if…else 語句,它的所有分支都是並列的,程序執行時,由第一分支開始查找,如果相匹配,執行其後的塊,接著執行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。這個語句在應用時要特別注意開關條件的合理設置以及break語句的合理應用。
(3)循環結構:
循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段演算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即goto循環、while循環、do –while循環和for循環。四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程序的順序經常會給程序的運行帶來不可預料的錯誤,在學習中我們主要學習while、do…while、for三種循環。常用的三種循環結構學習的重點在於弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環的格式和執行順序,將每種循環的流程圖理解透徹後就會明白如何替換使用,如把while循環的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。特別要注意在循環體內應包含趨於結束的語句(即循環變數值的改變),否則就可能成了一個死循環,這是初學者的一個常見錯誤。
在學完這三個循環後,應明確它們的異同點:用while和do…while循環時,循環變數的初始化的操作應在循環體之前,而for循環一般在語句1中進行的;while 循環和for循環都是先判斷表達式,後執行循環體,而do…while循環是先執行循環體後判斷表達式,也就是說do…while的循環體最少被執行一次,而while 循環和for就可能一次都不執行。另外還要注意的是這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與if構成的循環,是不能用break和 continue語句進行控制的。
順序結構、分支結構和循環結構並不彼此孤立的,在循環中可以有分支、順序結構,分支中也可以有循環、順序結構,其實不管哪種結構,我們均可廣義的把它們看成一個語句。在實際編程過程中常將這三種結構相互結合以實現各種演算法,設計出相應程序,但是要編程的問題較大,編寫出的程序就往往很長、結構重復多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設計成模塊化結構。
(4)模塊化程序結構
C語言的模塊化程序結構用函數來實現,即將復雜的C程序分為若干模塊,每個模塊都編寫成一個C函數,然後通過主函數調用函數及函數調用函數來實現一大型問題的C程序編寫,因此常說:C程序=主函數+子函數。 因些,對函數的定義、調用、值的返回等中要尤其注重理解和應用,並通過上機調試加以鞏固。
三.掌握一些簡單的演算法
編程其實一大部分工作就是分析問題,找到解決問題的方法,再以相應的編程語言寫出代碼。這就要求掌握演算法,根據我們的《C程序設計》教學大綱中,只要求我們掌握一些簡單的演算法,在掌握這些基本演算法後,要完成對問題的分析就容易了。如兩個數的交換、三個數的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些演算法的內在含義,其中選擇法排序和冒泡法排序稍難,但只要明白排序的具體過程,對代碼的理解就不難了。如用選擇法對10個不同整數排序(從小到大),選擇法排序思路:設有10個元素a[1]~a[10],將a[1]與a[2]~a[10]比較,若a[1]比a[2]~a[10]都小,則不進行交換,即無任何操作;若a[2]~a[10] 中有一個比a[1]小,則將其中最大的一個(假設為a)與a[1]交換,此時a[1]中存放了10個中最小的數。第二輪將a[2]與a[3]~a[10]比較,將剩下9個數中的最小者a與a[2]交換,此時a[2] 中存放的10個數中第2小的數;依此類推,共進行9輪比較,a[1]到a[10]就已按從小到大的順序存放。即每一輪都找出剩下數中的最小一個,代碼如下:
for(i=1;i<=9;i++)
for(j=i+1;j<=10;j++)
if(a>a[j]
{temp=a;
a=a[j];
a[j]=temp;
}
結語:當我們把握好上述幾方面後,只要同學們能克服畏難、厭學、上課能專心聽講,做好練習與上機調試,其實C語言並不難學。
回答者:DragonKiss123 - 助理 三級 4-4 16:24

提問者對於答案的評價:
謝謝你了,你說的和我們老師講的很像,不過看了你的知道我明白了很多
您覺得最佳答案好不好? 目前有 5 個人評價

100% (5)
0% (0)

Ⅱ 求《妙趣橫生的演算法(C語言實現第2版)》全文免費下載百度網盤資源,謝謝~

《妙趣橫生的演算法(C語言實現第2版)》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1CdeYYmFNRuNn8QwWP35gzA

?pwd=namn 提取碼: namn
簡介:《妙趣橫生的演算法(C語言實現 第2版)》是深受廣大讀者好評的《妙趣橫生的演算法(C語言實現)》一書的全新升級版。本書在第1版的基礎上對原書內容做了大量的調整和補充,並將書中的實例代碼在Visual Studio 2010環境下重新編譯通過,以適應當前技術的發展和閱讀需求。本書內容涵蓋了演算法入門的必備基礎知識和大量的趣味演算法題、面試題和ACM競賽題等。通過學習本書內容,可以開闊讀者的視野,幫助讀者理解演算法,提高編程興趣和能力,並提高C語言編程能力,還可以讓讀者了解IT面試中的常見演算法題及編程競賽中的相關知識。另外,本書提供了5.5小時配套教學視頻和實例源代碼,以提高讀者的學習效率。

Ⅲ c++演算法問題(圍圈,數數退出)

約瑟夫問題(一)
這旅肢是17世紀的法國數學家加斯帕在《數目的游戲問題》中講的一個故事:15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了一個辦法:30個人圍成一圓圈,從第一個人開始依次報數,每數到第九個人就將他扔入大海,如此循環進行直到僅餘15個人為止。問怎樣排法,才能使每次投入大海的都是非教徒。
*問題分析與演算法設計
約瑟夫問題並不難,但求解的方法很多;題目的變化形式也很多。這里給出一種實現方法。
題目中30個人圍成一圈,因而啟發我們用一個循環的鏈來表示。可以使用結構數組來構慶鎮豎成一個循環鏈。結構中有兩個成員,其一為指向下一個人的指針,以構成環形的鏈;其二為該人是否被扔下海的標記,為1表示還在船上。從第一個人開始對還未扔下海的人進行計數,每數到9時,將結構中的標記改為0,表示該人已被扔下海了。這樣循環計數直到有15個人被扔下海為止。這個是願意。

現在的衍生問題

就是說有n個人圍成一圈,然後說從任意指定的一個
人那裡為起點,以m個人為單位,每轉m個人第m個人被殺死。當起始人也就是所謂的
第1個人是最後被殺死的,這個m就是為所求,滿足這樣就叫joseph問題。

然後帶一個超叼的遞歸實現

#include<iostream.h>
#include<stdlib.h>
void make(int *base,int n,int pos,int c,int m)//參數的意義。base數組名,n數組長度。pos跑格譽大的一個東西。c計算次數的。m每次跑路的長度。
{
int j=0;
cout<<"NO. "<<++c<<" 第"<<pos+1<<"位出列"<<endl;//輸出
base[pos]=0;//踢掉
if(c==n)return; //出口
while(j-m)if(base[pos=(pos+1)%n])j++;//遞歸點 ,每次數到幾這個3就改到幾
make(base,n,pos,c,m);//遞歸
}
int main()
{
int n,m,c=0,pos;//從N開始數,則把pos改為N-1就行了.
cout<<"請輸入總人數"<<endl;
cin>>n;
cout<<"請輸入要隔幾個人:"<<endl;
cin>>m;
int *base=new int[n];
for(int i=0;i<n;i++)base[i]=1;
pos=m-1;
make(base,n,pos,c,m);
delete[]base;
system("PAUSE");
return 0;
}

Ⅳ 請問大學學習數據結構與演算法(C語言版)需要多強的C語言基礎

李明傑老師:每周一道演算法題 通關演算法面試課(超清視頻)網路網盤

鏈接: https://pan..com/s/14GZpVf03Mf9E-YnMrrR4Pw

提取碼: 5dmc 復制這段內容後打開網路網盤手機App,操作更方便哦

若資源有問題歡迎追問~

Ⅳ 阿裡面試演算法題合集二

地上有一個m行n列的方格,從坐標 [0,0] 到坐標 [m-1,n-1] 。一個機器人從坐標 [0, 0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標和列坐標的數位之和大於k的格子。例如,當k為18時,機器人能夠進入方格 [35, 37] ,因為3+5+3+7=18。但它不能進入方格 [35, 38],因為3+5+3+8=19。請問該機器人能夠到達多少個格子?

示例 1:

輸入:m = 2, n = 3, k = 1
輸出:3

注意這里求的是機器人走的范圍,而不是路徑,所以每走一個新的格都要加1

從(0,0) 統計所有訪問的點,可以同時進行dfs兩個方向,避免已經訪問過的點,從上向下進行dfs

給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同一個單談耐陪元格內的字母不允許被重復使用。

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

給定 word = "ABCCED", 返畝宏回 true

給定一個字元串 s,將 s 分割成一些子串,使每個子串都是迴文串。

返回 s 所有可能的分割方案。

示例:

輸入: "aab"
輸出:
[
["aa","b"],
["a","a","b"]
]

給定一個可包含重復數字的序列,返回所有不重復的全排列。

示例:

輸入: [1,1,2]
輸出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

數組中有相同的數,可以使用canSwap 進行判斷是否相同

給定一個 沒有重復 數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

給定一個無重復元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字含蠢可以無限制重復被選取。

說明:

所有數字(包括 target)都是正整數。
解集不能包含重復的組合。
示例 1:

輸入: candidates = [2,3,6,7], target = 7,
所求解集為:
[
[7],
[2,2,3]
]

給定一個數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用一次。

說明:

所有數字(包括目標數)都是正整數。
解集不能包含重復的組合。
示例 1:

輸入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集為:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]

給定一個可能包含重復元素的整數數組 nums,返回該數組所有可能的子集(冪集)。

說明:解集不能包含重復的子集。

示例:

輸入: [1,2,2]
輸出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

/// 子集

給定一組不含重復元素的整數數組 nums,返回該數組所有可能的子集(冪集)。

說明:解集不能包含重復的子集。

示例:

輸入: nums = [1,2,3]
輸出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

子集就是組合

給定一個非負整數數組,a1, a2, ..., an, 和一個目標數,S。現在你有兩個符號 + 和 -。對於數組中的任意一個整數,你都可以從 + 或 -中選擇一個符號添加在前面。

返回可以使最終數組和為目標數 S 的所有添加符號的方法數。

示例:

輸入:nums: [1, 1, 1, 1, 1], S: 3
輸出:5

Ⅵ 如何回答面試演算法問題

給定一個有序數組xxx 中,"有序"是否可以利用?

a: 用幾個簡單的測試用例,檢驗一下
b:暴力解法 通常都是思考的起點.

a: 遍歷常見的演算法思路
b: 遍歷常見的數據結構

c: 空間和時間的交換?
d: 預處理數據 => 排序
e: 在瓶頸處找到答案

a: 極端條件判斷
數組為空? 字元串==null? 數字==0? 指針->null?
b: 變數名等 符合規范
c: 注重模塊化,復用性

演算法在1s之內 可解決的問題:
O(n^2) 的演算法可處理大約10^4級別的數據
O(n) 的演算法可處理大約10^8級別的數據
O(nlogn)的演算法可處理大約10^7級別的數據

Ⅶ 請各位高手點一下二級C語言考試涉及什麼演算法。還有C語言常涉及那些演算法。俺定高分獎賞!

如果你擔心C二級過不去,做完南開100題就行,C二級涉及的稍微深一點(相比其它題)的是鏈表的基本操作(建立動態鏈表,查找,插入,刪除),很基礎,自己拿TC或VC試試就會了,還有遞歸函數,但是不要求你會編遞歸,只要能看懂,能推出最後的返回值就行。總之,很兒戲。
如果想做程序員,實際工作中學或者有天分的話自己鑽。
下面是一個程序員的自述,希望能給你些啟發:
這些日子我一直在寫一個實時操作系統內核,已有小成了,等寫完我會全部公開,希望能夠為國內IT的發展盡自己一份微薄的力量。最近看到很多學生朋友和我當年一樣沒有方向,所以把我的經歷寫出來與大家共勉,希望能給剛入行的朋友們一點點幫助。

一轉眼我在IT行業學習工作已經七年多了,這期間我做過網頁,寫過MIS、 資料庫,應用程序,做過通信 >軟體、硬體驅動、 協議棧,到現在做操作系統內核和IC相關開發,這中間走了很多彎路,也吃了不少苦。

我上的是一個三流的高校,就連同一個城市的人多數都不知道。因為學校不好也就沒有指望能靠學校名氣找一個好工作。所有的希望都寄託在自己的努力上了,大一開學前的假期我就開始了學習,記得我買的第一本書是《 計算機基礎DOS3.0》,大家別嚇著了,其實當時已經普及了DOS6.22了,只是我在書店裡看到了DOS4.0,5.0,6.0的書,以為像英語那樣是第四、五、六冊,記得當時到處找DOS1.0,現在想想也幸好我沒有找到:)開學前我學完了PASCAL,那時既沒有 計算機也沒有人可以請教,我連程序是什麼的概念都沒有,只好死記硬背 代碼,然後拿紙寫,我一直到大三才有了一台486,在這之前用紙寫了多少程序我也記不清楚了,只知道最長的一個我拿A4大小的草稿紙寫了30多頁,我的C語言、C++、VC都是在這樣的條件下 入門的。所以說條件是可以克服的,希望我的經歷多少給條件艱苦的同學們一點信心。第一次上機是在我姐夫的機房,我的心情激動的無與倫比,但是一上機我立刻傻了眼,他們用的是英文版的in3.1,我的那點DOS 知識都見了鬼,上機提心吊膽的一陣瞎摸,一不小心把Word弄成了全屏,怎麼都還不了原,當時真是心急如焚,我以為機器被我弄壞了。第一個C語言程序,就是那個經典的HelloWorld,我調了幾個星期,上機機會非常少,也沒有書告訴我開發環境(TC2.0)需要設置,而且開始我都不知道有編譯器,我甚至自作聰明把寫好的程序擴展名從.c改成.exe,結果可想而知。大一學完了C、X86的匯編、數據結構、C++。由於精力都花在自學上了,大一下四門課掛了彩,三類學校就是這點好,掛上一二十門也照樣畢業。不過扯遠點說,我那麼刻苦都及不了格,可見我們國家的 計算機教育有多死板。

大二准備學VC和BC,當時難以取捨,後來選了VC,不為別的,只為書店裡兩本書,VC那本便宜6塊錢。我的努力在班上無人能及,學的日夜不分,大三有了 計算機後更是如此,很多次父親半夜教訓我說我不要命了,我一直覺得自己基礎差,記憶又不行,條件也不好,所以覺得只有多花點時間才能趕上別人。居然後來有許多朋友說我有學 計算機的天賦,讓我哭笑不得。我用的是486,16M內存,1G硬碟,當時同學們的配置都是P166MMX,我安裝一個indowsNT4.0需要一個通宵,編譯一個BC5.0向導生成的程序需要近兩個小時,我的顯示器是個二手的,輻射非常大,開機屏幕冒火花,看起來很酷的:),有一次程序寫的太久,覺得怎麼白色的編輯器背景變成了紫色,以為顯示器壞了,後來才發現眼睛不行了,不過說來也奇怪,到今天我的視力還能保持1.5,真是個奇跡。但是就是那台破機器陪伴了我兩年,讓我學會了VC、Delphi、SQLServer等。後來那台機器給我阿姨打字用,據她說一天她正打的開心,一股青煙夾著火苗從顯示器鑽出來,之後它才壽終正寢。

大三假期找了個機會在一個 計算機研究所實習,與其說實習不如說是做義工,工作了兩個月一分錢沒有拿。但是這兩個月對我的發展幫助很大,讓我早一步了解了社會,剛去的時候我當然是一竅不通,在那裡我熟悉了網路,學會了Delphi和Oracle。由於工作很認真,得到了比較好的評價,在一位長者的引薦下,我開始和他們一起做項目,這使我在大三大四就有了自己的收入,大四又找了兩家MIS公司兼職,雖然錢不多,但是在學生期間有1000多的收入我已經非常滿足了,我終於用自己賺的錢把 計算機換了。大四下開始找工作,這時我的工作經驗已經比較多(當然現在想想非常幼稚),開始聽父母的想去那個研究所,實習過那個部門也希望我能去,但是不知道為什麼最後不了了之,這種單位就是比較官僚,我一氣之下就到了我兼職的一個公司做MIS的TeamLeader。在大三到畢業一年的時間,做過了各種MIS,從煤氣、煙廠、公安、鐵路、飲食到高校,什麼有錢做什麼,工作也很辛苦,經常加班和熬通宵,從跟客戶談需求到設計、編碼、測試、交付都要上。那時覺得很有成就感,覺得自己還不錯,現在想想真是很膚淺。

剛走上工作崗位的學生很容易被誤導,各種開發 工具讓人眼花繚亂,同時也覺得很受公司器重,但這樣工作永遠是一個低層次的開發者。不要跟我說什麼系統分析有多麼多麼重要,多麼多麼難。你以為自己跟用戶談需求做設計就是系統分析和設計了嗎,國內又有幾個公司能夠做的很到位很規范?我是ISO9000內審員,也在Rational公司受過多次培訓,拿了4個證書,還有一個公司讓我去做CMM。這些我聽過很多,但是很多事情到國內就變了性質,一個公司不是通過了ISO9000或者CMM就能規范了,我現在在一家有幾十年歷史的外企工作,裡面的管理不是一般國內企業能及的。作為一個畢業不久以前沒有步入過社會的學生,幾乎不可能在很短的時間掌握系統分析和設計,面向對象、UML只是一個 工具,關鍵是人本身的思想,不是說你熟悉了C++、Rose就能夠做出好的設計,相反如果你具備了很高的素質,你可以用C寫出比別人用C++更加模塊化的程序。

話說遠一些,國內 >軟體開發行業有一個怪圈,很多人覺得VC>Delphi>VB,真是很搞笑。這幾個 >軟體我都做過開發,說白了他們都是 工具,應該根據應用的需要選擇採用哪個,而不是覺得哪個上層次。如果你因為用某個開發 工具很有面子而選擇的話,只能說明你很淺薄。如果說層次,那麼這些 工具都不上層次,因為它們用來用去都是一些系統的API,微軟的朋友不會因為你記住他們多少個API或者多少個類就會覺得你很了不起,你永遠只是他們的客戶,他們看重的是你口袋裡的銀子。我也做過系統內核,我也封裝過很多API,同樣我也不會看重那些使用這些API做二次開發的客戶,除非他能夠作出自己獨到的設計。

至於有人認為C++>C那更是讓人笑掉大牙,不妨你去打聽一下,現在有幾個操作系統內核是用C++寫的,又有幾個實時系統用的是C++,當然我也不是說C++不好,但是目前的內核和實時系統中C++還無法與C匹敵,至於說C++適合做應用系統的開發那是另外一回事。所以我的觀點是不在於你用什麼 工具和語言,而在於你干什麼工作。你的設計體現了你的 技術層次。
這樣幹了一年我覺得非常苦悶,做的大多數都是熟練工種的活,個人 技術上沒有太多的提高也看不到方向。所以決定離開這個城市去上海,尋求更好的發展,並且打算放棄我以前的MIS轉到通信行業。

寫到這里不能不提到我女朋友,我們是在來上海前半年認識的,她大四在我公司實習,公司派她給我寫文檔,我們的感情發展的很快。她告訴我很多事情,她家原本是改革開放的第一批暴發戶,她母親愛打牌,輸掉了幾百萬,還欠了很多債,她有男朋友,但是她對他沒有感情,只因為他給了她母親兩萬多塊錢,後來還強迫她寫了四萬塊的借條,她男朋友背叛過她並且不止一次打她,現在逼她結婚不然就要她還錢。這人居然還是一個高校的老師!她母親把父親給她的學費花了,因為拖欠學費她沒有辦法拿到畢業證。她母親現在有病需要錢,我拿出了自己的一點積蓄並且跟朋友們接了一些,替她交了學費並給她母親看病(後來才知道看病的錢又不知所終,就連她母親是不是有病我都不知道,但她也是沒有辦法)。這個時候我家知道了一些事情,堅決反對我和她在一起,她原來的男朋友也極力破壞。無奈之下我們決定早一定離開這個傷心的城市,並且瞞著我們家。由於時間倉促,我只准備了4000塊錢,她僅有的幾百塊錢也被她母親要去了,我買了三張票,一張是中午的,兩張是晚上的,中午我的家人把我送上船,他們一離開我就下了船,我和她乘坐晚上的船離開了這個我和她生活了很多年的城市,帶走的只是一身債務。沒有來過上海的我們兩個性倔強,都不願意去麻煩同學和朋友。來到上海是傍晚6點半,我們都不知道該去哪裡,我們找了一個20塊錢的旅館,這個房間連窗戶都沒有,7月份的天氣酷熱難耐,房間里非常悶熱。第二天我們開始租房子,因為身上的錢不多,我們基本都是步行,花了一個星期時間,不知道在浦東轉了多少圈後找到了一個400塊的房子,但是我們都不了解上海是付三壓一,還要付半個月的中介費,買了一些鍋碗瓢盆後,我們身上只有800塊錢了,工作都還沒有著落,這800塊錢要支持到我們拿到第一個月工資,為了省錢我們自己做飯,每天買菜只花兩塊錢,她非常喜歡吃(也可能她在大學經常挨餓的願意),看到她現在這樣省吃儉用我真的很不忍心。她以前的男朋友也沒有放過她,經常打電話來騷擾,並且來上海看她,還說了不少恐嚇她的話,她過於善良,說他以前畢竟幫助過她,叫我不要與他一般見識。以後的每天在家就是苦等面試通知,原本我想迅速找一家MIS公司解決眼前的困難,但是她堅持讓我不要放棄自己的理想,終於功夫不負有心人,我找到了一家通信公司,4000塊的工資雖然趕不上MIS公司給我開出的價位,但也夠在上海生存。她也找到了工作,第一天上班她哭了,這是她來上海第一次流淚,我心裡很難受也很感動。

由於是全新的行業,我把自己降到了零點,我學的VC、Delphi、 資料庫派不上用場,擺在我面前的是嵌入式、協議、信令一些我從未接觸過的 知識。我知道我沒有退路,於是拚命的學習,我把自己當做一個應屆畢業生一樣,一分努力一分收獲,半年過去我終於熟悉了工作,並且得到了公司的表彰,薪水也加了一級。後面的日子裡我們省吃儉用,把欠朋友的1萬多塊錢還了,日子終於上了正軌。這時女朋友告訴我她想考研究生,我也很支持,於是她辭職在家備考。

另外,在這里我要感謝我的ProjectManager,他原來是一個大通信公司的產品經理,對人非常和善,我從他那裡學到了很多 知識,而且他也給了我許許多多無私的幫助。在工作上他給我充分的空間和信任。記得公司安排我維護一個接入伺服器 >軟體,由於 代碼量不算太小(5萬行),資料和文檔都不齊全,我維護起來非常吃力,所以想重新把它做一遍,公司領導不太支持,可能覺得工作量太大,但是他極力支持我,私下裡他讓我放手去做,我的維護工作他擠時間做。在他的支持下,我花了半年時間完成了接入伺服器的 >軟體,並且實現了一個相對完整的 TCP/IP 協議棧。在這里我學會了嵌入式系統設計、驅動開發、 TCP/IP和很多通信的 知識,我花了一年時間終於使自己從MIS開發轉到了通信行業,並且站穩了腳跟。我的開發大量是對硬體的直接操作,不再受微軟的操作系統,VC、Delhpi這些開發 工具的約束,我終於看到了另外一片天空。

我做事情喜歡追根問底,隨著開發的深入, >軟體開發與硬體聯系越來越緊密,硬體 知識的匱乏又對我的發展產生了障礙,而且晶元 技術基本上掌握在國外公司的手裡,這對做系統級設計是一個非常大的制約,一個新產品出來,第一道利潤(也往往是最豐厚的利潤)常常都被IC公司如Intel、Motorola賺去了,國內的廠商只能喝點湯。所以我決心解決自己的硬體 技術障礙,並打算離開通信行業,進入IC設計相關領域。
當然我明白如果我對硬體了解的非常少,沒有哪家IC公司會仁慈到招我這樣一個一竅不通的人來培訓。所以我必須努力打好基礎,學一些相關 知識為以後做准備。就像我開始從MIS轉到通信一樣,我看過大量通信方面的書,並且給一個ISP做過RADIUS計費分揀台,在這樣的背景下這家通信公司才給了我這個機會。我在的通信公司是做系統設計的,有不少PCBLayout硬體人員,平常我就注意向他們學習,由於我做的是 >軟體,在公司看硬體資料不好意思,所以開始只好在家看,剛來上海工作我連續一年都在加班,後來不加了,因為我要擠出時間學習,通常我12點左右睡,第二天5點半起,我上班比較早,地鐵上如果人不多我也用來看書。學習當然不會是一帆風順的,有些實在不懂的問題就積累起來問硬體人員,他們的幫助使我學習進度快了很多,因為在沒有人點撥的情況下自學,我的一半時間是花在解決疑難問題上,但這種問題經常是別人的一句話就可以讓我豁然開朗,我非常慶幸我有這樣的學習環境。在後面的一年裡,我學會了看硬體原理圖,學會了簡單的硬體設計(模擬電路方面還有不小的差距),事情就是這樣的,當你安安份份做 >軟體,別人永遠認為你是 >軟體開發人員,在你開始學習硬體時別人未必會認同,有位中興通訊的朋友還對我說過,一個人不可能把所有東西都學完。我也明白這一點,但我希望自己做的更好。但當你熟悉硬體後大家又會覺得你好像原本就是軟硬體都懂的,同事們也都習以為常了。這個時候我可以把硬體資料堂堂正正的拿到公司看,沒有人再大驚小怪了。讓我比較自豪的是我通過自己的努力做了一個IAD(軟交換的終端設備)系統方案,包含軟硬體的選型、設計等內容,這個方案得到了公司和同事們的認同,讓我感到非常欣慰。

技術是相輔相成的,當我的硬體有了一定的進步後,我的 >軟體設計也有了很大的提高,我可以從更深層次理解問題,我做的接入伺服器CPU是MotorolaPowerPC860,熟悉的朋友都知道860QMC與 >軟體的批量數據傳輸通常採用BD表的方式,硬體人員做驅動的時候習慣採用固定BD表,每接收或發送數據都將數據從BD表拷貝到用戶Buffer,或從用戶Buffer拷
貝到BD表,由於理解的比較深入,我自己重新實現了這個過程,採用動態BD表的方式,驅動從一個網口接收數據,提交給我的 >軟體進行三層交換,直至從另外的介面發送出去,沒有進行一次拷貝。這樣的設計大大提高了性能,使系統的指標接近理論值。軟硬體的結合使我的設計水平上了一個台階。我現在寫的這個操作系統,編譯後我把程序反編譯成匯編,找出其中不優化的 代碼,然後在C程序中進行調整。舉個例子,很多CPU沒有專門的乘法指令,這個大家應該都知道,在這種CPU上進行一個乘法操作常常會花費大量的指令周期,有的朋友會說這個我知道,我會盡量避免採用×號,但是事情往往不是那麼簡單,你知道C語言中數組的下標操作是怎麼實現的嗎?仔細看看反匯編的 代碼你就會明白,同樣是通過下標的定位操作,C編譯器會有時候會產生位移指令,但有時候會用乘法實現,兩者效率往往是天壤之別,所以明白這些問題你才能將系統性能提升到極致。這些問題就不多說了,有興趣的話以後可以共同探討。
話說遠一點,我由衷的希望在 >軟體上做的比較深入的朋友們有機會學學硬體以及其它相關 知識,尤其是做底層開發和嵌入式設計的。這對 >軟體 技術的提高有非常大的幫助,否則很多事情你只知道該這樣但不會明白為什麼該這樣。我這個觀點在我現在的IC公司ProjectManager那裡也得到了驗證。他告訴我們公司現在的802.11晶元產品的 >軟體經理原本是做該晶元硬體設計的,某某某原本是做 >軟體的,現在在做IC,類似的例子還有很多,只是在國內這樣的風氣不是非常流行。

我有一些心得體會與大家分享,只有當我干好本職工作後,我才會學習與工作關系不大的 技術,這樣公司的上司才不至於反感,在 入門階段的問題我通常不去問那些資深人士,而是問一些資歷比較淺的朋友,比如剛畢業不久的學生,因為他們往往會跟你詳細的講解,而資深人士通常覺得你的問題太簡單,所以回答的也很簡單,我又不好意思多問。等 技術上了一定的層次後我才會問他們,他們也能給你比較深入的回答。另外,有些朋友說我機會比較好,他們也希望能從事新的工作可惜沒有機會,我聽了只有苦笑,我的機會了解的人都應該知道,我沒有出生在什麼IT世家:)也沒有誰一路提拔我,所有的路都是自己走出來的,我母親去世比較早,我的後母(我叫她阿姨)看著我努力過來的,一次她看我大年30還在寫程序,她說像我這樣努力木頭都能學出來。

我的最終目的是IC而不是PCB,所以我下一步的准備開始學習IC設計的 知識。公司的同事沒有懂IC設計的,後面的路又要靠自己了,我買了不少相關的書,在網上也查了很多的資料,我花了大量的時間去學習VHDL,並且用 >軟體進行了一些簡單的設計和模擬(沒有設計ASIC,只是針對FPGA),隨著學習的深入,我漸漸明白了IC設計的基本流程,同時也明白了這條路的艱辛。這個時候我已經做好了跳槽的准備,我向一家業界又一定知名度的IC設計公司投了簡歷,並通過了漫長的面試(4個多小時)。其他的一切我都比較滿意,唯獨薪資差強人意,我也明白原因,因為我是這個行業的新人,我沒有經驗,我再一次將自己清零了。公司老闆問我6000多一個月能不能接受,我知道他也是照章辦事。想想我通信行業的朋友們,基本上都是年薪10萬以上,月薪過萬的也比比皆是,朋友們也幫我介紹了不少待遇不錯的公司,我該怎麼選擇,當時我很猶豫,我熱愛我的事業,我嚮往我的追求,但我也是一個普通的人,我也需要養家糊口,我也想早一點買房買車。生活給我出了一道難題。

愛因斯坦在63歲時說過"一個人沒有在30歲以前達成科學上的最大成就,那他永遠都不會有。"這句話給了我很大的壓力和震動,我馬上就26歲了,離30隻有四年時間,我必須抓緊這幾年寶貴的時間,努力達到我 技術上的最高峰。為了這個理想,為了能離自己的夢更近一些,我選擇了這家IC公司,我明白自己的薪資和公司剛進來的碩士研究生相差無幾,但為了今後的發展只能忍受,一切又得重新開始。換行業是一個非常痛苦的過程,尤其從一個春風得意的位置換到一個陌生的崗位,感覺象從溫暖的被子里鑽出來跳進冰水中,讓人難以接受。在原來那家通信公司,我是唯一兩年時間漲了五次工資的員工,公司和同事都給了我極大的認可,工作上也常常被委以重任。但現在這一切都成了過去,在新的公司我只是一個新人,沒有人知道也沒有人在意我過去的成績。我決定重新開始,我把自己看作新畢業的學生,我要用自己的努力得到公司的認可。進入新的行業是非常痛苦的,我告訴自己必須忍受這一切,雖然外面有很多誘惑,但是既然作出了選擇我就不允許自己輕易放棄。

我現在已經在這家新公司上了一個多月的班,開始非常艱難,現在慢慢適應了。第一個月結束時,TeamLeader找我談話,說我是新進員工中最優秀的一個,我心裡很欣慰,這也算對我努力的一個肯定吧。在這里還要感謝我的女朋友,她給了我很大的支持和鼓舞,每次在我動搖的時候她都在鼓勵我,讓我堅持自己的理想,剛來上海是她讓我不要勉強去做MIS,這次也是她讓我頂住了月薪過萬的誘惑,沒有她我可能不會有今天的成績。

現在的公司有自己的操作系統,自己的CPU、DSP和其它晶元,在這里我能學到世界上最先進的 技術,我們的設計開發不再完全依賴別人的硬體和系統,這讓我很開心。我打算等工作步入正軌後,全力學習新的 知識,實現我的理想。

在後面的兩年裡我給自己定下了幾個目標:

一.努力做好本職工作,在工作上得到公司和同事們的認同;
二.努力學習IC硬體設計 知識,多向同事請教,並利用一切機會多實踐;
三.實現我的實時操作系統的主要部分,完成 TCP/IP 協議棧模塊,並免費發布源 代碼;
四.和我女朋友結婚並買一套小房子,這是最重要的,因為我明白事業是可以重來的,但是珍貴的感情很難失而復得。

在這里提一下我現在開發的操作系統,它是一個實時嵌入式系統,目前支持以下特性:

a.支持時間片輪轉調度和基於優先順序調度,最多64個優先順序;
b.搶占式實時內核;
c.為了便於移植,主體用標准C實現;
d.匯編 代碼非常少,不到100行;
e.支持任務管理,各任務有獨立的堆棧;
f.進程同步和通信目前完成了Semaphore,MessageQueue正在調試;
g.實現了定時系統調用;
h.可以在windows上模擬調試
我還打算下一步實現優先順序反轉保護,EventFlag,DataPipe,內存管理(以前實現過)、驅動介面等。在這之後我還會努力完善它,比如加入文件系統, 協議棧、調試介面等。希望朋友們提出自己的意見和建議,在此不勝感激!

後記:
就像有的朋友說的,我的經歷或許會給一些朋友產生誤導,在這里我必須說明一下。我來上海以前學習過於拚命,常常晚上只睡3個多小時,我身高1米71,那時只有108斤(我現在130多),家人也說我這樣拚命活不過60歲,但是當時的我太固執,我對他們說只要能實現理想活50歲我就夠了。那時的拚命使我的身體受到了影響,有一次早上突然腰肌劇痛難忍,痛的我倒在床上站不起來。雖然我現在已經比較注意,但有時候還會隱隱作痛。後來在女朋友說服了我,來上海以後我不再如此。我經常引用父親的一句話"身體是革命的本錢"。

而且我也發現拚命不是辦法,我可以熬一兩個通宵,最多的一次我連續工作了三天三夜,但是我半個月都沒有恢復過來,這樣是不是得不償失?學習工作應該是一個長期的過程,像馬拉松而不是百米沖刺。我現在非常注意調整學習和工作的強度,我要保證每天盡量有相對充沛的精力,一些年輕的朋友覺得自己也應該拚命努力,這讓我多少有些擔心,如果我的故事能讓你在學習工作上多一點興趣,我會感到很開心,但如果誤導了某些朋友,讓你做一些不值得的付出,我會感到很內疚。

技術沒有貴賤只分,我以前換行業是因為自己的興趣所致,而不是對哪個行業有什麼偏見。我希望我的經歷不要給朋友一個錯誤的導向,覺得我始終向更高的 技術發展。其實各行各業做到頂尖都是很困難的。話又說回來雖然 技術沒有貴賤,但是門檻是有高低的,無論如何,做IC的門檻要比做網頁的高,這一點無可否認。國家各種人才都是需要的,但是作為個人奮發向上的想法還是應該有的,努力在自己喜歡的行業上做的更好,而不應該停留在比較膚淺的層次上。
我是一個自己覺得比較有自知之明的人,或許我最大的優點就是知道自己有很多缺點:)。我的故事中很多的曲折和錯誤都是由我的缺點造成的,希望大家用審慎的眼光看待我的經歷,不要被我的"花言巧語"所迷惑。我學習有些隨心所欲,這給我帶來了無盡的麻煩,也大大阻礙的我的發展。記得我小時候成績比較出色,但是後來學習嚴重偏科,導致我中學成績一再滑坡,也沒有考上什麼好的學校,小時候的一個朋友,當時的成績和我相仿,但是沒有我這個缺點,她上了清華,後來在去了美國深造,在一個著名導師手下研究理論科學,這未嘗不是一條更好的出路。另外我的學習方法也是在不斷改善中的,過去的學習過於講究數量和時間,那樣學習既苦而已效率不高,現在我非常注意學習的效率和技巧,這樣才是學習的捷徑(當然不是指投機取巧),比如說學一相對陌生的 技術,如果有條件,不妨問一問有經驗的人,不需要問很多,往往他不經意的幾句話會給你非常大的幫助,甚至超過你看一個星期的書。帶著這樣的思想再去學習你會節省很多時間,這樣何樂不為呢?這些年中我學了不少的東西,由於開始非常盲目,所以學的東西雜亂無章,現在回想起來讓我啼笑皆非,我把大量的時間浪費在一些沒有必要深入了解的 知識上,畢竟一個人的精力是有限度的。很多朋友很我一樣都背過五筆字形,的確它是個不錯的輸入法,但是對一個研發人員它絕對不值得你去背,你的時間應該花在有價值的地方。我這樣的事情還做過很多,我背過CCED、WPS的命令和快捷鍵,在dBase基本退出歷史舞台後我還花了很多時間去學習它的使用。所以我的學習在前期缺乏規劃,沒有明確的短期目的、中期目標,只有一個虛無飄渺的長期的理想。這就像做設計一樣,好的設計是從需求抽象到 代碼有很多過程,而不能得到了需求就立刻開始開始編碼。
最後贈你一句心法吧:只要夢想能夠延續,心願總會有實現的一天。

Ⅷ 入門級C語言題,輸入兩個正整數a和b(a<b),輸出在[a,b]區間內的所有素數的個數。

scanf("%d%d",&a,&b);/*這里能不能加個空格或者逗號畝物?否則計迅行液算機怎麼知道你從帶敗哪裡分割?*/

if(!(e-i+2)) /*這里是什麼意思,說實話沒想明白*/

Ⅸ 計算機視覺演算法工程師常見面試題1

參考: https://www.hu.com/column/c_1170719557072326656

反卷積也稱為轉置卷積,如果用矩陣乘法實現卷積操作,將卷積核平鋪為矩陣,則轉置卷積在正向計算時左乘這個矩陣的轉置WT,在反向傳播是左乘W,與卷積操作剛好相反,需要注意的是,反卷積不是卷積的逆運算。
[知乎問題+caffe實現]

實現上采樣;近似重構輸入圖像,卷積層可視化。

只要激活函數選擇得當,神經元的數量足夠,至少有一個隱含層的神經網路可以 逼近閉區間上任意一個連續函數到任意指定的精度。

判別模型,直接輸出類別標簽,或者輸出類後驗概率p(y|x)
[ https://www.hu.com/question/268906476]
[ https://zhuanlan.hu.com/p/40024110]
[ https://zhuanlan.hu.com/p/159189617]

BN是在 batch這個維度上進行歸一化,GN是計算channel方向每個group的均值方差.

檢測結果與 Ground Truth 的交集比上它們的並集,即為檢測的准確率 IoU

內存/顯存佔用;模型收斂速度等

Hessian矩陣是n*n, 在高維情況下這個矩陣非常大,計算和存儲都是問題。

mini-batch太小會導致收斂變慢,太大容易陷入sharp minima,泛化性不好。

可以把dropout看成是 一種ensemble方法,每次做完dropout相當於從原網路中找到一個更瘦的網路。

pooling操作雖然能增大感受野,但是會丟失一些信息。空洞卷積在卷積核中插入權重為0的值,因此每次卷積中會skip掉一些像素點;

空洞卷積增大了卷積輸出每個點的感受野,並且不像pooling會丟失信息,在圖像需要全局信息或者需要較長sequence依賴的語音序列問題上有著較廣泛的應用。

表達式為:

使用BN的原因是網路訓練中每一層不斷改變的參數會導致後續每一層輸入的分布發生變化,而學習的過程又要使每一層去適應輸入的分布,因此不得不降低網路的學習率,並且要小心得初始化(internal covariant shift)
如果僅通過歸一化方法使得數據具有零均值和單位方差,則會降低層的表達能力(如使用Sigmoid函數時,只使用線性區域)
BN的具體過程(注意第三個公式中分母要加上epsilon)

最好的解釋是通過1 * 1卷積核能實現多個channel間的解耦合,解耦cross-channel correlation和spatial correlation。
【但是因為解耦不徹底,因此後續有了mobile net的組卷積方式和shuffle net組卷積方式】

由於 1×1 並不會改變 height 和 width,改變通道的第一個最直觀的結果,就是可以將原本的數據量進行增加或者減少。改變的只是 height × width × channels 中的 channels 這一個維度的大小而已。

1*1卷積核,可以在保持feature map尺度不變的(即不損失解析度)的前提下大幅增加非線性特性(利用後接的非線性激活函數),把網路做的很deep。

備註:一個filter對應卷積後得到一個feature map,不同的filter(不同的weight和bias),卷積以後得到不同的feature map,提取不同的特徵,得到對應的specialized neuron。

例子:使用1x1卷積核,實現降維和升維的操作其實就是channel間信息的線性組合變化,3x3,64channels的卷積核後面添加一個1x1,28channels的卷積核,就變成了3x3,28channels的卷積核,原來的64個channels就可以理解為跨通道線性組合變成了28channels,這就是通道間的信息交互

注意:只是在channel維度上做線性組合,W和H上是共享權值的sliding window

並不能說明這個模型無效導致模型不收斂的原因可能有

A. 在實際場景下,應盡量使用ADAM,避免使用SGD
B. 同樣的初始學習率情況下,ADAM的收斂速度總是快於SGD方法
C. 相同超參數數量情況下,比起自適應的學習率調整方式,SGD加手動調節通常會取得更好效果
D. 同樣的初始學習率情況下,ADAM比SGD容易過擬合

A.保證每一層的感受野不變,網路深度加深,使得網路的精度更高
B.使得每一層的感受野增大,學習小特徵的能力變大
C.有效提取高層語義信息,且對高層語義進行加工,有效提高網路准確度
D.利用該結構有效減輕網路的權重

A.計算簡單
B.非線性
C.具有飽和區

D.幾乎處處可微
【relu函數在0處是不可微的。】

A.Adam的收斂速度比RMSprop慢
B.相比於SGD或RMSprop等優化器,Adam的收斂效果是最好的
C.對於輕量級神經網路,使用Adam比使用RMSprop更合適
D.相比於Adam或RMSprop等優化器,SGD的收斂效果是最好的
【SGD通常訓練時間更長,容易陷入鞍點,但是在好的初始化和學習率調度方案的情況下,結果更可靠。如果在意更快的收斂,並且需要訓練較深較復雜的網路時,推薦使用學習率自適應的優化方法。】

A.使用ReLU做為激活函數,可有效地防止梯度爆炸
B.使用Sigmoid做為激活函數,較容易出現梯度消失
C.使用Batch Normalization層,可有效的防止梯度爆炸
D.使用參數weight decay,在一程度上可防止模型過擬合

對結果存疑。認為二者皆可防止。

A.SGD
B.FTRL
C.RMSProp
D.L-BFGS

L-BFGS(Limited-memory BFGS,內存受限擬牛頓法)方法:
所有的數據都會參與訓練,演算法融入方差歸一化和均值歸一化。大數據集訓練DNN,容易參數量過大 (牛頓法的進化版本,尋找更好的優化方向,減少迭代輪數)從LBFGS演算法的流程來看,其整個的核心的就是如何快速計算一個Hesse的近似:重點一是近似,所以有了LBFGS演算法中使用前m個近似下降方向進行迭代的計算過程;重點二是快速,這個體現在不用保存Hesse矩陣上,只需要使用一個保存後的一階導數序列就可以完成,因此不需要大量的存儲,從而節省了計算資源;重點三,是在推導中使用秩二校正構造了一個正定矩陣,即便這個矩陣不是最優的下降方向,但至少可以保證函數下降。
FTRL(Follow-the-regularized-Leader)是一種適用於處理超大規模數據的,含大量稀疏特徵的在線學習的常見優化演算法,方便實用,而且效果很好,常用於更新在線的CTR預估模型;FTRL在處理帶非光滑正則項(如L1正則)的凸優化問題上表現非常出色,不僅可以通過L1正則控制模型的稀疏度,而且收斂速度快;

A.LSTM在一定程度上解決了傳統RNN梯度消失或梯度爆炸的問題
B.CNN相比於全連接的優勢之一是模型復雜度低,緩解過擬合
C.只要參數設置合理,深度學習的效果至少應優於隨機演算法
D.隨機梯度下降法可以緩解網路訓練過程中陷入鞍點的問題

實際上,現在有很多針對小目標的措施和改良,如下:

最常見的是Upsample來Rezie網路輸入圖像的大小;

用dilated/astrous等這類特殊的卷積來提高檢測器對解析度的敏感度;(空洞卷積是針對圖像語義分割問題中下采樣會降低圖像解析度、丟失信息而提出的一種卷積思路。利用添加空洞擴大感受野,讓原本3 x3的卷積核,在相同參數量和計算量下擁有5x5(dilated rate =2)或者更大的感受野,從而無需下采樣。在保持參數個數不變的情況下增大了卷積核的感受野)

有比較直接的在淺層和深層的Feature Map上直接各自獨立做預測的,這個就是我們常說的尺度問題。

用FPN這種把淺層特徵和深層特徵融合的,或者最後在預測的時候,用淺層特徵和深層特徵一起預測;

SNIP(Scale Normalization for Image Pyramids)主要思路:

在訓練和反向傳播更新參數時,只考慮那些在指定的尺度范圍內的目標,由此提出了一種特別的多尺度訓練方法。

Ⅹ 面試演算法題:你的任務就是計算出長度為n的字元串(只包含『A』、『B』和『C』),有多少個是暗黑字元串。

程序肯定不是判斷一個字元串是純潔的還是黑暗的。從現有的題目描述看,程序和題目沒有關系。

題目是否不全?

閱讀全文

與c面試演算法題相關的資料

熱點內容
數據中心pdf 瀏覽:524
crf源碼解析 瀏覽:853
伺服器軟體開發是什麼意思 瀏覽:941
刪除彩信android 瀏覽:862
元宵節猜燈謎h5源碼 瀏覽:69
樂培生app怎麼綁定 瀏覽:762
視頻壓縮不清楚怎麼說 瀏覽:525
加好友伺服器繁忙是怎麼回事 瀏覽:381
怎麼解綁app的支付寶賬號 瀏覽:911
ip地址伺服器不可用怎麼解決方法 瀏覽:183
為什麼軟體需要伺服器 瀏覽:63
redis操作命令大全 瀏覽:597
python字元串重復索引 瀏覽:961
為什麼香信新版本連接不上伺服器 瀏覽:50
元旦程序員打羽毛球 瀏覽:614
otc焊接機器人離線編程教學 瀏覽:412
51單片機的ea引腳有何用途 瀏覽:207
centos查看用戶命令 瀏覽:840
程序員臉胖 瀏覽:744
hdfs在主目錄下創建文件夾 瀏覽:800