1. 程式人生 > >資料結構(一)

資料結構(一)

北京的天氣越來越涼了,秋天沒啥感受呢,冬天就到來了。親們,該穿秋褲穿秋褲哈!

咳咳...扯得有點遠了,咱們還是言歸正傳,堅持每天學習一點知識,進步一點點。

做開發的同學大家對資料結構肯定是很熟悉的,不管是接觸過關係型資料庫的,非關係型資料庫的,只要涉及到資料的操作,就免不了跟資料打交道。

可是,朋友,你真的理解,明白,懂資料結構嗎?

資料結構是一門研究非數值計算的程式設計問題的操作物件,以及它們之間的關係和操作等相關問題的學科

資料結構:是相互之間存在一種或多種特定關係的資料元素的集合

邏輯結構:

是指資料物件中資料元素之間的相互關係,其中今天我們最需要關注的問題,邏輯結構中的一下四種。

1、集合結構:集合結構中的資料元素除了同屬於一個集合外,它們之間沒有其他關係。各個資料元素是“平等”的。

2、線性結構:線性結構中的資料元素之間是一對一的關係

3、樹形結構:樹形結構中的資料元素之間存在一種一對多的層次關係

4、圖形結構:圖形結構資料元素是多對多的關係

物理結構(儲存結構):

物理結構是指資料的邏輯結構在計算機中的儲存形式

1、順序儲存結構:是吧資料元素存放在地址連續的儲存單元裡,其資料間的邏輯關係和物理關係是一致的。

  我們實際應用中的資料就是一種順序儲存結構,宣告資料的時候告訴它需要多大的空間,宣告以後就會在記憶體中開闢出來一段連續的記憶體空間排放資料

2、鏈式儲存結構:是吧資料元素存放在任意的儲存單元裡,這組儲存單元可以是連續的,也可以是不連續的。

  資料元素的儲存關係並不能反映其邏輯關係,因此呢需要用一個指標存放資料元素的地址,這樣通過地址就可以找到相關聯資料元素的位置。

  很明顯啊,鏈式儲存比順序儲存靈活多了,資料存在哪裡不重要,只要有一個指標存放了相應的地址就能找到它了。

經典演算法:

上面呢我們簡單的瞭解了下資料結構的基本概念,下面我們在實際演算法當中使用一下。

我們可能都聽說搞數學教高斯小學時候的一個故事,有一天,高斯的老師給大家出了一道數學題,要求大家計算出1到100以內數的加和。一個一個加感覺好累,高斯沒有跟大家一樣,他有自己的辦法,分分鐘就搞定得到結果:

我們大家一般看到這個題目的時候,可能會這樣寫:

int
sum =0          /*執行1次*/ for(var i=0;i<=100;i++){  /*執行n+1次*/ sum = sum + 1;      /*執行n次*/ } console.log(sum)       /*執行1次*/

這個計算的時間複雜度是 O(n) 線性階

可以肯定的是,上面這個可以得到正確答案,可是不夠好,

高斯在這裡就比我們一般人聰明多了,我們來看看高斯的思路:

sum = 1+2+3+...+99+100
sum = 100+99+...+3+2+1
2*sum = 101 * 100

int sun =0, n = 100; /*執行1次*/
sum = (1+n) * n/2   /*執行1次*/
console.log(sum);   /*執行1次*/
這個計算的時間複雜度是 O(1) 常數階

真的是沒有對比就沒有傷害啊,同樣的結果人家的方法可以比我們一般人的方法在執行上省卻很多次運算,大家可能覺得不就是100以內的求和嗎,這兩個時間也差不多啊。是的,可是如果是1000,10000,100000甚至更多呢,人家的不管多大的數值,都是隻有三次運算就OK了,再看我們第一次的方法,n越大,我們花費的時間會越多,效率會越來越低,效能會越來越差。

我們聊了這麼多,那到底什麼事演算法呢?

演算法:演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令標示一個或者多個操作。

演算法有什麼特性呢?

1、輸入輸出:這個很容易理解吧,演算法說白了就是計算麼,它要有零個或者多個輸入,至少一個或多個的輸出,演算法一定要有輸出,如果沒有輸出,那演算法還有什麼意義

2、有窮性:指演算法在執行有限的步驟以後,自動結束不會無限迴圈,並且每一個步驟在可接受的時間內完成。

3、確定性:演算法的每一步驟都具有確定的含義,不會出現二義性

4、可行性:演算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成。

 

 

 

個人原創,歡迎拍磚!