資料結構和演算法學習筆記

2021-10-18 12:55:02 字數 1610 閱讀 5569

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

簡單來說資料結構就是關係,元素相互之間存在的一種或多種特定關係的集合。

1.1 邏輯結構和物理結構

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

2.1 演算法的特性

演算法具有五個特徵:輸入,輸出,又窮性、確定性和可行性。

(1)演算法要有零個或多個輸入;

(2)演算法至少有乙個或多個輸出;

(3)有窮性指演算法在執行有限步驟之後,自動結束而不會出現無限迴圈,並且每乙個步驟在可接受的時間內完成;

(4)確定性指演算法的每乙個步驟都具有確定的含義,不會出現二定義性;

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

2.2 演算法設計的要求

演算法設計的要求有:正確性、可讀性、健壯性、時間效率高和儲存量低。

(1)正確性

演算法的正確性是指演算法至少應該具有輸入、輸出和加工處理無歧義性、能夠正確反映問題的需求、能夠得到問題的正確答案。

大體分為以下四個層次:

a.演算法程式沒有語法錯誤;

b.演算法程式對合法輸入能夠產生滿足要求的輸出;

c.演算法程式對於非法輸入能夠產生滿足規格的說明;

d.演算法程式對於故意刁難的測試輸入都有滿足要求的輸出結果。

(2)可讀性

演算法設計的另一目的是為了便於閱讀、理解和交流,我們寫**的目的不僅僅是為了讓計算機執行,也為了便於他人閱讀和自己日後閱讀修改。

(3)健壯性

當輸入資料不合法時,演算法也能做出相關處理,而不是產生異常、崩潰或莫名其妙的結果。

(4)時間效率高和儲存量低。

乙個好的演算法應該具備時間效率高和儲存量低的特點。

2.3 演算法效率的度量方法

乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模(輸入規模指輸入量的多少)。

(1)時間複雜度

在進行演算法分析時,語句總的執行次數t(n)是關於問題n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。 記做: t(n) = o(f(n))。它表示隨著時間規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度,簡稱為時間複雜度。其中f(n)是問題規模n的某個函式。

一般情況下,隨著輸入規模n的增大,t(n)增長最慢的演算法為最優演算法。

由於時間 2x= n 得到 x = log(2)n,所以這個迴圈的時間複雜為o(logn)

o(1) < o(logn) < o(n) < o(nlogn) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)

(2)空間複雜度

在寫**的時候可以用空間來換取時間的。

演算法的空間複雜度通過計算演算法所需要的儲存空間實現,s(n) = o (f(n)),其中,n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。

通常,我們都用「時間複雜度」來指執行時間的需求,用「空間複雜度」來指空間需求。

當直接讓求「複雜度」時,通常指的是時間複雜度。

資料結構和演算法學習筆記 棧

引入問題 如何實現瀏覽器的前進後退功能?如何理解棧?後進者先出,先進者後出,這個就是典型的 棧 結構 當某個資料集合只設計在一端插入和刪除資料,並且滿足後進先出的特性,我們就應該首選 棧 這種資料結構 如何實現乙個棧?用 陣列實現的叫順序棧 用鍊錶實現的鏈式棧 基於陣列實現的順序棧 public c...

資料結構與演算法學習筆記

演算法基礎篇 第一章 演算法概述 首先了解一下基本的概念 1.1 什麼是演算法呢?從字面意義上理解,演算法就是用於計算的方法,用這種方法達到預期的結果。通俗的講,演算法可以理解為乙個完整的解題步驟,由一些基本的運算和規定的運算順序組成。通過這樣的解題步驟可以解決特定的問題。演算法可以抽象出5個特徵 ...

Python內建資料結構和演算法 學習筆記

注 有空看看原始碼實現原理 nametuple 建立命名元組子類的工廠函式 counter字典的子類,提供了可雜湊物件的計數功能ordereddict字典的子類,儲存了他們被新增的順序defaultdict字典的子類,提供了乙個工廠函式,為字典查詢提供乙個預設值 更多參考 python內建模組 di...