日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

數據結構與算法緒論

來源: 責編: 時間:2023-10-27 17:23:22 373觀看
導讀前言數據結構與算法是程序員內功體現(xiàn)的重要標準之一,且數據結構也應用在各個方面,業(yè)界更有程序=數據結構+算法這個等式存在。各個中間件開發(fā)者,架構師他們都在努力的優(yōu)化中間件、項目結構以及算法提高運行效率和降低內存

dcd28資訊網——每日最新資訊28at.com

前言

數據結構與算法是程序員內功體現(xiàn)的重要標準之一,且數據結構也應用在各個方面,業(yè)界更有程序=數據結構+算法這個等式存在。各個中間件開發(fā)者,架構師他們都在努力的優(yōu)化中間件、項目結構以及算法提高運行效率和降低內存占用,在這里數據結構起到相當重要的作用。此外數據結構也蘊含一些面向對象的思想,故學好掌握數據結構對邏輯思維處理抽象能力有很大提升。dcd28資訊網——每日最新資訊28at.com

為什么學習數據結構與算法?如果你還是學生,那么這門課程是必修的,考研基本也是必考科目。工作在內卷嚴重的大廠中找工作數據結構與算法也是面試、筆試必備的非常重要的考察點。如果工作了數據結構和算法也是內功提升一個非常重要的體現(xiàn),對于程序員來說,想要得到滿意的結果,數據結構與算法是必備功力!dcd28資訊網——每日最新資訊28at.com

數據結構

概念

數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。dcd28資訊網——每日最新資訊28at.com


dcd28資訊網——每日最新資訊28at.com

dcd28資訊網——每日最新資訊28at.com


dcd28資訊網——每日最新資訊28at.com

簡言之,數據結構是一系列的存儲結構按照一定執(zhí)行規(guī)則、配合一定執(zhí)行算法所形成的高效的存儲結構。在我們所熟知的關系數據庫、非關系數據庫、搜索引擎存儲、消息隊列等都是比較牛的大型數據結構良好的運用。當然這些應用中間件不單單要考慮單純的結構問題。還考慮實際os、網絡等其他因素。dcd28資訊網——每日最新資訊28at.com

而對于數據結構與算法這個專欄。我們程序員更要掌握的首先是在內存中運行的抽象的數據結構。是一個相對比較單一的數據結構類型,比如線性結構、樹、圖等等.dcd28資訊網——每日最新資訊28at.com

相關術語

在數據結構與算法中,數據、數據對象、數據元素、數據項很多人搞不清其中的關系。通過畫一張圖來捋一捋,然后下面舉個例子給大家分享一下。dcd28資訊網——每日最新資訊28at.com


dcd28資訊網——每日最新資訊28at.com

dcd28資訊網——每日最新資訊28at.com


dcd28資訊網——每日最新資訊28at.com

用戶信息表usersdcd28資訊網——每日最新資訊28at.com

iddcd28資訊網——每日最新資訊28at.com

namedcd28資訊網——每日最新資訊28at.com

sexdcd28資訊網——每日最新資訊28at.com

001dcd28資訊網——每日最新資訊28at.com

bigsaidcd28資訊網——每日最新資訊28at.com

mandcd28資訊網——每日最新資訊28at.com

002dcd28資訊網——每日最新資訊28at.com

smallsaidcd28資訊網——每日最新資訊28at.com

mandcd28資訊網——每日最新資訊28at.com

003dcd28資訊網——每日最新資訊28at.com

菜虛鯤dcd28資訊網——每日最新資訊28at.com

womandcd28資訊網——每日最新資訊28at.com

Users的pojo對象dcd28資訊網——每日最新資訊28at.com

class User{      //略     int id;     String name;     String sex;}//list和woman是數據List<User>users;//數據對象listList<User>women;//數據對象womenusers.add(new User(001,"bigsai","man"));//添加數據元素 一個user由(001,bigsai,man)三個數據項組成 users.add(new User(002,"smallsai","man"));//數據元素users.add(new User(003,"菜虛鯤","woman"));//數據元素woman.add(users.get(2));//003,"菜虛鯤","woman"三個數據項構成的一個數據元素

數據:對客觀事物的符號表示,指所有能輸入到計算機中并被計算機程序處理的符號的集合總稱。上述表中的三條用戶信息的記錄就是數據(也可能多表多集合這里只有一個)。這些數據一般都是用戶輸入或者是自定義構造完成。當然,還有一些圖像、聲音也是數據。dcd28資訊網——每日最新資訊28at.com

數據元素:數據元素是數據的基本單位。一個數據元素由若干數據項構成!可認為是一個pojo對象、或者是數據庫的一條記錄。比如菜虛鯤那條記錄就是一個數據元素。dcd28資訊網——每日最新資訊28at.com

數據項: 而構成用戶字段/屬性的有id、name、sex等,這些就是數據項.數據項是構成數據元素的最小不可分割字段。可以看作一個pojo對象或者一張表(people)的一個屬性/字段的值。dcd28資訊網——每日最新資訊28at.com

數據對象:是相同性質數據元素的集合。是數據的一個子集,比如上面的users表、list集合、woman集合都是數據對象。單獨一張表,一個集合都可以是一個數據對象。dcd28資訊網——每日最新資訊28at.com

總的捋一捋,數據范圍最廣,所有數據即數據,而數據對象僅僅是有相同性質的一個集合,這個集合是數據的子集,但并不是數據的基本單位,而數據元素才是數據的基本單位。舉個例子表cat和表dog都是數據,然后表cat是個數據對象(因為都描述cat這種對象),但是數據的基本單位并不是貓和狗,而是他們的具體的每一條記錄,比如小貓咪1號,大貓咪二號,哈士奇1號,藏獒2號這些每一條記錄才是數據的基本單位。dcd28資訊網——每日最新資訊28at.com

還有數據類型,抽象數據類型也在下面講一講。dcd28資訊網——每日最新資訊28at.com

數據類型dcd28資訊網——每日最新資訊28at.com

  • 原子類型:其值不可再分的類型。比如int,char,double,float等。
  • 結構類型:其值可以再分為若干成分的數據類型。比如結構體構造的各種結構等。

抽象數據類型(ADT):抽象數據類型(ADT)是一個實現(xiàn)包括存儲數據元素的存儲結構以及實現(xiàn)基本操作的算法。使得只研究和使用它的結構而不用考慮它的實現(xiàn)細節(jié)成為可能。比如我們使用List、Map、Set等等只需要了解它的API和性質功能即可。而具體的實現(xiàn)可能是不同的方案,比如List的實現(xiàn)有數組和鏈表不同選擇。dcd28資訊網——每日最新資訊28at.com

三要素

邏輯結構:數據元素之間的邏輯關系。邏輯結構分為線性結構和非線性結構。線性結構就是順序表、鏈表之類。而非線性就是集合、樹、圖這些結構。dcd28資訊網——每日最新資訊28at.com

存儲結構:數據結構在計算機中的表示(又稱映像,也稱物理結構),存儲結構主要分為順序存儲鏈式存儲索引存儲散列(哈希)存儲,這幾種存儲通過下面這張圖簡單了解一下(僅僅為理解不考慮更多):dcd28資訊網——每日最新資訊28at.com


dcd28資訊網——每日最新資訊28at.com

dcd28資訊網——每日最新資訊28at.com


dcd28資訊網——每日最新資訊28at.com

數據的運算:施加在數據上的運算包括運算的定義和實現(xiàn),運算的定義基于邏輯結構,運算的實現(xiàn)基于存儲結構。dcd28資訊網——每日最新資訊28at.com

在這里容易混淆的是邏輯結構與存儲結構的概念。對于邏輯結構,不難看得出邏輯二字,邏輯關系也就是兩者存在數據上的關系而不考慮物理地址的關系,比如線性結構和非線性結構,它描述的是一組數據中聯(lián)系的方式和形式,他針對的是數據。看中的是數據結構的功能,比如線性表就是前后有序的,我需要一個有序的集合就可以使用線性表。dcd28資訊網——每日最新資訊28at.com

存儲結構就是跟物理地址掛鉤的。因為同樣邏輯結構采用不同存儲結構實現(xiàn)適用場景和性能可能不同。比如同樣是線性表,可能有多種存儲結構的實現(xiàn)方式。比如順序表和鏈表(Arraylist,Linkedlist)它們的存儲結構就不同,一個是順序存儲(數組)實現(xiàn),一個是鏈式存儲(鏈表)實現(xiàn)。它關注的是計算機運行物理地址的關系。但通常同一類存儲結構實現(xiàn)的一些數據結構有一些類似的共同點和缺點(線性易查難插、鏈式易插難查等等)。dcd28資訊網——每日最新資訊28at.com

算法分析

上面講了數據結構相關概念,下面對算法分析的一些概念進行描述。dcd28資訊網——每日最新資訊28at.com

算法的五個重要特征:有窮性、確定性、可行性、輸入、輸出。這些從字面意思即可理解,其中有窮性強調算法要有結束的時候不能無限循環(huán);而確定性是每條指令有它意義,相同的輸入得到相同的輸出;可行性是指算法每個步驟經過若干次執(zhí)行可以實現(xiàn);輸入是0個或多個輸入(可0);輸出是1個或多個輸出(一定要有輸出)。dcd28資訊網——每日最新資訊28at.com

而一個好的算法,通常更要著重考慮的是效率和空間資源占用(時間復雜度和空間復雜度),通常復雜度更多描述的是一個量級程度而很少用具體數字描述。dcd28資訊網——每日最新資訊28at.com

空間復雜度

概念:是對一個算法在運行過程中臨時占用存儲空間大小的量度,記做S(n)=O(f(n))dcd28資訊網——每日最新資訊28at.com

空間復雜度其實在算法的衡量占比是比較低的(我們經常使用犧牲空間換時間的數據結構和算法),但是不能忽視空間復雜度中重要性。無論在刷題還是實際項目生產內存都是一個極大額指標。對于Java而言更是如此。本身內存就大,如果采用的存儲邏輯不太好會占用更多的系統(tǒng)資源,對服務造成壓力。dcd28資訊網——每日最新資訊28at.com

而算法很多情況都是犧牲空間換取時間(效率)。就比如我們熟知的字符串匹配String.contains()方法,我們都知道他是暴力破解,時間復雜度為O(n^2),不需要借助額外內存。而KMP算法在效率和速度上都原生暴力方法,但是KMP要借助其他數組(next[])進行標記儲存運算。就用到了空間開銷。再比如歸并排序也會借助新數組在遞歸分冶的適合進行逐級計算,提高效率,但增加點影響不大的內存開銷。dcd28資訊網——每日最新資訊28at.com

當然,算法的空間花銷最大不能超過jvm設置的最大值,一般為2G.(2147483645)如果開二維數組多種多維數據不要開的太大,可能會導致heap OutOfMemoryError。dcd28資訊網——每日最新資訊28at.com

時間復雜度

概念:計算機科學中,算法的時間復雜度是一個函數,它定性描述了該算法的運行時間。這是一個關于代表算法輸入值的字符串的長度的函數。時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間復雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。dcd28資訊網——每日最新資訊28at.com

時間復雜度的排序:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) <O(n!) < O(n^n)dcd28資訊網——每日最新資訊28at.com

常見時間復雜度:對于時間復雜度,很多人的概念是比較模糊的。下面舉例子說明一些時間復雜度。dcd28資訊網——每日最新資訊28at.com

O(1): 常數函數dcd28資訊網——每日最新資訊28at.com

  • a=15

O(logn): 對數函數dcd28資訊網——每日最新資訊28at.com

  • for(int i=1;i<n;i*=2) 分析:假設執(zhí)行t次使得i=n;有2^t=n; t=log2~n,為log級別時間復雜度為O(logn)。
  • 還有典型的二分查找,拓展歐幾里得,快速冪等算法均為O(logn)。屬于高效率算法。

O(n): 線性函數dcd28資訊網——每日最新資訊28at.com

  • for (int i=0;i<n;i++)
  • 比較常見,能夠良好解決大部分問題。

O(nlogn):dcd28資訊網——每日最新資訊28at.com

  • for (int i=1;i<n;i++) for (int j=1;j<i;j*=2)
  • 常見的排序算法很多正常情況都是nlogn,比如快排、歸并排序。這種算法效率大部分也還不錯。

O(n^2)dcd28資訊網——每日最新資訊28at.com

  • for(int i=0;i<n;i++) for(int j=0;j<i;j++)
  • 其實O(n^2)的效率就不敢恭維了。對于大的數據O(n^2)甚至更高次方的執(zhí)行效果會很差。

當然如果同樣是n=10000.那么不同時間復雜度額算法執(zhí)行次數、時間也不同。dcd28資訊網——每日最新資訊28at.com

具體dcd28資訊網——每日最新資訊28at.com

ndcd28資訊網——每日最新資訊28at.com

執(zhí)行次數dcd28資訊網——每日最新資訊28at.com

O(1)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

1dcd28資訊網——每日最新資訊28at.com

O(log2n)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

14dcd28資訊網——每日最新資訊28at.com

O( n^1/2)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

100dcd28資訊網——每日最新資訊28at.com

O(n)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

O(nlog2 n)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

140000dcd28資訊網——每日最新資訊28at.com

O(n^2)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

100000000dcd28資訊網——每日最新資訊28at.com

O(n^3)dcd28資訊網——每日最新資訊28at.com

10000dcd28資訊網——每日最新資訊28at.com

1000000000000dcd28資訊網——每日最新資訊28at.com

降低算法復雜度有些會靠數據結構的特性和優(yōu)勢,比如二叉排序樹的查找,線段樹的動態(tài)排序等等,這些數據結構解決某些問題有些非常良好的性能。還有的是靠算法策略解決,比如同樣是排序,冒泡排序這種笨而簡單的方法就是O(n2),但快排、歸并等聰明方法就能O(nlogn)。要想變得更快,那就得掌握更高級的數據結構和更精巧的算法。dcd28資訊網——每日最新資訊28at.com

時間復雜度計算 時間復雜度計算一般步驟:1、找到執(zhí)行次數最多的語句; 2、計算語句執(zhí)行的數量級 ; 3、用O表示結果。并且有兩個規(guī)則:dcd28資訊網——每日最新資訊28at.com

加法規(guī)則: 同一程序下如果多個并列關系的執(zhí)行語句那么取最大的那個,eg:dcd28資訊網——每日最新資訊28at.com

T(n)=O(m)+O(n)=max(O(m),O(n)); T(n)=O(n)+O(nlogn)=max(O(n),O(nlogn))=O(nlogn);

乘法規(guī)則:循環(huán)結構,時間復雜度按乘法進行計算,eg:dcd28資訊網——每日最新資訊28at.com

T(n)=O(m)*O(n)=O(mn)T(n)=O(m)*O(m)=O(m^2)(兩層for循環(huán))

當然很多算法的時間復雜度還跟輸入的數據有關,分為還會有最優(yōu)時間復雜度(可能執(zhí)行次數最少時),最壞時間復雜度(執(zhí)行次數最少時),平均時間復雜度,這在排序算法中已經具體分析,但我們通常使用平均時間復雜度來衡量一個算法的好壞。dcd28資訊網——每日最新資訊28at.com

數據結構與算法學習

捋過數據結構與算法基本概念的介紹,在學習數據結構與算法方面,個人把經典的數據結構與算法學習過程步驟寫在下面,希望能給大家一個參考:dcd28資訊網——每日最新資訊28at.com

數據結構

  • 單鏈表(帶頭結點、不帶頭結點)設計與實現(xiàn)(增刪改查),雙鏈表設計與實現(xiàn)
  • 棧設計與實現(xiàn)(數組和鏈表),隊列設計與實現(xiàn)(數組和鏈表)
  • 二叉樹概念學習,二叉樹前序、中序、后序遍歷遞歸、非遞歸實現(xiàn) ,層序遍歷
  • 二叉排序樹設計與實現(xiàn)(插入刪除)
  • 堆(優(yōu)先隊列、堆排序)
  • AVL(平衡)樹設計與實現(xiàn)(四種自旋方式理解實現(xiàn))
  • 伸展樹、紅黑樹原理概念理解
  • B、B+原理概念理解
  • 哈夫曼樹原理概念理解(貪心策略)
  • 哈希(散列表)原理概念理解(幾種解決哈希沖突方式)
  • 并查集/不相交集合(優(yōu)化和路徑壓縮)
  • 圖論拓撲排序
  • 圖論dfs深度優(yōu)先遍歷、bfs廣度優(yōu)先遍歷
  • 最短路徑Dijkstra算法、Floyd算法、spfa算法
  • 最小生成樹prim算法、kruskal算法
  • 其他數據結構線段樹、后綴數組等等

經典算法

  • 遞歸算法(求階乘、斐波那契、漢諾塔問題)
  • 二分查找
  • 分治算法(快排、歸并排序、求最近點對等問題)
  • 貪心算法(使用較多,區(qū)間選點問題,區(qū)間覆蓋問題)
  • 常見動態(tài)規(guī)劃(LCS(最長公共子序列) LIS(最長上升子序列)背包問題等等)
  • 回溯算法(經典八皇后問題、全排列問題)
  • 位運算常見問題(參考劍指offer和LeetCode問題)
  • 快速冪算法(快速求冪乘、矩陣快速冪)
  • kmp等字符串匹配算法
  • 一切其他數論算法(歐幾里得、拓展歐幾里得、中國剩余定理等等)

相信看完這篇文章,你應該對數據結構與算法有個不錯的認知。數據結構與算法有著非常密切的關聯(lián),數據結構是為了實現(xiàn)某種算法,算法是核心目的。學習數據結構與算法之前,可以先參考書本或者博客先了解其功能,再研究其運行原理,再動手實戰(zhàn)(編寫數據結構或者相關題目)這樣層次漸進,想要深入的學習數據結構與算法光理解是不行的,需要有大量代碼實戰(zhàn)才可。并且這條路是沒有止境的,活到老,學到老,刷到老。dcd28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-15467-0.html數據結構與算法緒論

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一文帶你徹底了解JMX

下一篇: 微服務設計必看:深度解析Netflix Eureka的底層實現(xiàn)

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 黄石市| 长葛市| 乌审旗| 晴隆县| 靖宇县| 历史| 宽城| 嘉鱼县| 涟水县| 阿拉善左旗| 阿拉善盟| 甘孜县| 赣州市| 合阳县| 鄂托克前旗| 桐梓县| 张家川| 阳城县| 正镶白旗| 于都县| 巴林右旗| 宜章县| 金乡县| 五家渠市| 鸡东县| 清徐县| 汽车| 德钦县| 蓝山县| 阳城县| 垦利县| 土默特右旗| 吴堡县| 泰宁县| 台湾省| 上饶市| 莎车县| 宿迁市| 凯里市| 罗平县| 玛纳斯县|