資料結構與演算法
數學拾遺 微積分 線性代數 考研: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個部分:
·演算法程式所佔的空間;
·輸入的初始資料所佔的儲存空間;
·演算法執行過程中所需要的額外空間。
在許多實際問題中,為了減少演算法所佔的儲存空間,通常採用壓縮儲存技術。
連結串列
棧:先進後出
作用(將一個整數,轉換成指定的進位制 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圖形壓縮
影象處理演算法
相關文章
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 資料結構與演算法:圖形結構資料結構演算法
- python演算法與資料結構-什麼是資料結構Python演算法資料結構
- 資料結構與演算法02資料結構演算法
- 資料結構與演算法-堆資料結構演算法
- 資料結構與演算法03資料結構演算法
- 【JavaScript 演算法與資料結構】JavaScript演算法資料結構
- 資料結構與演算法(java)資料結構演算法Java
- python資料結構與演算法Python資料結構演算法
- 資料結構與演算法——字串資料結構演算法字串
- 資料結構與演算法——排序資料結構演算法排序
- 演算法與資料結構——序演算法資料結構
- 資料結構與演算法——概述資料結構演算法
- 【資料結構與演算法】bitmap資料結構演算法
- 資料結構與演算法 - 串資料結構演算法
- 資料結構與演算法(1)資料結構演算法
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 資料結構與演算法之線性結構資料結構演算法
- 資料結構與演算法-連結串列資料結構演算法
- [資料結構與演算法] 排序演算法資料結構演算法排序
- javascript資料結構與演算法-棧JavaScript資料結構演算法
- 資料結構與演算法之美資料結構演算法
- 演算法與資料結構1800題演算法資料結構
- JavaScript資料結構與演算法(串)JavaScript資料結構演算法
- [資料結構與演算法] 邂逅棧資料結構演算法
- 資料結構與演算法分析——棧資料結構演算法
- 資料結構與演算法(八):排序資料結構演算法排序
- 【資料結構與演算法】字串匹配資料結構演算法字串匹配
- 演算法與資料結構之集合演算法資料結構
- 資料結構與演算法:遞迴資料結構演算法遞迴
- 資料結構與演算法之排序資料結構演算法排序
- 資料結構與演算法:AVL樹資料結構演算法
- 資料結構與演算法-5 棧資料結構演算法
- 資料結構與演算法:堆排序資料結構演算法排序
- 資料結構與演算法——陣列資料結構演算法陣列
- JavaScript資料結構與演算法——集合JavaScript資料結構演算法
- 資料結構與演算法(java版)資料結構演算法Java