Java數據結構和算法(一):簡介

  編程比如是一輛汽車,而數據結構和算法是汽車內部的變速箱。一個開車的人不懂變速箱的原理也是能開車的,同理一個不懂數據結構和算法的人也能編程。可是若是一個開車的人懂變速箱的原理,好比下降速度來得到更大的牽引力,或者經過下降牽引力來得到更快的行駛速度。那麼爬坡時使用1檔,即可以得到更大的牽引力;下坡時便使用低檔限制車的行駛速度。回到編程而言,好比將一個班級的學生名字要臨時存儲在內存中,你會選擇什麼數據結構來存儲,數組仍是ArrayList,或者HashSet,或者別的數據結構。若是不懂數據結構的,可能隨便選擇一個容器來存儲,也能完成全部的功能,可是後期若是隨着學生數據量的增多,隨便選擇的數據結構確定會存在性能問題,而一個懂數據結構和算法的人,在實際編程中會選擇適當的數據結構來解決相應的問題,會極大的提升程序的性能。編程

一、數據結構

  數據結構是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關係的數據元素的集合。數組

  一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。數據結構每每同高效的檢索算法和索引技術有關。數據結構

  1、數據結構的基本功能

  ①、如何插入一條新的數據項數據結構和算法

  ②、如何尋找某一特定的數據項性能

  ③、如何刪除某一特定的數據項學習

  ④、如何迭代的訪問各個數據項,以便進行顯示或其餘操做設計

  2、經常使用的數據結構

   

 

  這幾種結構優缺點以下:先有個大概印象,後面會詳細講解!!!調試

  

二、算法

  算法簡單來講就是解決問題的步驟。code

  在Java中,算法一般都是由類的方法來實現的。前面的數據結構,好比鏈表爲啥插入、刪除快,而查找慢,平衡的二叉樹插入、刪除、查找都快,這都是實現這些數據結構的算法所形成的。後面咱們講的各類排序實現也是算法範疇的重要領域。

  一、算法的五個特徵

  ①、有窮性:對於任意一組合法輸入值,在執行又窮步驟以後必定能結束,即:算法中的每一個步驟都能在有限時間內完成。

  ②、肯定性:在每種狀況下所應執行的操做,在算法中都有確切的規定,使算法的執行者或閱讀者都能明確其含義及如何執行。而且在任何條件下,算法都只有一條執行路徑。

  ③、可行性:算法中的全部操做都必須足夠基本,均可以經過已經實現的基本操做運算有限次實現之。

  ④、有輸入:做爲算法加工對象的量值,一般體如今算法當中的一組變量。有些輸入量須要在算法執行的過程當中輸入,而有的算法表面上能夠沒有輸入,實際上已被嵌入算法之中。

  ⑤、有輸出:它是一組與「輸入」有肯定關係的量值,是算法進行信息加工後獲得的結果,這種肯定關係即爲算法功能。

  2、算法的設計原則

  ①、正確性:首先,算法應當知足以特定的「規則說明」方式給出的需求。其次,對算法是否「正確」的理解能夠有如下四個層次:

        1、程序語法錯誤。

        2、程序對於幾組輸入數據可以得出知足須要的結果。

        3、程序對於精心選擇的、典型、苛刻切帶有刁難性的幾組輸入數據可以得出知足要求的結果。

        4、程序對於一切合法的輸入數據都能獲得知足要求的結果。

        PS:一般以第 三 層意義的正確性做爲衡量一個算法是否合格的標準。

  ②、可讀性:算法爲了人的閱讀與交流,其次纔是計算機執行。所以算法應該易於人的理解;另外一方面,晦澀難懂的程序易於隱藏較多的錯誤而難以調試。

  ③、健壯性:當輸入的數據非法時,算法應當恰當的作出反應或進行相應處理,而不是產生莫名其妙的輸出結果。而且,處理出錯的方法不該是中斷程序執行,而是應當返回一個表示錯誤或錯誤性質的值,以便在更高的抽象層次上進行處理。

  ④、高效率與低存儲量需求:一般算法效率值得是算法執行時間;存儲量是指算法執行過程當中所須要的最大存儲空間,二者都與問題的規模有關。

  前面三點 正確性,可讀性和健壯性相信都好理解。對於第四點算法的執行效率和存儲量,咱們知道比較算法的時候,可能會說「A算法比B算法快兩倍」之類的話,但實際上這種說法沒有任何意義。由於當數據項個數發生變化時,A算法和B算法的效率比例也會發生變化,好比數據項增長了50%,可能A算法比B算法快三倍,可是若是數據項減小了50%,可能A算法和B算法速度同樣。因此描述算法的速度必需要和數據項的個數聯繫起來。也就是「大O」表示法,它是一種算法複雜度的相對錶示方式,這裏我簡單介紹一下,後面會根據具體的算法來描述。

  相對(relative):你只能比較相同的事物。你不能把一個作算數乘法的算法和排序整數列表的算法進行比較。可是,比較2個算法所作的算術操做(一個作乘法,一個作加法)將會告訴你一些有意義的東西;

  表示(representation):大O(用它最簡單的形式)把算法間的比較簡化爲了一個單一變量。這個變量的選擇基於觀察或假設。例如,排序算法之間的對比一般是基於比較操做(比較2個結點來決定這2個結點的相對順序)。這裏面就假設了比較操做的計算開銷很大。可是,若是比較操做的計算開銷不大,而交換操做的計算開銷很大,又會怎麼樣呢?這就改變了先前的比較方式;

  複雜度(complexity):若是排序10,000個元素花費了我1秒,那麼排序1百萬個元素會花多少時間?在這個例子裏,複雜度就是相對其餘東西的度量結果。

  而後咱們在說說算法的存儲量,包括:

  程序自己所佔空間;

  輸入數據所佔空間;

  輔助變量所佔空間;

  一個算法的效率越高越好,而存儲量是越低越好。

三、總結

  本篇文章咱們簡單的介紹了數據結構和算法的概念,算法是解決問題的步驟,而數據結構的實現離不開算法,可能理解起來比較模糊,不用擔憂,後面咱們會在具體的數據結構和算法實現過程當中詳細講解。

相關文章
相關標籤/搜索