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