演算法怎麼樣
『壹』 計算機演算法設計與分析怎麼樣
這本書作為這個學期的演算法課教材,這才讓我有機會看了下此書,剛看的時候,雲里來霧里去的,看完後,更是無奈。不明白為什麼這樣的書會作為教材,毫無道理。原因如下: 1.書中所講內容大部分出自演算法導論和Levitin的演算法設計與分析基礎(見P86頁講貪心演算法用做舉例的找零問題中的二角五分硬幣,當時看到二角五分硬幣就瞬間無語了.....因為只有米國才有25分的硬幣 = =),有些地方讓人感覺是刪減後照搬過來的,因此讀起來特別費勁,自覺愚鈍,跟不上作者跳躍的思維。 2.講的東西難度適中,當是表達方式實際上給讀者增加了難度。書中經常用a[],b[]這樣的名字來命名所需的數據結構,可見作者絲毫沒有用心在寫書,根本不為讀者著想,無力形式化描述使讀起此書頗有難度。 3.最關鍵的在於書中的演算法代碼。沒有採用偽代碼而採用c++實現本身沒什麼問題,但是代碼的風格實在是不敢恭維。從變數命名上多採用s,k,r之類讓人無語的名字,根本無法清晰表達變數的意思,而且要命的大部分演算法只有很少的注釋或者根本沒有,注釋固然不能太多,但那也是建立在代碼能自文檔化的基礎上的,面對這樣的代碼,只能搖頭。除此之外,書中代碼還出現風格不統一的情況,關於花括弧的使用,一會是K&R風格,一會是懸掛式風格,有時乾脆兩種風格混在同一段代碼中,及其容易誤導他人,使其養成不良的代碼風格。 綜上,要是學演算法的話,這本書並不是很理想,我覺得Levitin的那本演算法設計與分析基礎不錯,而這本只能算不是教材的教材吧.
『貳』 hash演算法是怎麼樣的
hash演算法是一種散列演算法,是把任意的長度的輸入,轉換成固定的額輸出,福鼎的輸出,輸出的是散列值。在空間的比較中,輸入的空間是遠大於輸出的散列值的空間,不同輸入散列成同樣的輸出,一般很難從輸出的散列值獲取輸入值的。
常用的hash函數有直接取余法、乘法取整法,平方取中法。在直接取余法中,質數用到的比較多,在乘法取整法中,主要用於實數,在平方取中法裡面,平方後取中間的,每位包含的信息比較多些。
Hash在管理數據結構中的應用
在用到hash進行管理的數據結構中,就對速度比較重視,對抗碰撞不太看中,只要保證hash均勻分布就可以。比如hashmap,hash值(key)存在的目的是加速鍵值對的查找,key的作用是為了將元素適當地放在各個桶里,對於抗碰撞的要求沒有那麼高。
換句話說,hash出來的key,只要保證value大致均勻的放在不同的桶里就可以了。但整個演算法的set性能,直接與hash值產生的速度有關,所以這時候的hash值的產生速度就尤為重要。
『叄』 如何評價一個演算法的好壞
首先,這個演算法必須是正確的
其次,好的演算法應該是友好的,便於人們理解和交流,並且是機器可執行的。
這個演算法還需要足夠健壯,即當輸入的數據非法或不合理時,也能適當的做出正確的反應或進行相應的處理
最後它還必須擁有高效率和低存儲量要求。
也就是所謂的時間復雜度和空間復雜度
1.時間復雜度
定義:在計算機科學中,演算法的時間復雜度是一個函數,他定量描述了該演算法的運行時間.一個演算法執行所耗費的時間,從理論上講,只有你把你的程序放機器上跑起來,才能知道.然而我們有一套時間復雜度的分析方式.一個演算法所花費的時間與其中語句的執行次數成正比例.演算法中的基本操作的執行次數,為演算法的時間復雜度.
2.時間復雜度為什麼不使用時間來衡量而使用基本語句的運行次數來衡量?
演算法的執行時間依賴於具體的軟硬體環境,所以,不能用執行時間的長短來衡量演算法的時間復雜度,而要通過基本語句執行次數的數量級來衡量。
3.時間復雜度的O漸進表示法(Big O notation)
是用於描述函數漸進行為的數學符號.
大O階方法推導:
計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
如果演算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果演算法中包含並列的循環,則將並列循環的時間復雜度相加。例如:
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο(n2),則整個演算法的時間復雜度為Ο(n+n2)=Ο(n2)。
4.時間復雜度的:最優、平均、最差情況,為什麼時間復雜度看的是最差情況?
最差情況下的復雜度是所有可能的輸入數據所消耗的最大資源,如果最差情況下的復雜度符合我們的要求,我們就可以保證所有的情況下都不會有問題。
某些演算法經常遇到最差情況。比如一個查找演算法,經常需要查找一個不存在的值。
也許你覺得平均情況下的復雜度更吸引你,可是平均情況也有幾點問題。第一,難計算,多數演算法的最差情況下的復雜度要比平均情況下的容易計算的多,第二,有很多演算法的平均情況和最差情況的復雜度是一樣的. 第三,什麼才是真正的平均情況?如果你假設所有可能的輸入數據出現的概率是一樣的話,也是不合理的。其實多數情況是不一樣的。而且輸入數據的分布函數很可能是你沒法知道。
考慮最好情況的復雜度更是沒有意義。
5.如何求解:二分查找、遞歸求階乘、遞歸斐波那契的時間復雜度?
二分查找:通過折紙查找求解時間復雜度為O(logN);
遞歸求階乘:數基本操作遞歸N次得到時間復雜度為O(N);
遞歸斐波那契:分析得出基本操作遞歸了2N次,時間復雜度為O(2N);
6.什麼是空間復雜度?
空間復雜度是對一個演算法在運行過程中臨時佔用存儲空間大小的度量.空間復雜度不是程序佔用了多少bytes的空間,因為這個也沒太大意義,所以空間復雜度算的是變數的個數.空間復雜度計算規則基本跟時間復雜度類似,也使用大O漸進法表示.
7.如何求空間復雜度? 普通函數&遞歸函數
一個演算法的空間復雜度只考慮在運行過程中為局部變數分配的存儲空間的大小,它包括為參數表中形參變數分配的存儲空間和為在函數體中定義的局部變數分配的存儲空間兩個部分。若一個演算法為 遞歸演算法,其空間復雜度為遞歸所使用的堆棧空間的大小,它等於一次調用所分配的臨時存儲空間的大小乘以被調用的次數(即為遞歸調用的次數加1,這個1表示開始進行的一次非遞歸調用)。演算法的空間復雜度一般也以數量級的形式給出。如當一個演算法的空間復雜度為一個常量,即不隨被處理數據量n的大小而改變時,可表示為O(1);當一個演算法的空間復雜度與以2為底的n的對數成正比時,可表示為O(log2n);當一個演算法的空間復雜度與n成線性比例關系時,可表示為O(n).若形參為數組,則只需要為它分配一個存儲由實參傳送來的一個地址指針的空間,即一個機器字長空間;若形參為引用方式,則也只需要為其分配存儲一個地址的空間,用它來存儲對應實參變數的地址,以便由系統自動引用實參變數。
8. 分析遞歸斐波那契數列的:時間、空間復雜度,並對其進行優化,偽遞歸優化->循環優化
long long Fib(int N) {
if (N < 3)
return 1;
return Fib(N - 1) + Fib(N - 2);
}
普通遞歸實現的斐波那契數列:
時間復雜度:O(2^n)
計算並根據O漸進表示法得出時間復雜度.
空間復雜度:O(N);遞歸深度乘以(每一次遞歸的空間佔用{有輔助空間或常量})
偽遞歸優化:
long long fib (long long first, longlong second, int N) {
if(N <3)
return 1;
if(N == 3)
return first + second;
return fib(second, first+second,N-1);
}
時間復雜度:
O(N);
遞歸深度乘以每次遞歸的循環次數
空間復雜度:
O(1)或O(N)
關鍵看編譯器是否優化,優化則為O(1)否則O(N);
循環優化:
long long Fib(int N) {
long long first = 1;
long long second = 1;
long long ret = 0;
for (int i = 3; i <= N ; ++i) {
ret = first + second;
first = second;
second = ret;
}
return second;
}
時間復雜度:O(N);
空間復雜度:O(1);
9.常見時間復雜度
常見的演算法時間復雜度由小到大依次為: Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!) Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要演算法中不存在循環語句,其時間復雜度就是Ο(1)。Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)稱為多項式時間,而Ο(2n)和Ο(n!)稱為指數時間。
『肆』 如何衡量一個演算法的優劣有哪些標准
如何衡量一個演算法的優劣,見人見智。一個好的演算法首先是要能夠滿足場景的需求,其次是在能夠最大限度的節省資源(最低成本原則),最後是實現邏輯簡單,比較容易理解(本質上也是最低成本原則)。但是,在現實中硬體資源不變,演算法不變情況下,演算法執行的效率提高,相對應往往是資源消耗增加。一個合格的演算法是在一個可以接受的范圍內滿足場景需求,而一個優秀的演算法則是在滿足場景需求的基礎上,最大限度的節省資源,簡化邏輯。
比如我要完成一項計算任務,要求是在5分鍾執行完成。現在有演算法1:需要執行1分鍾,消耗內存8G;演算法2需要執行3分鍾,需要消耗內存256M。那麼,我們應該如何選擇呢?首先,這兩種方案都能滿足我們的需求;其次:演算法1的需要消耗的資源是演算法2的32倍,演算法1的效率是演算法2的3倍。在這種滿足需求的情況下,往往更傾向於選擇演算法2。衡量一個演算法的優劣往往要評估多方因素,結合實踐,綜合比較最終得出結論。
衡量一個演算法的的標准主要有3個: 演算法的執行效率 , 演算法的內存消耗 和 演算法的穩定性 。
『伍』 演算法的特性是怎麼樣的
演算法的基本特性
1、有窮性
演算法的有窮性是指演算法必須能在執行有限個步驟之後終止;
2、確切性
演算法的每一步驟必須有確切的定義;
3、輸入項
一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定出了初始條件;
4、輸出項
一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的演算法是毫無意義的。
演算法分類
一、有限的,確定性演算法這類演算法在有限的一段時間內終止。他們可能要花很長時間來執行指定的任務,但仍將在一定的時間內終止。這類演算法得出的結果常取決於輸入值。
二、有限的,非確定演算法這類演算法在有限的時間內終止。然而,對於一個(或一些)給定的數值,演算法的結果並不是唯一的或確定的。
三、無限的演算法是那些由於沒有定義終止定義條件,或定義的條件無法由輸入的數據滿足而不終止運行的演算法。通常,無限演算法的產生是由於未能確定的定義終止條件。
『陸』 演算法工程師的就業前景如何
人工智慧工作最受歡迎。演算法工程師平均招聘工資建議達到25978元。由於人才匱乏,企業競爭激烈,平均加薪超過7%。該市90%以上的人工智慧高薪工作都在天河區.近日,由廣州天河人才港和BOSS直接就業研究院聯合發布的《廣州市天河區2018年1-4月人才趨勢報告》,展示了該地區的主流發展趨勢:IAB已經成為天河區,和天河區創新型企業和大型企業布局或發展的核心主方向,企業以高薪吸引更多的行業優秀人才。「天河區企業渴望以高薪攫取IAB人才,這意味著企業要在這些行業中發揮實力。
『柒』 如何看待計算機演算法
計算機演算法就是通過一定的步驟求解對應的問題。
因為計算機的資源有限,所以演算法需要考慮計算的時間和需要的存儲空間,也就是常說的時間復雜度和空間復雜度。
一個演算法必須具備以下性質:
(1)演算法首先必須是正確的,即對於任意的一組輸入,包括合理的輸入與不合理的輸入,總能得到預期的輸出。如果一個演算法只是對合理的輸入才能得到預期的輸出,而在異常情況下卻無法預料輸出的結果,那麼它就不是正確的。
(2)演算法必須是由一系列具體步驟組成的,並且每一步都能夠被計算機所理解和執行,而不是抽象和模糊的概念。
(3)每個步驟都有確定的執行順序,即上一步在哪裡;下一步是什麼,都必須明確,無二義性。
(4)無論演算法有多麼復雜,都必須在有限步之後結束並終止運行;即演算法的步驟必須是有限的。在任何情況下,演算法都不能陷入無限循環中。