final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}
不知道你是不是這個意思。
㈡ 大公司筆試面試有哪些經典演算法題目
1、二維數組中的查找
具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?
㈢ 面試官常問十大經典演算法排序(用python實現)
演算法是一種與語言無關的東西,更確切地說就算解決問題的思路,就是一個通用的思想的問題。代碼本身不重要,演算法思想才是重中之重
我們在面試的時候總會被問到一下演算法,雖然演算法是一些基礎知識,但是難起來也會讓人非常頭疼。
排序演算法應該算是一些簡單且基礎的演算法,但是我們可以從簡單的演算法排序鍛煉我們的演算法思維。這里我就介紹經典十大演算法用python是怎麼實現的。
十大經典演算法可以分為兩大類:
比較排序: 通過對數組中的元素進行比較來實現排序。
非比較排序: 不通過比較來決定元素間的相對次序。
演算法復雜度
冒泡排序比較簡單,幾乎所有語言演算法都會涉及的冒泡演算法。
基本原理是兩兩比較待排序數據的大小 ,當兩個數據的次序不滿足順序條件時即進行交換,反之,則保持不變。
每次選擇一個最小(大)的,直到所有元素都被輸出。
將第一個元素逐個插入到前面的有序數中,直到插完所有元素為止。
從大范圍到小范圍進行比較-交換,是插入排序的一種,它是針對直接插入排序演算法的改進。先對數據進行預處理,使其基本有序,然後再用直接插入的排序演算法排序。
該演算法是採用 分治法 對集合進行排序。
把長度為n的輸入序列分成兩個長度為n/2的子序列,對這兩個子序列分別採用歸並排序,最終合並成序列。
選取一個基準值,小數在左大數在在右。
利用堆這種數據結構所設計的一種排序演算法。
堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。利用最大堆和最小堆的特性。
採用字典計數-還原的方法,找出待排序的數組中最大和最小的元素,統計數組中每個值為i的元素出現的次數,對所有的計數累加,將每個元素放在新數組依次排序。
設置一個定量的數組當作空桶;遍歷輸入數據,並且把數據一個一個放到對應的桶里去;對每個不是空的桶進行排序;從不是空的桶里把排好序的數據拼接起來。
元素分布在桶中:
然後,元素在每個桶中排序:
取得數組中的最大數,並取得位數;從最低位開始取每個位組成新的數組;然後進行計數排序。
上面就是我整理的十大排序演算法,希望能幫助大家在演算法方面知識的提升。看懂之後可以去試著自己到電腦上運行一遍。最後說一下每個排序是沒有調用數據的,大家記得實操的時候要調用。
參考地址:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html
㈣ 面試難點!常用演算法技巧之「滑動窗口」
滑動窗口,顧名思義,就是有一個大小可變的窗口,左右兩端方向一致的向前滑動(右端固定,左端滑動;左端固定,右端滑動)。
可以想像成隊列,一端在push元素,另一端在pop元素,如下所示:
假設有數組[a b c d e f g h]
一個大小為3的滑動窗口在其上滑動,則有:
1、單層循環
2、雙層循環
模板只是一個解題思路,具體的題目可能需要具體分析,但是大體框架是不變的。
記住: 多刷題,多總結,是王道
1、最長不含重復字元的子字元串
2、絕對差不超過限制的最長連續子數組
3、無重復字元的最長子串
4、替換後的最長重復字元
滑動窗口演算法就是用以解決數組/字元串的子元素問題
滑動窗口演算法可以將嵌套的for循環問題,轉換為單循環問題,降低時間復雜度
生命不止堅毅魚奮斗,有夢想才是有意義的追求
給大家推薦一個免費的學習交流群:
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。
Java開發交流君樣:756584822
㈤ 測試開發面試必知演算法
測試開發的技能之一就是需要掌握一些開發的語言,而針對於考察開發語言,業界內比較容易採用的方式就是考察各種演算法。在此做一個簡單的總結(最近比較喜歡玩Python,所以都是以Python為例子,其它的語言類推。)
冒泡排序
冒泡排序演算法的運作如下:(從後往前)
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重復以上的步驟,除了最後一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
實例:對列表 [2, 8, 4, 7, 5, 9, 0]進行冒泡排序
遞歸
遞歸過程一般通過函數或子過程來實現。遞歸方法:在函數或子過程的內部,直接或者間接地調用自己的演算法。
實例:要計算1-10的10位數字的乘積,直觀的演算法是1 2 3 4 5 6 7 8 9,利用遞歸則思路是循環執行n*n-1,直到n=1時
二叉樹遍歷演算法
從二叉樹的遞歸定義可知,一棵非空的二叉樹由根結點及左、右子樹這三個基本部分組成。因此,在任一給定結點上,可以按某種次序執行三個操作:
⑴訪問結點本身(N),
⑵遍歷該結點的左子樹(L),
⑶遍歷該結點的右子樹(R)。
以上三種操作有六種執行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
二叉樹的節點表示可以使用
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
實例:求二叉樹深度和寬度
求深度用遞歸;求寬度用隊列,然後把每層的寬度求出來,找出最大的就是二叉樹的寬度
字元串倒序輸出
思路一:索引的方法
思路二:借組列表進行翻轉
後續還有的話會繼續添加的。
㈥ 如何回答面試演算法問題
給定一個有序數組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級別的數據
㈦ 計算機視覺演算法工程師常見面試題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)主要思路:
在訓練和反向傳播更新參數時,只考慮那些在指定的尺度范圍內的目標,由此提出了一種特別的多尺度訓練方法。
㈧ 【數分面試寶典】數分面試常考業務題(三)
EDA(Exploratory Data Analysis)即數據探索性分析,需要對數據集中的變數進行統計和分布描述、了解變數間的相互關系,從整體上了解數據集的數據特徵。探索性分析要對調查總體所有變數的有關數據進行統計性描述,主要包括數據的頻數分析、集中趨勢分析、離散程度分析、分布以及一些基本的統計圖形。
①數據的頻數分析。在數據的預處理部分,利用頻數分析和交叉頻數分析可以檢驗異常值
②數據的集中趨勢分析。用來反映數據的一般水平,常用的指標有平均值、中位數和眾數等。
③數據的離散程度分析。主要是用來反映數據之間的差異程度,常用的指標有方差和標准差。
④數據的分布。在統計分析中,通常要假設樣本所屬總體的分布屬於正態分布,因此需要用偏度和峰度兩個指標來檢查樣本數據是否符合正態分布。
⑤數據的相關性分析。探索不同變數之間的相關性,可以使用相關性圖進行展示,表示各變數之間的相關程度,為後續機器學習的特徵選擇提供依據。
環比:與相連續的上一個統計周期進行對比,環比增長速度=(本期數-上期數)÷上期數×100% ,反映本期比上期增長了多少,如2021年12月和2021年11月對比,環比的好處是可以更直觀的表明階段性的變換,但是會受季節性因素影響。
同比:是對去年同期的一個統計階段進行對比,同比增長率=(本期數-同期數)÷同期數×100%,如今年的這個月和去年的這個月,同比的好處是可以排除一部分季節因素。
相關性的前提是各個變數之間是相互獨立的,業務上來說,每個指標之間是沒有影響的,相關性系數:0.5以下相關性較弱,0.5 -0.8中度相關,大於0.8較強相關。
如果A和B相關,會有以下幾個推論:
A導致B:充分條件
B導致A:必要條件
C導致A和B:A和B同源
A和B如果有因果:充分且必要條件
相關和因果的區別:
相關:兩個變數或多個變數之間的相互影響程度;核心點:變數與變數之間互為相關,沒有先後順序;
因果: 前一個事件對後一個事件的作用的關系及強度,核心點:有嚴格的先後順序(變化可能會有延遲),如蝴蝶效應。
好玩的題目:
Y=0.5X y和x是相關還是因果?
y=0.5X+0.5z y和x是相關還是因果?
答案:都是相關
因果的前提是:有一個東西是先發生,而相關是沒有先後順序的,所以上述2個都是相關,而不是因果。
Q4、什麼是聚類?業務應用場景?常見演算法?
定義:
將相似的對象,將對象的特徵進行抽象,通過演算法將特徵相似的對象化為一類,是一種無監督機器學習演算法。
考點1:對於聚類,如何確定分類的數量N;
考點2:如何選擇進行聚類的特徵,比如要區分男女,有喉結的就是男生,留長發的就是女生;
應用場景:
個性化推薦(電商):相似用戶行為相似,會分到某個類,如用戶分層;
用戶畫像:基於用戶的購買偏好、消費能力進行用戶畫像;
常見演算法:
Kmeans聚類
DBSCAN聚類
Q5、什麼是分類?業務應用場景?常見演算法?
定義:
學習已有分類樣本的特徵,對新數據進行劃分,是一種有監督的機器學習演算法,分類是明確的,是有歷史樣本可學習的。
應用場景:
互聯網金融用戶信用等級分類
垃圾郵件分類
常見演算法:
邏輯回歸
SVM
貝葉斯
決策樹
KNN
XGboost
Q6、什麼是回歸?業務應用場景?常見回歸演算法?
定義:
兩個或多個變數之間是否相關,相關強度,並建立數學模型,定量評估
人話:我和你有沒有關系,什麼關系,深到什麼程度。
本質:找到一條之間最合適的平均線,讓線的附近的點分布均勻
應用場景:
運營推廣中,是不是花的錢越多,買的流量越大,品類越豐富,用戶活躍越高,那麼,多到什麼程度、大到什麼程度、豐富到什麼程度、用戶的活躍最高,留存最高;
智慧城市的交通,預測交通擁塞程度:自變數:時間段、商業指數、住宅指數、城區指數、道路指數,因變數:兩個連續信號燈之間道路的通行時間。
常見回歸演算法:
線性回歸
lasso回歸
ridge回歸
樹回歸
Q7、時間序列預測的原理是什麼?有哪些應用場景?
原理:
當自變數是時間時,且數據在時間上呈現出一定的規律,那麼這種情況一般都可以使用時間序列預測接下來一段時間的數據走勢。這個規律表現為:數據整體變化的趨勢(可以理解為一條表徵趨勢的直線)、季節性(可以理解為按照一定的周期重復出現的模式)和隨機性(可以理解為在零附近毫無規律的白雜訊)組成,時間序列就是將數據按照這三個部分分別拆解,再基於歷史數據進行組合預測。
應用場景:
一般應用於年度的KPI預測,產品的活躍用戶數趨勢,羽絨服的銷量等。
Q8、時間序列預測需要注意的點?和回歸有何區別?
需要注意的點:
時間間隔是固定的;
最近的數據對於預測影響程度越大;
預測是有季節性的,這里的季節性不一定是春夏秋冬,凡是以一定周期重復出現的都可以稱為有季節性;
回歸預測和時間序列預測的區別:
回歸是自變數對於因變數的趨勢,用以表徵自變數和因變數之間的定量關系,一般來說自變數和因變數只能是連續的數據;
時間序列預測的自變數可以是任何數據,包括時間,只要數據呈現出周期性的趨勢;
回歸不能做季節性的預測;
以上就是【數分面試寶典】系列—面試業務題系列第3篇文章的內容,部分歷史文章請回翻公眾號,更多數據分析面試筆試的文章持續更新中,敬請期待,如果覺得不錯,也歡迎分享、點贊和點在看哈
㈨ 演算法崗面試——數學基礎總結
在牛客網上的好資源真的很多,根據牛客網 演算法面試寶典 寫份總結,希望在面試過程中能好好表現。
SGD為隨機梯度下降,每一次迭代計算數據集的mini-batch的梯度,然後對參數進行跟新。
Momentum參考了物理中動量的概念,前幾次的梯度也會參與到當前的計算中,但是前幾輪的梯度疊加在當前計算中會有一定的衰減。
Adagard在訓練的過程中可以自動變更學習的速率,設置一個全局的學習率,而實際的學習率與以往的參數模和的開方成反比。
Adam利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率,在經過偏置的校正後,每一次迭代後的學習率都有個確定的范圍,使得參數較為平穩。
L0范數是指向量中非0的元素的個數。
L1范數是指向量中各個元素絕對值之和。
L2范數是指向量各元素的平方和然後求平方根。
值域為(0,1)
最大似然估計提供了一種給定觀察數據來評估模型參數的方法,而最大似然估計中的采樣滿足所有采樣都是獨立同分布的假設。
最大後驗概率是根據經驗數據獲難以觀察量的點估計,與最大似然估計最大的不同是最大後驗概率融入了要估計量的先驗分布在其中,所以最大後驗概率可以看做規則化的最大似然估計。
假設 為總體分布中的參數, 的先驗密度函數為 ,而抽樣信息算得的後驗密度函數與 具有相同的函數形式,則稱 為 的共軛先驗分布。
定義:兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。
作用:比較兩個字元串的相似度
演算法步驟:
1.str1或str2的長度為0返回另一個字元串的長度。
2.初始化(n+1) (m+1)的矩陣d,並讓第一行和列的值從0開始增長。掃描兩字元串(n m級的),如果:str1[i] == str2[j],用temp記錄它,為0。否則temp記為1。然後在矩陣d[i,j]賦於d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。
3.掃描完後,返回矩陣的最後一個值d[n][m]即是它們的距離。