數據結構與算法學習筆記01(引言)
引言:
看到網上一段話是這樣寫的:
“算法是程序的靈魂,爲什麼有些網站能夠在高併發和海量吞吐情況下依然堅如磐石,大家可能會說: 網站使用了服務器集羣技術、數據庫讀寫分離和緩存技術(比如memcahced和redis等),那如果我再深入的問一句,這些優化技術又是怎樣被那些天才的技術高手設計出來的呢? 我在上大學的時候就在想,究竟是什麼讓不同的人寫出的代碼從功能看是一樣的,但從運行效率上卻有天壤之別,就拿以前在軟件公司工作的實際經歷來說吧,我是做服務器的,環境是UNIX系統,功能是要支持上千萬人同時在線,並保證數據傳輸的穩定,,在服務器上線前,做過內測,一切OK,可實際上線後,服務器就支撐不住了,公司的CTO(首任sina技術總監)花了3天時間對我的代碼進行優化,再次上線,堅如磐石。那一瞬間,我認識到程序是有靈魂的,就是算法。如果你不想永遠都是一個代碼工人,不想當孬種程序員,那就花點時間來研究一下算法吧!而算法的基石是—數據結構。”
感悟頗深,於是決定克服自己浮躁的心態,靜下心來,認真學習一下數據結構與算法,爲以後在軟件編程這一條路上打上一個好的基礎。
思維導圖:
算法效率的度量:
注意:
1、判斷一個算法的效率時,函數中的常數和其他次要項常常可以忽略,更應該關注主項(最高項)的階數。
2、判斷一個算法好不好,我們只能通過少量的數據是不能做準確判斷的,很容易以偏概全。
1、算法的時間複雜度
平方階:
int i,j,n= 100;
for (i= 0;i <n;i++)
{
for(j =i;j<n;j++)
{
printf("this is a demo!");
}
}
總的執行次數爲:
n+(n-1)+(n-2)+……+1=n(n+1)/2=n2 /2+n/2
時間複雜度爲o(n2)。
對數階:
int i= 1, n = 100;
while (i<n)
{
i=i * 2;
}
循環次數:x=log(2)n
常用的時間複雜度所耗費的時間從小到大依次是:
O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) <O(2^n) < O(n!) < O(n^n)
2、算法的空間複雜度
完全可以用空間換取時間。
舉個例子說,要判斷某年是不是閏年,你可能會花一點心思來寫一個算法,每給一個年份,就可以通過這個算法計算得到是否閏年的結果。
另外一種方法是,事先建立一個有2050個元素的數組,然後把所有的年份按下標的數字對應,如果是閏年,則此數組元素的值是1,如果不是元素的值則爲0。
這樣,所謂的判斷某一年是否爲閏年就變成了查找這個數組某一個元素的值的問題。
第一種方法相比起第二種來說很明顯非常節省空間,但每一次查詢都需要經過一系列的計算才能知道是否爲閏年。
第二種方法雖然需要在內存裏存儲2050個元素的數組,但是每次查詢只需要一次索引判斷即可。