成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)與算法—緒論

Tecode / 1986人閱讀

摘要:數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。一個數(shù)據(jù)元素由若干數(shù)據(jù)項構(gòu)成可認(rèn)為是一個對象或者是數(shù)據(jù)庫的一條記錄。抽象數(shù)據(jù)類型抽象數(shù)據(jù)類型是一個實現(xiàn)包括儲存數(shù)據(jù)元素的存儲結(jié)構(gòu)以及實現(xiàn)基本操作的算法。

前言

重要性

數(shù)據(jù)結(jié)構(gòu)與算法是程序員內(nèi)功體現(xiàn)的重要標(biāo)準(zhǔn)之一,而數(shù)據(jù)結(jié)構(gòu)的也應(yīng)用在各個方面,更有程序=數(shù)據(jù)結(jié)構(gòu)+算法這個等式存在。各個中間件開發(fā)者,架構(gòu)師。他們都在努力的優(yōu)化中間件、項目結(jié)構(gòu)以及算法提高運行效率降低內(nèi)存占用。并且數(shù)據(jù)結(jié)構(gòu)中也是蘊(yùn)含模型以及面向?qū)ο蟮乃枷?,掌握?shù)據(jù)結(jié)構(gòu)對邏輯思維處理抽象能力有很大提升。。

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

概念

數(shù)據(jù)結(jié)構(gòu)是計算機(jī)存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率。

個人理解

簡言之,數(shù)據(jù)結(jié)構(gòu)是一系列的存儲結(jié)構(gòu)按照一定執(zhí)行規(guī)則、配合一定執(zhí)行算法所形成的高效的存儲結(jié)構(gòu)。在我們所熟知的關(guān)系數(shù)據(jù)庫、非關(guān)系數(shù)據(jù)庫、搜索引擎存儲、消息隊列等都是比較牛的大型數(shù)據(jù)結(jié)構(gòu)良好的運用。這些數(shù)據(jù)結(jié)構(gòu)應(yīng)用不僅僅考慮到內(nèi)存范圍結(jié)構(gòu)設(shè)計。還考慮實際os、網(wǎng)絡(luò)等其他因素。

而對于數(shù)據(jù)結(jié)構(gòu)與算法這個專欄。我們程序員更改掌握的首先是在內(nèi)存中運行的抽象的數(shù)據(jù)結(jié)構(gòu)。是一個相對比較單一的數(shù)據(jù)結(jié)構(gòu)類型,比如線性結(jié)構(gòu)、等等.

相關(guān)術(shù)語


用戶信息表users

id name sex
001 bigsai man
002 smallsai man
003 菜虛鯤 woman

users的pojo對象

class users
{ 
     //略
     int id;
     String name;
     String sex;
}
//list和woman是數(shù)據(jù)
Listlist;//數(shù)據(jù)對象list
Listwoman;//數(shù)據(jù)對象woman
list.add(new users(001,"bigsai","man"));//添加數(shù)據(jù)元素 一個users由(001,bigsai,man)三個數(shù)據(jù)項組成 
list.add(new users(002,"smallsai","man"));//數(shù)據(jù)元素
list.add(new users(003,"菜虛鯤","woman"));//數(shù)據(jù)元素
woman.add(list.get(2));//003,"菜虛鯤","woman"三個數(shù)據(jù)項構(gòu)成的一個數(shù)據(jù)元素

數(shù)據(jù):對客觀事物的符號表示,指所有能輸入到計算機(jī)中并被計算機(jī)程序處理的符號的集合總稱。

上述表中的三條用戶信息的記錄就是數(shù)據(jù)(也可能多表多集合)。這些數(shù)據(jù)一般都是用戶輸入或者是自定義構(gòu)造完成。當(dāng)然,還有一些圖像、聲音也是數(shù)據(jù)。

數(shù)據(jù)元素:數(shù)據(jù)元素是數(shù)據(jù)的基本單位。一個數(shù)據(jù)元素由若干數(shù)據(jù)項構(gòu)成!可認(rèn)為是一個pojo對象、或者是數(shù)據(jù)庫的一條記錄。比如菜虛鯤那條記錄就是一個數(shù)據(jù)元素。

數(shù)據(jù)項: 而構(gòu)成用戶字段/屬性的有idname、sex等,這些就是數(shù)據(jù)項.數(shù)據(jù)項是構(gòu)成數(shù)據(jù)元素的最小不可分割字段??梢钥醋饕粋€pojo對象或者一張表(people)的一個屬性/字段的值。

數(shù)據(jù)對象:是相同性質(zhì)數(shù)據(jù)元素的集合。是數(shù)據(jù)的一個子集。比如上面的users表、list集合、woman集合都是數(shù)據(jù)對象。多帶帶一張表,一個集合都可以是一個數(shù)據(jù)對象。

數(shù)據(jù)類型

原子類型:其值不可再分的類型。比如int,char,double,float等。

結(jié)構(gòu)類型:其值可以再分為若干成分的數(shù)據(jù)類型。比如結(jié)構(gòu)體構(gòu)造的各種結(jié)構(gòu)等。

抽象數(shù)據(jù)類型(ADT):抽象數(shù)據(jù)類型(ADT)是一個實現(xiàn)包括儲存數(shù)據(jù)元素的存儲結(jié)構(gòu)以及實現(xiàn)基本操作的算法。使得只研究和使用它的結(jié)構(gòu)而不用考慮它的實現(xiàn)細(xì)節(jié)成為可能。比如我們使用Arraylist。二叉樹等等只需要new 一個而不需要去具體考慮他的內(nèi)部實現(xiàn)方式。只需要了解他的api和性質(zhì)即可。其實各個框架的思想也是這樣,對數(shù)據(jù)、接口進(jìn)行封裝、繼承使得我們只需要會用而不需要弄清楚它的具體實現(xiàn)細(xì)節(jié)。

三要素

邏輯結(jié)構(gòu):數(shù)據(jù)元素之間的邏輯關(guān)系。邏輯結(jié)構(gòu)分為線性結(jié)構(gòu)非線性結(jié)構(gòu)。線性結(jié)構(gòu)就是順序表、鏈表之類。而非線性就是集合、樹、圖這些結(jié)構(gòu)。

存儲結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)在計算機(jī)中的表示(又稱映像,也稱物理結(jié)構(gòu)),存儲結(jié)構(gòu)主要分為順序存儲、鏈?zhǔn)酱鎯?/b>、索引存儲散列(哈希)存儲。

數(shù)據(jù)的運算:施加在數(shù)據(jù)上的運算包括運算的定義實現(xiàn),運算的定義基于邏輯結(jié)構(gòu),運算的實現(xiàn)基于存儲結(jié)構(gòu)。

在這里容易混淆的是邏輯結(jié)構(gòu)與存儲結(jié)構(gòu)的概念。對于邏輯結(jié)構(gòu),不難看得出邏輯二字。邏輯關(guān)系也就是兩者存在數(shù)據(jù)上的關(guān)系而不考慮物理地址的關(guān)系。比如線性結(jié)構(gòu)和非線性結(jié)構(gòu),它描述的是一組數(shù)據(jù)中的聯(lián)系方式形式,他針對的是數(shù)據(jù)。而存儲結(jié)構(gòu)就是跟物理地址掛鉤的。比如同樣是線性表,可能有多種存儲結(jié)構(gòu)的實現(xiàn)方式。比如順序表鏈表(Arraylist,Linkedlist)它們的存儲結(jié)構(gòu)就不同并且采用不同存儲結(jié)構(gòu)在不同場景計算機(jī)運算次數(shù)和效率不同。它關(guān)注的是計算機(jī)物理地址與運行具體實現(xiàn)方式

算法分析

五個重要特性

至于算法的概念,傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)介紹都會有:有窮性、確定性、可行性、輸入、輸出。這些從字面意思即可理解。

而一個好的算法,通常更要著重考慮的是效率和空間資源占用。

算法效率的度量

通常復(fù)雜度更多描述的是一個量級程度而很少用具體數(shù)字描述。

空間復(fù)雜度

概念:是對一個算法在運行過程中臨時占用存儲空間大小的量度,記做S(n)=O(f(n))

空間復(fù)雜度其實在算法的衡量占比是比較低的,但是不能忽視空間復(fù)雜度中重要性。無論在刷題還是實際項目生產(chǎn)內(nèi)存都是一個極大額指標(biāo)。對于java而言更是如此。本身內(nèi)存就大,如果采用的存儲邏輯不太好會占用更多的系統(tǒng)資源,對服務(wù)造成壓力。

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

當(dāng)然,你的時間算法的空間花銷最大不能超過jvm設(shè)置的最大值,一般為2G.(2147483645)如果開二維數(shù)組多種多維數(shù)據(jù)不要開的太大,可能會導(dǎo)致heap OutOfMemoryError。

時間復(fù)雜度

概念:計算機(jī)科學(xué)中,算法的時間復(fù)雜度是一個函數(shù),它定性描述了該算法的運行時間。這是一個關(guān)于代表算法輸入值的字符串的長度的函數(shù)。時間復(fù)雜度常用大O符號表述,不包括這個函數(shù)的低階項和首項系數(shù)。使用這種方式時,時間復(fù)雜度可被稱為是漸近的,它考察當(dāng)輸入值大小趨近無窮時的情況。

時間復(fù)雜度的排序:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2^) < O(n^3^) < O(2^n^)

常見時間復(fù)雜度:對于時間復(fù)雜度,很多人的概念是比較模糊的。下面舉例子說明一些時間復(fù)雜度。

O(1): 常數(shù)函數(shù)

a=15

O(logn): 對數(shù)函數(shù)

for(int i=1;i

分析:假設(shè)執(zhí)行t次使得i=n;有2^t^=n; t=log~2~n,為log級別時間復(fù)雜度為O(logn)。

還有二分查找,拓展歐幾里得,快速冪等算法均為O(logn)(曾記錄過)。屬于高效率算法。

O(n): 線性函數(shù)

for (int i=0;i

比較常見,能夠良好解決大部分問題。

O(nlogn):

for (int i=1;i

for (int j=1;j

常見的排序算法很多正常情況都是nlogn。

O(n^2^)

for(int i=0;i
for(int j=0;j

其實O(n^2^)的效率就不敢恭維了。對于大的數(shù)據(jù)O(n^2^)甚至更高次方的執(zhí)行效果會很差。

當(dāng)然如果同樣是n=10000.那么不同時間復(fù)雜度額算法執(zhí)行次數(shù)、時間也不同。

具體 n 執(zhí)行次數(shù)
O(1) 10000 1
O(log~2~n) 10000 14
O( n^1/2^) 10000 100
O(n) 10000 10000
O(nlog~2~n) 10000 140000
O(n^2^) 10000 100000000
O(n^3^) 10000 1000000000000

當(dāng)然有些復(fù)雜度靠先天結(jié)構(gòu)優(yōu)勢,比如樹的查找,線段樹的動態(tài)排序等等。還有的是靠算法策略解決,比如同樣是排序,冒泡排序的地位就略低,還有dp算法用動態(tài)發(fā)現(xiàn)規(guī)律解決問題。要想變得更快,那就得掌握更高級的數(shù)據(jù)結(jié)構(gòu)和更精巧的算法。

時間復(fù)雜度計算
時間復(fù)雜度計算一般步驟

1、找到執(zhí)行次數(shù)最多的語句

2、計算語句執(zhí)行的數(shù)量級
3、用O表示結(jié)果

兩個規(guī)則:

加法規(guī)則: 同一程序下如果多個并列關(guān)系的執(zhí)行語句那么取最大的那個。
eg: 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)結(jié)構(gòu),時間復(fù)雜度按乘法進(jìn)行計算
eg:T(n)=O(m)*O(n)=O(mn)
·T(n)=O(m)*O(m)=O(m^2)(兩層for循環(huán))

其他:

當(dāng)然有些算法的時間復(fù)雜度還跟輸入的數(shù)據(jù)有關(guān),分為還會有最優(yōu)時間復(fù)雜度(可能執(zhí)行次數(shù)最少時),最壞時間復(fù)雜度(執(zhí)行次數(shù)最少時),平均時間復(fù)雜度.這在后面的排序算法會具體分析。

當(dāng)然,后面會一起學(xué)習(xí)一些常見的數(shù)據(jù)結(jié)構(gòu)和常見的算法,進(jìn)行復(fù)雜度剖析。至于緒論,就先介紹這些,下面會先介紹線性表和遞歸算法。

歡迎關(guān)注我的個人公眾號:bigsai

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76037.html

相關(guān)文章

  • 《設(shè)計模式》1.緒論

    摘要:設(shè)計模式是一套被反復(fù)使用的多數(shù)人知曉的經(jīng)過分類編目的代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了重用代碼讓代碼更容易被他人理解保證代碼可靠性。由此可見,其實設(shè)計模式就是從大型軟件架構(gòu)出發(fā)便于升級和維護(hù)的軟件設(shè)計思想,它強(qiáng)調(diào)降低依賴,降低耦合。 點擊進(jìn)入我的博客 1.1 設(shè)計模式概述 什么是設(shè)計模式 設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。設(shè)計模式是一套被反復(fù)使用的、...

    bovenson 評論0 收藏0
  • webpack 使用指南-緒論

    摘要:在講解之前先回顧一下筆者在項目開發(fā)中的工作流變化時代此時工作流大致為結(jié)合插件處理視圖處理樣式等庫此時由于依賴少手動引入各種標(biāo)簽結(jié)合調(diào)試界面時代利用指令服務(wù)控制器將邏輯拆分為多個文件利用編譯會將分為全局樣式和組件樣式下載各種依賴此時任需要手動 在講解 webpack 之前先回顧一下筆者在項目開發(fā)中的工作流變化. jquery 時代 此時工作流大致為 jquery 結(jié)合插件處理視圖 bo...

    Nosee 評論0 收藏0
  • Python入門學(xué)習(xí)筆記匯總

    摘要:導(dǎo)語本文章匯總了本人在學(xué)習(xí)基礎(chǔ)之緒論篇數(shù)據(jù)結(jié)構(gòu)篇函數(shù)篇面向?qū)ο笃刂屏鞒唐驮幊唐獙W(xué)習(xí)筆記的鏈接,打算入門的朋友們可以按需查看并交流。 導(dǎo)語:本文章匯總了本人在學(xué)習(xí)Python基礎(chǔ)之緒論篇、數(shù)據(jù)結(jié)構(gòu)篇、函數(shù)篇、面向?qū)ο笃?、控制流程篇和元編程篇學(xué)習(xí)筆記的鏈接,打算入門Python的朋友們可以按需查看并交流。 第一部分:緒論篇 1、Python數(shù)據(jù)模型 第二部分:數(shù)據(jù)結(jié)構(gòu)篇 2、序列構(gòu)成...

    U2FsdGVkX1x 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<