讓我們一起揭開演算法的神秘面紗

2022-01-10 06:34:53 字數 2161 閱讀 7034

前言

其實我一直想寫一篇揭秘演算法的文章,因為,據我所見,大多數寫演算法的軟體工程師,其實,就是普通程式設計師,並非高人一等。

但我一直不知道從何下手,今天姑且嘗試著亂寫一點。

最唬人的高大上

演算法最唬人的東西莫過於公式了。

而公式中最唬人的摸過於∑了;這個符號叫sigma,如下圖:

舉個例子:

某公司開會討論專案功能實現,與會人員有:乙個專案經理,三個a組成員,三個b組成員和乙個演算法工程師。

然後,討論著,討論著,就遇到了乙個爭議功能。

a組成員認為該功能應該迴圈來處理,b組成員認為應該使用遞迴來處理,雙方爭議不下。

此時,專案經理為了擱置爭議,共同開發。。。然後,請演算法工程師發表意見。

演算法工程師走到黑板,刷刷刷寫下了上圖的公式。。。然後開始了表演。。。呃,是講解。

「我們這個功能,我覺使用這個公式來實現最好,這個ki乘以mi,然後我們求一下和,巴拉巴拉。。。」

然後,a組b組成員就都蒙了,因為他們看不懂,也沒聽懂。因為程式設計師的特質是嚴謹,所以一旦遇到不懂的事情,他們通常是不發表意見的。

然後,在這小小的會議室中,演算法工程師的形象就瞬間高大了起來。

"沉默就表示同意了,那這個功能就這麼處理吧"專案經理說道。

最後,會議結束,因為沒人能看懂這個公式,所以,a組組長和b組組長私下討論了乙個解決方案把問題處理掉了。。。

其實這個公式很簡單,就是m=k1*m1+k2*m2+k3*m3+…+kn*mn。

什麼?看不懂?

那這樣總該能看懂了吧。

int totalm = 0;

int n = 10;

listk = new list() ;

listm = new list() ;

for (int i = 0; i < n - 1; i++)

聰明的你有沒有發現什麼?

【∑sigma】就是for迴圈有沒有。

這個∑下面i=0,上面n-1就是for迴圈的條件有沒有;k和m就是兩個count等於n的陣列有沒有。

上面例子中,演算法工程師提出的解決方案就是迴圈處理有沒有。。。

如果演算法工程師講公式時這樣說:「k和m集合長度相等,我們迴圈一下,計算下k[i] 和 m[i]的乘積,然後累加求和一下。」

是不是就都聽懂了。

當然了,如果他真這樣講,就高大上不起來了。。。

其實我們每天都在寫演算法

想想我們寫過的那些複雜甚至噁心的業務邏輯,結合一下上文的例子。

然後,你會發現,其實你每天都在寫演算法。。。

只是你不知道如何把你寫的東西,用公式表達出來而已。。。

誠然,經常寫演算法的朋友,的確,很多時候可以給出乙個非常好的處理問題的邏輯。

但是,這並不是演算法工程師在能力上高人一等,只是他們長期應用演算法,對計算問題,相對更敏感,所以,處理起來更簡潔,高效。

其實,軟體工程師也一樣,有經驗的軟體工程師,寫的**邏輯更清晰,**更簡潔,會使用的開源框架更多,這並不能代表什麼,因為,這只是工作能力的高低而已。

嘗試寫乙個公式

編寫演算法公式其實非常簡單,使用word就可以實現啦。

編寫公式步驟,開啟word—插入—公式,然後在裡面選擇公式模板,單擊,就可以插入公式模板了。

如上圖所示,word裡提供非常多的公式模板。ps:有沒有發現,勾股定理其實也是一種演算法。

插入公式模板後,word上方的面板會自動跳轉到設計介面。

如上圖所示,這裡有非常多的功能。

作為程式設計師,你一定寫過文件吧,如果你在文件中加入幾個公式。。。

試想一下,當專案經理看你的文件時,看到一堆他不懂的公式。。。你在他心中的形象是不是瞬間就高大上起來了呢,o(∩_∩)o哈哈~

當然了,還是有真正大牛演算法工程師,這裡不能一概而論。

但我們沒必要自卑的認為比演算法工程師第一檔就是了。

摩卡,讓我們一起成長

本人加入摩卡倒頗有些緣分 在剛籌畫成立天津研發中心時,就差點成為研發中心的一員,但由於種種原因未能成行 經過一年多的等待,最終還是走進了摩卡,成為一名上海本土員工。時間如梭,加入摩卡轉眼三年了,我能很清楚地感覺到自己的成長與進步,同時也目睹了公司快速健康發展與壯大的過程,能成為摩卡人的一分子感到榮幸...

摩卡,讓我們一起成長

本人加入摩卡倒頗有些緣分 在剛籌畫成立天津研發中心時,就差點成為研發中心的一員,但由於種種原因未能成行 經過一年多的等待,最終還是走進了摩卡,成為一名上海本土員工。時間如梭,加入摩卡轉眼三年了,我能很清楚地感覺到自己的成長與進步,同時也目睹了公司快速健康發展與壯大的過程,能成為摩卡人的一分子感到榮幸...

讓我們一起Go(十三)

上篇,我們了解了go語言介面的一些知識,在這篇中,我們將繼續聊聊介面這東西。go語言中定義乙個空介面,也就是沒有任何函式需要實現的介面就是乙個空介面,作為乙個空介面,因為物件無需實現它的函式,所以它可以指向任何物件,看下面的示例 上面的empty介面變數分別可以被賦值為int型別,string型別,...