資料結構與演算法

天元正一發表於2020-12-28

數學拾遺 微積分 線性代數 考研:2018啟航張宇高數遠端面授

前言

1.演算法學習與克服恐懼
知曉演算法形成和實現原理;
面對新問題為什麼膽怯焦慮不安:問題描述定義未明?對概念不熟悉?不夠自信?
解決辦法:1.首先明確這些問題就算大神也不是一步就能做出來的,需要積累;
2.相信自己也有解決這種辦法的能力,沒有可以積累,不是我不適合,是問題不適合;
3.會用解決方法就是一種方法,這些才是程式設計最後的難題,一下解決了程式設計就沒意思了;
4.演算法需要考慮儲存空間和記憶體等問題:比如分段排序
資料量 有/無序 存在位置是否影響(複雜度分析)

一 工作中常用演算法

雜湊表

目的:為了根據資料的部分內容(關鍵字),直接計算出存放完整資料的記憶體地址
原理:通過某種演算法(雜湊函式)直接根據關鍵字計算出元素的存放地址,由於無需遍歷,所以效率很高;
①雜湊函式實現:

http://blog.chinaunix.net/uid-26548237-id-3483650.html

http://www.cnblogs.com/polly333/p/4760275.html

1.排序

http://forum.eepw.com.cn/thread/280064/1
浙大資料結構
http://www.icourse163.org/learn/ZJU-93001?tid=1002019005#/learn/forumindex
效率:快排》冒泡》插入=選擇;
但快排抵抗垃圾資料能力太差;
推薦用歸併排序,速度僅次於快排,抵抗垃圾資料的能力較強

目前排列最快的是索引排序(大牛們都這樣說的)。
另外俺知道兩種排序方法
1,就是對資料庫直接排序。可以使用sql語句對後端資料排序。使用這種方法我覺得對你那兩種情況都一樣。
2,分段讀取後端的資料,然後利用DataSet(BCB的牛技術)一類控制元件的Data屬性。首先判斷Data中的資料是否已經排序 如果沒有排序就排序,然後再讀下一段資料,再判斷,以此類推。
那種更快,這得根據實際情況,都有優缺點。

100萬行的資料別說排序,就是讀取也是個問題!能否放到StringGrid,即使放得能否滾動檢視?
建議每次讀取部分資料,比如按行讀取,指定一個索引值,判斷第2列數是否和索引對應,如果對應就讀入並寫入到StringGrid裡。

建議使用快速排序或堆排序。
如果在外儲存器中,可使用歸併排序。
http://bbs.csdn.net/topics/190147318

歸併排序

未完成
void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
{
int i = startIndex,j=midIndex+1,k=startIndex;
while(i!=midIndex+1&&j!=endIndex+1)
{
if(sourceArr[i]>sourceArr[j])
tempArr[k++] = sourceArr[j++];
else
tempArr[k++] = sourceArr[i++];
}

2.插入
算導看到2.2分析演算法 https://pan.baidu.com/disk/home#list/vmode=list&path=%2F%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%2F%E6%B7%98%E5%AE%9D%E7%AE%97%E5%AF%BC

二 基本資料結構-棧,佇列,二叉樹與堆

堆:malloc申請儲存區

先研究樹再圖;查詢演算法擴充套件思考 例子:8球中有一瑕疵球通過2次稱量求出;
是什麼?為什麼需要?怎麼實現?生活中例子,結合工作,區別(補圖 舉例 作用 對資料結構的進一步理解:純軟體思路的人為實現,用順序或鏈式的儲存方式定義資料邏輯結構,思考:資料結構的實現蘊含演算法的思想嗎)


紅黑樹(粵嵌書P273)伸縮性

下一步:雜湊表(適用範圍
快速查詢,刪除的基本資料結構,通常需要總資料量可以放入記憶體)
資料量大有優勢-空間換時間

Hash與Map的區別
權衡三個因素: 查詢速度, 資料量, 記憶體使用,可擴充套件性,有序性

演算法速度級別(查詢?):常數級O(1)>O(log2n)>n(線性階)>線性對數階nlog2n>平方階n*n>立方階>k次
方階>指數階(2的n次方)

演算法執行期間所需要的儲存空間包括3個部分:
·演算法程式所佔的空間;
·輸入的初始資料所佔的儲存空間;
·演算法執行過程中所需要的額外空間。
在許多實際問題中,為了減少演算法所佔的儲存空間,通常採用壓縮儲存技術。

連結串列

2636843-59e102262eedded2.png
單連結串列(空頭)插入節點.png
2636843-d2ad745543322c6b.png
紅線部分什麼意思.png

棧:先進後出

作用(將一個整數,轉換成指定的進位制 2 8 16)

佇列:先進先出

二叉樹的遍歷

前序,中序,後序,按層
  前序:根---》左---》右
      最開始的根一定是最頂層的那個根節點
      
  中序:左---》根---》右   如何實現(貝訊筆試)
      最開始的左是圖中最底層,最左邊的那個左孩子
  後序:左---》右---》根
  按層:從上到下,從左到右

套路:先排能看到的,然後用規則填充;規則很明確,但是結合具體的二叉樹去分析的時候,注意:每個節點有多重身份(根,左,右)--->你在套用這些規則的時候,你必須遞迴地去套用一次口訣
(應用:樹結構.在一個樹裡找指定的結點.寫遊戲的時候,我把場景放到節點上,這樣出了一個場景,就切到父節點的場景.這個叫做'入口'技術,通過變換節點在樹中的位置,開啟同一個門,就可以到不同的地方.泛泛的二叉樹沒怎麼用,不過排序二叉樹倒是不錯,提高查詢速度.我在遊戲裡面用了,很有效果哦:))

用的最多的應該是平衡二叉樹,有種特殊的平衡二叉樹紅黑樹,查詢、插入、刪除的時間複雜度最壞為O(log n)Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬記憶體的管理,都是通過紅黑樹去實現的。還有哈夫曼樹編碼方面的應用。B-Tree,B+-Tree在檔案系統中的應用。如有錯誤或遺漏還請各位指正補充。

二叉樹中的二叉查詢樹,可以使用 ”中序遍歷“ 來排序。

檔案系統和資料庫系統一般都採用樹(特別是B樹)的資料結構資料,主要為排序和檢索的效率。二叉樹是一種最基本最典型的排序樹,用於教學和研究樹的特性,本身很少在實際中進行應用,因為缺點太明顯了

二叉樹:可為空 (深)度與層 表示式
三叉樹:
棧:底壓棧代表只能彈倒序 題目意思是動態的 不是一個順序
圖:領接表 廣(深)度優先
快速排序

三 複雜資料結構

四 實用演算法-無人機工控等(PID學習筆記)

PID是什麼?有什麼用?怎麼實現?應用場景?用C++如何實現?發展及擴充?使用注意問題?

1.控制演算法

有哪些:二位式控制(弊端:返回值單一 不能達到理想值 延遲 效率低)
pv(控制物件)當前狀態值 sv使用者設定(目標)值(按鈕或上拉電阻傳入設定值給到演算法,

演算法輸出out去控制負載,負載再將返回值經感測器去到演算法)

2.PID如何解決(思想)

偏差E=Sv-Pv 不同:歷史偏差(儲存器) Pv取樣值(開機以來每

隔固定時間與Sv相減然後儲存,又分為:歷史偏差 當前偏差 最近偏差,疊加三次的值然

後輸出out)

分析:
1.開機以來感測器所有的取樣點的資料序列
序列:x1(第一秒鐘值) x2.....xk,
2.分析取樣點資料序列,挖掘三方面資訊
①Ek =Sv-Xk現在時間點感測器回來值與設定值偏差程度

0:控制沒達標
=0:剛好
<0:超標

POUT = Kp*Ek+OUT0 放大偏差 ----比例控制 PWM(脈衝)訊號-側面控制負載 缺陷:值

相等就失控(沒誤差控制不了)

②Sk = E1+E2+.....Ek-1+Ek //可正可負

0:大多數時間未達標 =0: <0:
IOUT=Kp*Sk+OUT0->積分演算法(考慮了歷史狀態)->+OUT0代表歷史沒有問題
把問題控制在沒有發生之前

③最近兩次偏差相減 Dk = E(k)-E(k-1)//最後兩個數想減

0: 偏差更大,越來越偏離目標(趨勢)
DOUT = Kp*Dk+OUT0 --微分控制(不能單獨行動)

2.PID演算法 -微分和定積分
2.1 卡爾曼濾波
2.2最優估計演算法

2.3為什麼不用尤拉角來表示旋轉而要引入四元數
一方面是因為尤拉角微分方程中包含了大量的三角運算,這給實時解算帶
來了一定的困難。而且當俯仰角為90度時方程式會出現神奇的“GimbalLock”。
所以尤拉角方法只適用於水平姿態變化不大的情況,而不適用於全姿態飛行器的姿態確定。
四元數法只求解四個未知量的線性微分方程組,計算量小,易於操作,是比較實用的工程方法。

四元數是一種超複數。如把四元數的集合考慮成多維實數空間的話,四元數就代表
k i j 著一個四維空間,相對於複數為二維空間。
簡而言之,四元數包含了剛體旋轉的所有資訊,而在四旋翼飛行器的姿態解算中,
往往使用的是四元數微分方程對四元數進行更新

define Kp 2.0f //加速度權重,越大則向加速度測量值收斂越快

define Ki 0.001f //誤差積分增益

五 STL

Vector向量容器 動態陣列 節省儲存

iterator迭代器 智慧指標 被其它嵌入內部

六 圖

算導2.2答案 http://www.cnblogs.com/geniuspig/p/7215503.html
http://www.bianceng.cn/Programming/C/201306/36691.htm
http://www.jb51.net/article/55232.htm
http://blog.csdn.net/myan/article/details/649018
http://www.bianceng.cn/Programming/C/201306/36691.htm

應用例項

1.廣州BRT

實時到站資訊 大站熟悉-小路 靈活性 通用快速出門時段

2.音視訊傳輸

壓縮演算法

效率 完整性 tencent圖形壓縮

影象處理演算法

相關文章