Algorithm第四版筆記-基礎
阿新 • • 發佈:2018-10-26
display 歸並 overflow tla 觀察 啟用 ray 一個 val
Algorithm第四版筆記-基礎
Table of Contents
- 1. 第一章-基礎
- 2. 背包,隊列和棧
- 2.1. 背包
- 2.2. 先進先出隊列
- 2.3. 下壓棧
- 2.4. 鏈表
- 3. 算法分析
- 3.1. 註意事項
1 第一章-基礎
- 編寫遞歸代碼的三條原則
- 遞歸總由一個最簡單的情況
- 遞歸調用總是去嘗試解決一個規模更小的子問題,這樣遞歸才能收斂到最簡單的情況
- 遞歸調用的父問題和嘗試解決的子問題之間不應該有交集
- 抽象數據類型(ADT)是一種能夠使用對使用者隱藏的數據表示的數據類型.
- 對象是能夠承載數據類型的值的實體
- 所有對象都有三大重要特性
- 狀態:數據類型中的值
- 標識:在內存中的位置,即地址
- 行為:數據類型的操作
- Java函數參數是按值傳遞的,無法改變該對象的引用,但能夠改變該對象的值.
- 每個Java類都至少含有一個構造函數以創建一個對象的標識
- Java約定equals()必須是一種等價性關系,它必須具有
- 自反性: x.equals(x)為true
- 對稱性: 當且僅當y.equals(x)為true時,x.equals(y)返回true
- 傳遞性: x.equals(y)和y.equals(x)為true,x.equals(z)也將為true
- 它必須接受一個Object為參數並滿足一下性質
- 一致性: 當兩個對象均未被修改時,反復調用x.equals(y)總是會返回相同的只
- 非空性: x.equals(null)總是返回false
- 異常: 一般用於處理不受我們控制的不可預見的錯誤
- 斷言: 驗證我們在代碼中做出的一些假設,如果表達式為false,程序將會終止並報告一條出錯信息
- 默認設置沒有啟用斷言,可以在命令行使用`-enableassertions(-ea)`啟用斷言`
2 背包,隊列和棧
- 自動將一個原始數據類型轉換為一個封裝類型被稱為自動裝箱
- 自動將一個封裝類型轉換為一個原始數據類型被稱為自動拆箱
2.1 背包
- 背包是一種不支持從中刪除元素的集合數據類型
- 它的目的就是幫助用例收集元素並叠代便利所有收集到的元素(用例也可以檢查背包是否為空或者背包中的元素的數量)
- 使用Bag說明元素的處理順序不重要
2.2 先進先出隊列
- 先進先出(FIFO)隊列是一種基於先進先出(FIFO)策略的集合類型.
2.3 下壓棧
- 下壓棧是一種基於後進先出(LIFO)策略的集合類型
2.4 鏈表
- 定義: 鏈表是一種遞歸的數據結構,它或者為空(null),或者指向一個節點(node)的引用,該節點包含有一個泛型的元素和一個指向另一條鏈表的引用.
3 算法分析
- 一個程序運行的總時間主要和兩點有關
- 執行每條語句的耗時
- 執行每條語句的頻率
- 從這裏我們觀察到的一個關鍵現象是最頻繁的指令決定了程序執行的總時間,我們將這些指令稱為程序的內循環.
- 對於大多數程序,得到其運行時間的數學模型所需的步驟如下
- 確定輸入模型,定義問題的規模
- 識別內循環
- 根據內循環中的操作確定成本模型
- 對於給定的輸入,判斷這些操作的執行頻率.這可能需要進行數學分析
- 增長數量級的分類
- 常數級別: 1 ,如普通語句
- 對數級別: \(\log{N}\) ,如二分策略
- 線性級別: \(N\) ,如一層循環
- 線性對數級別: \(N\log{N}\) ,如分治算法,歸並排序
- 平方級別: \(N^2\) ,雙層循環
- 立方級別: \(N^3\) ,三層循環
- 指數級別: \(2^N\) ,窮舉查找
3.1 註意事項
- 大常數
- 如 \(2N^2+cN\) 近似為 \(2N^2\) ,其中c有可能很大(c可能是 \(10^3\) 或者是 \(10^6\) )
- 非決定性的內循環
- 指令時間
Date: 2018-10-26 20:36
Created: 2018-10-26 五 20:48
Validate
Algorithm第四版筆記-基礎