java算法概述,Java数据结构与算法基础(一)概述与线性结构
Java數據結構與算法基礎(二)遞歸算法
Java數據結構與算法基礎(一)概述與線性結構
學習目的:為了能更順暢的讀很多底層API代碼和拓寬解決問題的思路
一、數據結構概述
1.數據結構是什么?數據與數據之間的關系
2.數據結構的分類:
存儲結構分類:順序結構和鏈式結構
邏輯結構分類:線性結構(除了首位元素,其他元素都存在前一元素和后一元素)、集合結構(集合)、樹形結構(樹結構、文件夾、文件結構)、圖形結構(多對多結構)
二、算法概述
1.算法特性:輸入(0或多個輸入)、輸出(一個輸出)、有窮性(能出結果)、確定性(一一對應)、可行性(能解決問題)
2.算法的基本要求:正確性、可讀性、健壯性、時間復雜度、空間復雜度
3.沒有最好的算法,只有最適合的算法
三、線性結構
1.數組的基本概念與操作
① 存儲結構:順序方式存儲
② 訪問方式:數組名[下標],最大下標 = arr.length-1;
③ 元素默認值 = 0,賦值:數組名[下標] = value;
2.數組創建的時候就要指定長度(即數組長度不可變)
問題:如何解決數組長度不可變?如在數組末尾添加元素
解決:① 建一個新數組,長度 = oldArr.length+1;
② 復制舊數組元素到新數組,新數組的末尾元素 = 新元素;
③ oldArr = newArr
3.數組元素的刪除(先告訴我刪哪個元素)
① 建一個新數組,長度 = oldArr.length-1;
② 復制舊數組元素
newArr[i] = oldArr[i]; // inewArr[i] = oldArr[i+1]; // i>n
③ oldArr = newArr;
4.面向對象的數組
屬性(一個私有的數組)+方法(操作私有屬性數組的方法)
要點:① 長度變化就意味著要建新數組,替代舊數組
② 傳入下標的方法,首先都應該判斷數組越界的問題
5.(數組)查找算法
線性查找:依次對比元素,找到相同元素即break
二分法查找:① 先排序,再查找
public static int binarySearch(int [] arr, int target){
if (arr == null) {
return -1;
}
int begin = 0;
int end = arr.length-1;
int mid = ((end - begin) >>> 1) + begin;
while(begin <= end){
if (arr[mid] == target) {
return mid;
}
if(arr[mid] > target){
end = mid-1;
}else if(arr[mid] < target){
begin = mid+1;
}
mid = ((end - begin) >>> 1) + begin;
}
return -1;
}
6.棧:先進后出
數組實現:入棧(建新數組,復制元素,新元素放到新數組最后,新數組替換對象舊數組屬性)、出棧(建新數組,復制元素,取出最后一個元素,新數組替換對象中的舊數組屬性,返回舊數組的最后一個元素)、查看棧元素(不涉及數組長度變化,所以直接返回舊數組的索引對應的值即可)
7.隊列:先進先出
數組實現:入隊、出隊、隊列是否為空(套路:建新數組主要涉及長度、復制元素、替換舊數組操作)
8.單鏈表:
存儲形式:鏈式存儲(存當前節點,同時存下個節點的位置[最后一個節點除外])
Java中單鏈表的結構:
Node:
int data;
Node next;
public Node(int data){
this.data = data;
}
涉及的操作:
通過第一個節點進行追加操作:
① 獲取當前節點:Node currentNode = this;
② while(true){
獲取下一個節點:Node next = currentNode.next;
如果下個節點為null,即最后一個節點:break;
否則:currentNode = next;
}
③ 追加節點到末尾:currentNode.next = node;//入參的Node
④ 返回當前節點 return this;
判斷當前節點是否是最后一個節點:
判斷當前節點的下一個節點是否為空即可
☆ 刪除單鏈表的節點:取不到上個節點信息(這是問題),所以只能刪除下個節點信息
① 取到下下個節點
② 將下下個節點賦值給當前節點的下個節點
顯示所有節點信息:
① 打印當前節點信息
② currentNode = currentNode.next;
如果currentNode == null; break;
否則重復①~②
插入新節點:
① tempNode = currentNode.next;//作為下下個節點
② currentNode.next = node; //node 為新節點
③ node.next = tempNode;
9.循環鏈表:
結構:單鏈表的尾節點的下個節點是頭結點
LoopNode{
int data;
LoopNode next = this;//默認自身是個循環鏈表,下個節點為其自身,插入節點操作和單鏈表相同
}
10.雙向循環鏈表:
結構:包含上個節點信息、下個節點信息、當前節點內容
DoubleNode{
DoubleNode pre = this;
DoubleNode next = this;
int data;
}
主要操作:新增節點
總結
以上是生活随笔為你收集整理的java算法概述,Java数据结构与算法基础(一)概述与线性结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据库9i安装,Oracle
- 下一篇: linux opencv gtk 没窗口