數據結構和算法 筆記

參考:《用python解決數據結構和算法》python

O(f(n))提供了計算過程當中實際步數的近似值。函數 f(n)是原始函數 T(n)中主導部分的簡化表示。【T(N)是賦值語句數量算法

T(n) = 5n²+27n+1005 當 n 愈來愈大時,咱們就能夠忽略其他項,只關注用 5n²來表明 T(n)的近似值了。一樣,係數 5 的做用也會越來
越小,也能夠忽略。咱們就會說函數 T(n)的數量級 f(n) = n²,即 O(n²)數據結構

 修改列表:這個「append」操做是 O(1)。然而,串聯運算符+是 O(k),這裏 k是指正在被鏈接的列表的大小 app

pop 操做每次從列表的最後一位刪除元素時複雜度爲 O1),而將列表的第一個元素或中間任意一個位置的元素刪除時,複雜度則爲 On).這種執行方式會讓 index 索引
操做的複雜度降爲 O1
數據結構和算法


字典:條目的訪問和賦值都是 O(1)的時間複雜度。字典的另外一個重要的操做是所謂的「包含」。檢查一個鍵是否存在於字典中也只需 O(1)的時間。

================
函數

棧: 添加項和移除項都發生在同一「端」。這一端一般被稱爲「頂」。另外一端的頂部被稱爲「底」。 大數據

隊列: 新元素的加入在隊列的一端,這一端叫作隊尾rear),已有元素的移除發生在隊列的另外一端,叫作隊首front
雙端隊列 : 元素能夠在隊首插入或刪除,也能夠在隊尾插入或刪除
spa

鏈表的節點:指針

 考慮一個有 n 個節點的鏈表, isEmpty 方法複雜度是 O(1),由於它只須要檢查鏈表的頭指針是否爲 None。對於方法 size,
則總須要 n 個步驟,由於除了遍歷整個鏈表之外,沒有辦法知道鏈表的節點數。所以, size 方法的複雜度是 O(n)。
blog

無序列表的 add 方法的複雜度是 O(1),由於咱們永遠只須要在鏈表的頭部簡單地添加一個新的節點

search、 remove 和在有序列表中的 add 方法,須要遍歷。儘管在平均狀況下,它們可能只須要遍歷一半的節點,但這些方法的複雜度都是 O(n),
=============

 二分法:結束於一個只有一項的列表 ,n/2^i=1 ,解得i=logn所以,二分搜索的複雜度是O(log(n))
散列: 它僅能在每個數據項在散列表中佔有不一樣的槽的狀況下才能正常運做

散列函數:
1 摺疊法建立散列函數的基本步驟是:首先將數據成相同長度的片斷(最後一個片斷長度可能不等)。接着將這些片斷相加,再求餘獲得其散列值。例如,若是咱們有一串電話號碼436-
555-4601,咱們能夠兩個一組將這個號碼分紅5段(43,64,55,46,01)。而後相加獲得。若是咱們假設散列表有11個槽,咱們就須要將和進行求餘。 219%11 = 10 

2 平方取中法。咱們首先將數據取平方,而後取平方數的某一部分。例如數據項是44,咱們首先計算。接着取出中間的兩位數93而後再進行求餘運算
解決衝突: 1) 再散列:rehash(pos)=(pos+skip)%sizeoftable  2)容許每個槽都能填充一串而不是一個數據

冒泡排序:若是在整個排序過程當中沒有交換,咱們就可判定列表已經排好。所以可改良冒泡排序


歸併排序函數須要額外的空間來存放被拆分出來的兩個部分。若是列表很大的話,這額外空間將是一個很重要的因素,可能使得這種排序被運用在大數據集合時出現錯誤。

快速排序用了和歸併排序同樣分而治之的方法來得到一樣的優點,但同時不須要使用額外的存儲空間
分區過程由設置兩個位置標記開始——讓咱們叫它們左標記和右標記——在列表的第一項和最後一項。
分區過程的目標是把相對於中值在錯誤的一邊的數據放到正確的一邊,同時找到分割點。

==============《大話數據結構》
邏輯結構:集合(元素屬於同一集合),線性結構(一對一),樹形結構(一對多),圖(多對多)
物理結構:順序存儲和鏈式存儲
算法是解決特定問題求解步驟的描述

 

:

相關文章
相關標籤/搜索