最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java二十九:初識數(shù)據(jù)結(jié)構(gòu)和算法

2023-03-07 00:10 作者:小劉Java之路  | 我要投稿

加強(qiáng)自身學(xué)習(xí),提高自身素質(zhì)。積累工作經(jīng)驗,改進(jìn)工作方法,向周圍同志學(xué)習(xí),注重別人優(yōu)點,學(xué)習(xí)他們處理問題的方法,查找不足,提高自己。


數(shù)據(jù)結(jié)構(gòu)分類:線性結(jié)構(gòu)和非線性結(jié)構(gòu)

問題一:

什么是線性和非線性;

我個人的理解是:數(shù)據(jù)結(jié)構(gòu)中線性結(jié)構(gòu)指的是數(shù)據(jù)元素之間存在著“一對一”的線性關(guān)系的數(shù)據(jù)結(jié)構(gòu);

線性結(jié)構(gòu)包括:數(shù)組,鏈表,隊列,棧;

非線性結(jié)構(gòu)包括:樹,圖,表;

  • 解釋:

一.線性結(jié)構(gòu)

1.數(shù)組

特點:我們都知道數(shù)組中的元素在內(nèi)存中連續(xù)存儲的,可以根據(jù)是下標(biāo)快速訪問元素,因此,查詢速度很快,然而插入和刪除時,需要對元素移動空間,比較慢。

數(shù)組使用場景:頻繁查詢,很少增加和刪除的情況。

2.鏈表

特點:元素可以不連續(xù)內(nèi)存中,是以索引將數(shù)據(jù)聯(lián)系起來的,當(dāng)查詢元素的時候需要從頭開始查詢,所以效率比較低,然而添加和刪除的只需要修改索引就可以了

使用場景:少查詢,需要頻繁的插入或刪除情況

3.隊列

特點:先進(jìn)先出,

使用場景:多線程阻塞隊列管理非常有用

4.棧

特點:先進(jìn)后出,就像一個箱子,

使用場景:實現(xiàn)遞歸以及表示式

5.數(shù)組與鏈表的區(qū)別

數(shù)組連續(xù),鏈表不連續(xù)(從數(shù)據(jù)存儲形式來說)

數(shù)組內(nèi)存靜態(tài)分配,鏈表動態(tài)分配

數(shù)組查詢復(fù)雜度0(1),鏈表查詢復(fù)雜度O(n)

數(shù)組添加或刪除,復(fù)雜度o(n),鏈表添加刪除,復(fù)雜度O(1)

數(shù)組從棧中分配內(nèi)存。鏈表從堆中分配內(nèi)存。

二、算法分類:

1)插入排序(直接插入排序、希爾排序)

2)交換排序(冒泡排序、快速排序)

3)選擇排序(直接選擇排序、堆排序)

4)歸并排序

5)分配排序(基數(shù)排序)

所需輔助空間最多:歸并排序

所需輔助空間最少:堆排序

平均速度最快:快速排序

不穩(wěn)定:快速排序,希爾排序,堆排序。

數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)是計算機(jī)存儲、組織數(shù)據(jù)的方式,指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。

通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運(yùn)行或者存儲效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關(guān)。

一、數(shù)據(jù)結(jié)構(gòu)的基本功能

①、如何插入一條新的數(shù)據(jù)項

②、如何尋找某一特定的數(shù)據(jù)項

③、如何刪除某一特定的數(shù)據(jù)項

④、如何迭代的訪問各個數(shù)據(jù)項,以便進(jìn)行顯示或其他操作

img
img

算法

算法簡單來說就是解決問題的步驟。

在Java中,算法通常都是由類的方法來實現(xiàn)的。前面的數(shù)據(jù)結(jié)構(gòu),比如鏈表為啥插入、刪除快,而查找慢,平衡的二叉樹插入、刪除、查找都快,這都是實現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)的算法所造成的。后面我們講的各種排序?qū)崿F(xiàn)也是算法范疇的重要領(lǐng)域。

一、算法的五個特征

①、有窮性:對于任意一組合法輸入值,在執(zhí)行又窮步驟之后一定能結(jié)束,即:算法中的每個步驟都能在有限時間內(nèi)完成。

②、確定性:在每種情況下所應(yīng)執(zhí)行的操作,在算法中都有確切的規(guī)定,使算法的執(zhí)行者或閱讀者都能明確其含義及如何執(zhí)行。并且在任何條件下,算法都只有一條執(zhí)行路徑。

③、可行性:算法中的所有操作都必須足夠基本,都可以通過已經(jīng)實現(xiàn)的基本操作運(yùn)算有限次實現(xiàn)之。

④、有輸入:作為算法加工對象的量值,通常體現(xiàn)在算法當(dāng)中的一組變量。有些輸入量需要在算法執(zhí)行的過程中輸入,而有的算法表面上可以沒有輸入,實際上已被嵌入算法之中。

⑤、有輸出:它是一組與“輸入”有確定關(guān)系的量值,是算法進(jìn)行信息加工后得到的結(jié)果,這種確定關(guān)系即為算法功能。

二、算法的設(shè)計原則

算法簡單來說就是解決問題的步驟。

在Java中,算法通常都是由類的方法來實現(xiàn)的。前面的數(shù)據(jù)結(jié)構(gòu),比如鏈表為啥插入、刪除快,而查找慢,平衡的二叉樹插入、刪除、查找都快,這都是實現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)的算法所造成的。后面我們講的各種排序?qū)崿F(xiàn)也是算法范疇的重要領(lǐng)域。

一**、算法的五個特征**

**①、**有窮性:對于任意一組合法輸入值,在執(zhí)行又窮步驟之后一定能結(jié)束,即:算法中的每個步驟都能在有限時間內(nèi)完成。

**②、**確定性:在每種情況下所應(yīng)執(zhí)行的操作,在算法中都有確切的規(guī)定,使算法的執(zhí)行者或閱讀者都能明確其含義及如何執(zhí)行。并且在任何條件下,算法都只有一條執(zhí)行路徑。

**③、**可行性:算法中的所有操作都必須足夠基本,都可以通過已經(jīng)實現(xiàn)的基本操作運(yùn)算有限次實現(xiàn)之。

**④、**有輸入:作為算法加工對象的量值,通常體現(xiàn)在算法當(dāng)中的一組變量。有些輸入量需要在算法執(zhí)行的過程中輸入,而有的算法表面上可以沒有輸入,實際上已被嵌入算法之中。

**⑤、**有輸出:它是一組與“輸入”有確定關(guān)系的量值,是算法進(jìn)行信息加工后得到的結(jié)果,這種確定關(guān)系即為算法功能。

二、算法的設(shè)計原則

①、正確性:首先,算法應(yīng)當(dāng)滿足以特定的“規(guī)則說明”方式給出的需求。其次,對算法是否“正確”的理解可以有以下四個層次:

一、程序語法錯誤。

二、程序?qū)τ趲捉M輸入數(shù)據(jù)能夠得出滿足需要的結(jié)果。

三、程序?qū)τ诰倪x擇的、典型、苛刻切帶有刁難性的幾組輸入數(shù)據(jù)能夠得出滿足要求的結(jié)果。

四、程序?qū)τ谝磺泻戏ǖ妮斎霐?shù)據(jù)都能得到滿足要求的結(jié)果。

PS:通常以第 三 層意義的正確性作為衡量一個算法是否合格的標(biāo)準(zhǔn)。

②、可讀性:算法為了人的閱讀與交流,其次才是計算機(jī)執(zhí)行。因此算法應(yīng)該易于人的理解;另一方面,晦澀難懂的程序易于隱藏較多的錯誤而難以調(diào)試。

③、健壯性:當(dāng)輸入的數(shù)據(jù)非法時,算法應(yīng)當(dāng)恰當(dāng)?shù)淖龀龇磻?yīng)或進(jìn)行相應(yīng)處理,而不是產(chǎn)生莫名其妙的輸出結(jié)果。并且,處理出錯的方法不應(yīng)是中斷程序執(zhí)行,而是應(yīng)當(dāng)返回一個表示錯誤或錯誤性質(zhì)的值,以便在更高的抽象層次上進(jìn)行處理。

④、高效率與低存儲量需求:通常算法效率值得是算法執(zhí)行時間;存儲量是指算法執(zhí)行過程中所需要的最大存儲空間,兩者都與問題的規(guī)模有關(guān)。

前面三點 正確性,可讀性和健壯性相信都好理解。對于第四點算法的執(zhí)行效率和存儲量,我們知道比較算法的時候,可能會說“A算法比B算法快兩倍”之類的話,但實際上這種說法沒有任何意義。因為當(dāng)數(shù)據(jù)項個數(shù)發(fā)生變化時,A算法和B算法的效率比例也會發(fā)生變化,比如數(shù)據(jù)項增加了50%,可能A算法比B算法快三倍,但是如果數(shù)據(jù)項減少了50%,可能A算法和B算法速度一樣。所以描述算法的速度必須要和數(shù)據(jù)項的個數(shù)聯(lián)系起來。也就是“大O”表示法,它是一種算法復(fù)雜度的相對表示方式,這里我簡單介紹一下,后面會根據(jù)具體的算法來描述。

相對(relative):你只能比較相同的事物。你不能把一個做算數(shù)乘法的算法和排序整數(shù)列表的算法進(jìn)行比較。但是,比較2個算法所做的算術(shù)操作(一個做乘法,一個做加法)將會告訴你一些有意義的東西;

表示(representation):大O(用它最簡單的形式)把算法間的比較簡化為了一個單一變量。這個變量的選擇基于觀察或假設(shè)。例如,排序算法之間的對比通常是基于比較操作(比較2個結(jié)點來決定這2個結(jié)點的相對順序)。這里面就假設(shè)了比較操作的計算開銷很大。但是,如果比較操作的計算開銷不大,而交換操作的計算開銷很大,又會怎么樣呢?這就改變了先前的比較方式;

復(fù)雜度(complexity):如果排序10,000個元素花費了我1秒,那么排序1百萬個元素會花多少時間?在這個例子里,復(fù)雜度就是相對其他東西的度量結(jié)果。

然后我們在說說算法的存儲量,包括:

程序本身所占空間;

輸入數(shù)據(jù)所占空間;

輔助變量所占空間;

一個算法的效率越高越好,而存儲量是越低越好。

總結(jié):

1、數(shù)據(jù)結(jié)構(gòu)分類:線性結(jié)構(gòu)和非線性結(jié)構(gòu)

線性結(jié)構(gòu)包括:數(shù)組,鏈表,隊列,棧;

非線性結(jié)構(gòu)包括:樹,圖,表;

2、

3、算法的基本的設(shè)計和認(rèn)識,算法在java中就是一個方法,通過這個方法可以實現(xiàn)一些計算、復(fù)雜的功能......

4、利用好數(shù)據(jù)結(jié)構(gòu)可以提供系統(tǒng)的性能



Java二十九:初識數(shù)據(jù)結(jié)構(gòu)和算法的評論 (共 條)

分享到微博請遵守國家法律
朝阳区| 土默特右旗| 特克斯县| 涿州市| 印江| 阿拉善盟| 定南县| 池州市| 调兵山市| 临洮县| 黄大仙区| 喜德县| 衡阳市| 弥勒县| 郧西县| 津市市| 封丘县| 莱阳市| 双鸭山市| 壶关县| 金寨县| 谷城县| 奉节县| 桦甸市| 永平县| 桐乡市| 罗平县| 商都县| 古丈县| 绍兴市| 荥经县| 东乌珠穆沁旗| 横峰县| 子长县| 连江县| 绿春县| 阜平县| 白城市| 枣阳市| 丽水市| 新密市|