《第一章》
數據結構的特性:
數據結構 | 優點 | 缺點 |
數組 | 插入快,如果知道下標,可以非常快速的存取 | 查找慢,刪除慢,大小固定 |
有序數組 | 比無序的數組查找快 | 刪除和插入慢,大小固定 |
棧 | 提供後進先出的方式存取 | 存取其他項很慢 |
堆 | 插入,刪除快,對最大數據項的存取很快 | 對其他數據項存取慢 |
隊列 | 提供先進先出的方式存取 | 存取其他項很慢 |
鏈表 | 插入快,刪除快 | 查找慢 |
二叉樹 | 查找,插入,刪除都快(如果樹保持平衡) | 刪除算法複雜 |
紅黑樹 | 查找,插入,刪除都快(樹總是保持平衡) | 算法複雜 |
2-3-4樹 | 查找,插入,刪除都快(樹總是保持平衡,類似的樹對磁盤存儲有用) | 算法複雜 |
哈希表 | 如果關鍵字已知則存取極快,插入快 | 刪除慢,如果不知道關鍵字則存取很慢,對存儲空間使用不充分 |
圖 | 對現實世界進行建模 | 有些算法慢且複雜 |
軟件工程的整個生命週期:分析,設計,驗證,編碼,測試,生產,維護。
java 和 c++ 最大不同就在於java沒有指針。
BankAccount bc1; bc1 存儲了一個對象的地址,而不是保存對象的數據。bc1 是對象的一個引用,它並不是對象本身。如果對象沒有被複制,它就不會成爲引用。在賦值爲某個對象之前,它保存一個被稱爲null 的特殊對象的引用。
垃圾回收:用new 向系統申請空間後,不需要對釋放空間擔心。java每隔一段時間就會查看每一塊由new 開闢的內存,看指向它的有效引用是否依舊存在。如果這個引用不存在,系統就會自動的將這塊空間歸入空閒內存區,這個過程被稱爲垃圾回收。
char[字符]型是無符號的,採用兩個字節的空間表示Unicode 字符集,這個字符集可以處理國際通用的字符。
數組可以分爲:線性查找和二分查找
注意:二分查找比線性查找要快。
有序數組:有序數組查找的速度比無序數組快,但是在插入的操作中由於所有靠後的數據都需要移動以騰開空間,所以速度較慢。有序數據和無序數據的刪除都很慢,因爲數據項必須向前移動來填補已刪除的數據項。
有序數據在查找頻繁的時候十分有效,但是插入和刪除也較爲頻繁時,則無法高效工作。
算法 | 大O表示運行的時間 |
線性查找 | O(N) |
二分查找 | O(logN) |
無序數組的插入 | O(1) |
有序數組的插入 | O(N) |
無序數組的刪除 | O(N) |
有序數組的刪除 | O(N) |
總結:
1.java中的數組是對象,由new 操作符創建
2.無序數組可以快速的插入,但是查找和刪除慢
3.將數組封裝到類中可以保護數組不被隨意更改
4.類的接口由類用戶可訪問的方法組成
類的接口被設計成類用戶的操作更加簡單
5.有序數組可以使用二分查找
6.線性查找需要的時間和數組中數據項的個數成正比
7.二分查找需要的時間與數組中數據項的對數成正比
8.大O表示法比較算法的速度提供了一種方便的方法
9.O(1)級時間的算法是最好的,O(logN)次之,O(N)爲一般,O(N²)最差。
排序包括:線性排序,二分排序,冒泡排序,選擇排序,插入排序,希爾排序,快速排序。
冒泡排序:運行非常慢,但是最簡單。與旁邊的比較,若小靠左,若大靠右。
選擇排序:選擇排序是對冒泡排序的改進,比冒泡排序快,比插入排序慢。
插入排序:比冒泡排序快一倍,比選擇排序複雜點。
1.鏈表包含一個linkedList和許多Link對象
2.linkedList 對象包含一個引用,這個引用通常叫做first,它指向鏈表的第一個鏈結點。
3.每個link 對象包含數據和一個引用,通常叫做next,它指向鏈表的下一個鏈結點。
4.next字段爲null值意味着鏈表的結尾。
5.在表頭刪除鏈結點要把first指向first.next。
6.爲了遍歷鏈表,從first開始,然後從一個鏈結點到下一個鏈結點,方法是用每個鏈結點的next字段找到下一個鏈結點。
7.通過遍歷鏈表可以找到擁有特定值的鏈結點,一旦找到,可以顯示,刪除或用其他方式操縱該結點
8.新鏈結點可以插在某個特定值的鏈結點的前面或者後面,首先要遍歷找到這個鏈結點。
9.雙端鏈表在鏈表中維護一個指向最後一個鏈結點的引用,它通常和first一樣,叫做last。
10.雙端鏈表允許在表尾插入數據項
11.抽象數據類型是一種數據存儲類,不涉及它的實現
12.棧和隊列時ADT,他們既可以用數組實現,又可以用鏈表實現
13.有序鏈表中,鏈結點按照關鍵值升降序排序
14.雙向鏈表允許反向遍歷,並可以從表尾刪除
15.迭代器是一個引用,它被封裝在類對象中,這個引用指向相關聯的鏈表中的鏈結點。
16.迭代器方法允許使用者沿鏈表移動迭代器,並訪問當前指示的鏈結點。