數據結構和算法(1)-----簡介

數據結構和算法是編程的基礎,優秀的開源項目和JDK源碼可以看到裏面充斥着這些,那,如果你覺得看這些源碼吃力的話,比如netty中使用了雙向鏈表,如果你練概念都不清楚,就更別談能不能看懂了,看了網上其他人的文章,有的寫的真的非常好,我就借鑑一下,順便把自己的理解也share下。

1.數據結構

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

數據結構的基本功能

  • 如何插入一條新的數據
  • 如何查找指定的數據
  • 如何刪除指定的數據
  • 如何實現迭代,對所有數據進行操作

常用數據結構

先看下這些數據結構的優缺點

2.算法

五個特徵

  • 有窮性:對於任意一組合法輸入值,在執行又窮步驟之後一定能結束,即:算法中的每個步驟都能在有限時間內完成。
  • 確定性:在每種情況下所應執行的操作,在算法中都有確切的規定,使算法的執行者或閱讀者都能明確其含義及如何執行。並且在任何條件下,算法都只有一條執行路徑。
  • 可行性:算法中的所有操作都必須足夠基本,都可以通過已經實現的基本操作運算有限次實現之。
  • 有輸入:作爲算法加工對象的量值,通常體現在算法當中的一組變量。有些輸入量需要在算法執行的過程中輸入,而有的算法表面上可以沒有輸入,實際上已被嵌入算法之中。
  • 有輸出:它是一組與“輸入”有確定關係的量值,是算法進行信息加工後得到的結果,這種確定關係即爲算法功能。 

設計原則

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

        一、程序語法錯誤。

        二、程序對於幾組輸入數據能夠得出滿足需要的結果。

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

        四、程序對於一切合法的輸入數據都能得到滿足要求的結果。

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

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

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

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

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

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

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

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

  然後我們在說說算法的存儲量,包括:

  程序本身所佔空間;

  輸入數據所佔空間;

  輔助變量所佔空間;

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章