數據結構(一)

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

咳咳...扯得有點遠了,我們仍是言歸正傳,堅持天天學習一點知識,進步一點點。數據庫

作開發的同窗你們對數據結構確定是很熟悉的,不論是接觸過關係型數據庫的,非關係型數據庫的,只要涉及到數據的操做,就免不了跟數據打交道。數據結構

但是,朋友,你真的理解,明白,懂數據結構嗎?性能

數據結構是一門研究非數值計算的程序設計問題的操做對象,以及它們之間的關係和操做等相關問題的學科學習

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

邏輯結構:

是指數據對象中數據元素之間的相互關係,其中今天咱們最須要關注的問題,邏輯結構中的一下四種。設計

一、集合結構:集合結構中的數據元素除了同屬於一個集合外,它們之間沒有其餘關係。各個數據元素是「平等」的。指針

二、線性結構:線性結構中的數據元素之間是一對一的關係code

三、樹形結構:樹形結構中的數據元素之間存在一種一對多的層次關係對象

四、圖形結構:圖形結構數據元素是多對多的關係

物理結構(存儲結構):

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

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

  咱們實際應用中的數據就是一種順序存儲結構,聲明數據的時候告訴它須要多大的空間,聲明之後就會在內存中開闢出來一段連續的內存空間排放數據

二、鏈式存儲結構:是吧數據元素存放在任意的存儲單元裏,這組存儲單元能夠是連續的,也能夠是不連續的。

  數據元素的存儲關係並不能反映其邏輯關係,所以呢須要用一個指針存放數據元素的地址,這樣經過地址就能夠找到相關聯數據元素的位置。

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

經典算法:

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

咱們可能都據說搞數學教高斯小學時候的一個故事,有一天,高斯的老師給你們出了一道數學題,要求你們計算出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越大,咱們花費的時間會越多,效率會愈來愈低,性能會愈來愈差。

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

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

算法有什麼特性呢?

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

二、有窮性:指算法在執行有限的步驟之後,自動結束不會無限循環,而且每個步驟在可接受的時間內完成。

三、肯定性:算法的每一步驟都具備肯定的含義,不會出現二義性

四、可行性:算法的每一步都必須是可行的,也就是說,每一步都可以經過執行有限次數完成。

 

 

 

我的原創,歡迎拍磚!

相關文章
相關標籤/搜索