日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java算法概述,Java数据结构与算法基础(一)概述与线性结构

發(fā)布時(shí)間:2025/3/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java算法概述,Java数据结构与算法基础(一)概述与线性结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。