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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法的重要性

發(fā)布時(shí)間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法的重要性 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編程好比是一輛汽車(chē),而數(shù)據(jù)結(jié)構(gòu)和算法是汽車(chē)內(nèi)部的變速箱。一個(gè)開(kāi)車(chē)的人不懂變速箱的原理也是能開(kāi)車(chē)的,同理一個(gè)不懂?dāng)?shù)據(jù)結(jié)構(gòu)和算法的人也能編程。但是如果一個(gè)開(kāi)車(chē)的人懂變速箱的原理,比如降低速度來(lái)獲得更大的牽引力,或者通過(guò)降低牽引力來(lái)獲得更快的行駛速度。那么爬坡時(shí)使用1檔,便可以獲得更大的牽引力;下坡時(shí)便使用低檔限制車(chē)的行駛速度。

回到編程而言,比如將一個(gè)班級(jí)的學(xué)生名字要臨時(shí)存儲(chǔ)在內(nèi)存中,你會(huì)選擇什么數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ),數(shù)組還是ArrayList,或者HashSet,或者別的數(shù)據(jù)結(jié)構(gòu)。如果不懂?dāng)?shù)據(jù)結(jié)構(gòu)的,可能隨便選擇一個(gè)容器來(lái)存儲(chǔ),也能完成所有的功能,但是后期如果隨著學(xué)生數(shù)據(jù)量的增多,隨便選擇的數(shù)據(jù)結(jié)構(gòu)肯定會(huì)存在性能問(wèn)題,而一個(gè)懂?dāng)?shù)據(jù)結(jié)構(gòu)和算法的人,在實(shí)際編程中會(huì)選擇適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)來(lái)解決相應(yīng)的問(wèn)題,會(huì)極大的提高程序的性能。

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

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

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

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

  • 插入一條新的數(shù)據(jù)項(xiàng)
  • 尋找某一特定的數(shù)據(jù)項(xiàng)
  • 刪除某一特定的數(shù)據(jù)項(xiàng)
  • 迭代的訪(fǎng)問(wèn)各個(gè)數(shù)據(jù)項(xiàng),以便進(jìn)行顯示或其他操作
  • 2、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)

  • 數(shù)組 Array
  • 棧 Stact
  • 隊(duì)列 Queue
  • 鏈表 Linked List
  • 樹(shù) Tree
  • 哈希表 Hash
  • 堆 Heap
  • 圖 Graph
  • 這幾種結(jié)構(gòu)優(yōu)缺點(diǎn)如下:

    二、算法

    算法簡(jiǎn)單來(lái)說(shuō)就是解決問(wèn)題的步驟。

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

    1、算法的五個(gè)特征

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

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

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

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

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

    2、算法的設(shè)計(jì)原則

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

    程序語(yǔ)法錯(cuò)誤。

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

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

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

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

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

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

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

    前面三點(diǎn) 正確性,可讀性和健壯性相信都好理解。對(duì)于第四點(diǎn)算法的執(zhí)行效率和存儲(chǔ)量,我們知道比較算法的時(shí)候,可能會(huì)說(shuō)“A算法比B算法快兩倍”之類(lèi)的話(huà),但實(shí)際上這種說(shuō)法沒(méi)有任何意義。

    因?yàn)楫?dāng)數(shù)據(jù)項(xiàng)個(gè)數(shù)發(fā)生變化時(shí),A算法和B算法的效率比例也會(huì)發(fā)生變化,比如數(shù)據(jù)項(xiàng)增加了50%,可能A算法比B算法快三倍,但是如果數(shù)據(jù)項(xiàng)減少了50%,可能A算法和B算法速度一樣。所以描述算法的速度必須要和數(shù)據(jù)項(xiàng)的個(gè)數(shù)聯(lián)系起來(lái)。也就是“大O”表示法,它是一種算法復(fù)雜度的相對(duì)表示方式,這里我簡(jiǎn)單介紹一下,后面會(huì)根據(jù)具體的算法來(lái)描述。

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

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

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

    然后我們?cè)谡f(shuō)說(shuō)算法的存儲(chǔ)量,包括:

    • 程序本身所占空間;
    • 輸入數(shù)據(jù)所占空間;
    • 輔助變量所占空間;

    一個(gè)算法的效率越高越好,而存儲(chǔ)量是越低越好。

    本篇文章我們簡(jiǎn)單的介紹了數(shù)據(jù)結(jié)構(gòu)和算法的概念,算法是解決問(wèn)題的步驟,而數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)離不開(kāi)算法,可能理解起來(lái)比較模糊,不用擔(dān)心,我們一起來(lái)看下列視頻并跟著老師一起學(xué)習(xí)。

    Java優(yōu)質(zhì)課程推薦:

    Java基礎(chǔ)優(yōu)質(zhì)課程:java零基礎(chǔ)小白自學(xué)Java必備優(yōu)質(zhì)教程_手把手圖解學(xué)習(xí)Java,讓學(xué)習(xí)成為一種享受

    Java數(shù)據(jù)結(jié)構(gòu)于算法:Java基礎(chǔ)入門(mén)必學(xué)知識(shí)數(shù)據(jù)結(jié)構(gòu)與算法_Java數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)到進(jìn)階/Java基礎(chǔ)入門(mén)進(jìn)階/Java數(shù)據(jù)結(jié)構(gòu)分析/Java數(shù)據(jù)結(jié)構(gòu)常見(jiàn)問(wèn)題

    Java全套優(yōu)質(zhì)課程UP主頁(yè):https://space.bilibili.com/609988934

    Java項(xiàng)目:

    【FlappyBird游戲項(xiàng)目】手把手用Java教你做游戲_FlappyBird飛翔的小鳥(niǎo)

    【java項(xiàng)目】白嫖6套Java小游戲教程免費(fèi)分享幫你解決期末作業(yè)煩惱!(附源碼課件)

    【王者榮耀項(xiàng)目】YYDS!!王者榮耀被大佬24小時(shí)開(kāi)發(fā)成功-開(kāi)發(fā)王者如此簡(jiǎn)單_王者榮耀游戲_java項(xiàng)目

    優(yōu)質(zhì)配套課件:

    總結(jié)

    以上是生活随笔為你收集整理的数据结构与算法的重要性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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