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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法图解第八章笔记与习题(贪婪算法)

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法图解第八章笔记与习题(贪婪算法) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法圖解第八章筆記與習(xí)題(貪婪算法)

文章目錄

  • 算法圖解第八章筆記與習(xí)題(貪婪算法)
    • 8.1 貪婪算法
    • 8.2 集合覆蓋問題
    • 8.3 NP完全問題
      • 8.3.1 旅行商問題:
      • 8.3.2 如何識(shí)別NP完全問題
      • 8.4 小結(jié)
    • 練習(xí)
      • 習(xí)題8.1:
        • 習(xí)題8.2:
        • 習(xí)題8.3-5題干:
        • 習(xí)題8.3:
        • 習(xí)題8.4:
        • 習(xí)題8.5:
        • 習(xí)題8.6:
        • 習(xí)題8.7:
        • 習(xí)題8.8:

算法圖解pdf百度云鏈接,提取碼:jttg


8.1 貪婪算法

貪婪算法:對(duì)于一個(gè)問題,根據(jù)問題要求的目標(biāo),每步都選擇局部最優(yōu)解。在某些特定的情況下,貪婪算法能夠得到最優(yōu)解,但通常只能能夠得到一個(gè)接近最優(yōu)解的解。


舉例:從十個(gè)數(shù)中選擇五個(gè)使其和最大1,2,3,4,5,6,7,8,9,10。

根據(jù)問題要求的目標(biāo)(和最大),每步都選擇局部最優(yōu)解(從未被選擇的數(shù)中選擇最大的那個(gè)數(shù))。對(duì)于這個(gè)簡(jiǎn)單的情況來(lái)說(shuō),貪婪算法將得到最優(yōu)解10+9+8+7+6=40。但對(duì)于更復(fù)雜的情況來(lái)說(shuō),通常會(huì)得到一個(gè)接近最優(yōu)解的解。


8.2 集合覆蓋問題

假設(shè)現(xiàn)在有個(gè)廣播節(jié)目,要讓全美國(guó)50個(gè)州的聽眾都收聽得到,為此,需要決定在哪些廣播臺(tái)播出。在每個(gè)廣播臺(tái)播出都需要支付費(fèi)用,因此必須在盡可能少的廣播臺(tái)播出。現(xiàn)有廣播臺(tái)名單如下:

每個(gè)廣播臺(tái)都覆蓋特定的區(qū)域,不同廣播臺(tái)的覆蓋區(qū)域可能重疊。

那么找出覆蓋全美50個(gè)州的最小廣播臺(tái)合集呢?下面是解決步驟:

  • 列出每個(gè)可能的廣播臺(tái)集合,這被稱為冪集(power set)。可能的子集有2n2^n2n個(gè)。
  • 在這些集合中,選出覆蓋全美50個(gè)州的最小集合。
  • 這樣做固然能找到最優(yōu)解,但其時(shí)間復(fù)雜度為O(2n)O(2^n)O(2n),其中n為廣播臺(tái)數(shù)量。在這種情況下,我們可以使用貪婪算法來(lái)解決這個(gè)問題。步驟如下:

  • 選出這樣一個(gè)廣播臺(tái),即它覆蓋了最多未覆蓋的州。即便這個(gè)廣播臺(tái)覆蓋了一些已覆蓋的州(就是重復(fù)覆蓋),也沒有關(guān)系。
  • 重復(fù)第一步,直到覆蓋了所有的州。
  • 這是一種近似算法(approximation algorithm)。在獲得精確解需要的時(shí)間太長(zhǎng)時(shí),可以考慮使用近似算法。判斷近似算法優(yōu)劣的標(biāo)準(zhǔn)如下:

    • 速度有多快;
    • 得到的近似解與最優(yōu)解的接近程度。

    因此貪婪算法是一個(gè)不錯(cuò)的選擇,它們不僅簡(jiǎn)單,而且通常運(yùn)行速度很快。在本例中,貪婪算法的運(yùn)行時(shí)間為O(n2)O(n^2)O(n2),其中n為廣播臺(tái)數(shù)量。

    代碼如下:

    # 創(chuàng)建一個(gè)列表,其中包含要覆蓋的州 states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"]) # 傳入一個(gè)數(shù)組,被轉(zhuǎn)換為集合stations = {} stations["kone"] = set(["id", "nv", "ut"]) stations["ktwo"] = set(["wa", "id", "mt"]) stations["kthree"] = set(["or", "nv", "ca"]) stations["kfour"] = set(["nv", "ut"]) stations["kfive"] = set(["ca", "az"])final_stations = set() # 使用一個(gè)集合來(lái)存儲(chǔ)最終選擇的廣播臺(tái)while states_needed:best_station = None # 將覆蓋了最多的未覆蓋州的廣播臺(tái)存儲(chǔ)進(jìn)去states_covered = set() # 一個(gè)集合,包含該廣播臺(tái)覆蓋的所有未覆蓋的州for station, states in stations.items(): # 循環(huán)迭代每個(gè)廣播臺(tái)并確定它是否是最佳的廣播臺(tái)covered = states_needed & states # 計(jì)算交集if len(covered) > len(states_covered): # 檢查該廣播臺(tái)的州是否比best_station多best_station = station # 如果多,就將best_station設(shè)置為當(dāng)前廣播臺(tái)states_covered = coveredstates_needed -= states_covered # 更新states_neededfinal_stations.add(best_station) # 在for循環(huán)結(jié)束后將best_station添加到最終的廣播臺(tái)列表中print(final_stations) # 打印final_stations set(['ktwo', 'kthree', 'kone', 'kfive']) #(算法也可以用未被覆蓋的州來(lái)做比較,未被覆蓋的州越少,則該廣播臺(tái)是局部更優(yōu)的廣播臺(tái)。)

    上述代碼中,set()是一種集合,類似于列表,但相同的元素在其中出現(xiàn)一次,也沒有索引供查找。

    另外,還涉及到了數(shù)學(xué)中交集的計(jì)算&,以及集合間相見-=。具體不做詳細(xì)介紹。

    使用上述貪婪算法的運(yùn)行時(shí)間僅為O(n2)O(n^2)O(n2),比起遍歷所有子集來(lái)獲得精確解的精確算法O(2n)O(2^n)O(2n)來(lái)說(shuō)非常快。


    8.3 NP完全問題

    8.3.1 旅行商問題:

    旅行商問題是指,旅行商需要在一次旅行中途徑多個(gè)不同的城市,如何求解其最短路徑。

    對(duì)于 1 個(gè)城市而言,僅有 1 條可能的路徑。

    對(duì)于 2 個(gè)城市而言,有 2 個(gè)可能的起點(diǎn)X每個(gè)出發(fā)的城市1條可能的路徑 = 2條可能的路徑。

    對(duì)于 3 個(gè)城市而言,有 3 個(gè)可能的起點(diǎn)X每個(gè)出發(fā)的城市2條可能的路徑 = 6條可能的路徑。

    對(duì)于 4 個(gè)城市而言,有 4 個(gè)可能的起點(diǎn)X每個(gè)出發(fā)的城市6條可能的路徑 = 24條可能的路徑。

    對(duì)于 5 個(gè)城市而言,有 5 個(gè)可能的起點(diǎn)X每個(gè)出發(fā)的城市24條可能的路徑 = 120條可能的路徑。

    ……

    這是一個(gè)階乘函數(shù)(factorical function),當(dāng)涉及的城市越多時(shí),可能的路徑條數(shù)增加的非常快。因此當(dāng)涉及的城市足夠多時(shí),根本就難以計(jì)算出旅行商問題的正確解。

    NP完全問題的簡(jiǎn)單定義是,以難著稱的問題,如旅行商問題和集合覆蓋問題。(?)


    8.3.2 如何識(shí)別NP完全問題

    NP完全問題無(wú)處不在!如果能夠判斷出要解決的問題屬于NP完全問題就好了,這樣就不用去尋找完美的解決方案,而是使用近似算法即可。但要判斷問題是不是NP完全問題很難,易于解決的問題和NP完全問題的差別通常很小。

    但事實(shí)是沒辦法判斷問題是不是NP完全問題,但還是有跡可循的:

    • 元素較少時(shí)算法的運(yùn)行速度非常快,但隨著元素?cái)?shù)量的增加,速度會(huì)變得非常慢。
    • 涉及“所有組合”的問題通常是NP完全問題。
    • 不能將問題分成小問題,必須考慮各種可能的情況。這可能是NP完全問題。
    • 如果問題涉及序列(如旅行商問題中的城市序列)且難以解決,它可能就是NP完全問題。
    • 如果問題涉及集合(如廣播臺(tái)集合)且難以解決,它可能就是NP完全問題。
    • 如果問題可轉(zhuǎn)換為集合覆蓋問題或旅行商問題,那它肯定是NP完全問題。

    8.4 小結(jié)

    • 貪婪算法尋找局部最優(yōu)解,企圖以這種方式獲得全局最優(yōu)解。
    • 對(duì)于NP完全問題,還沒有找到快速解決方案。
    • 面臨NP完全問題時(shí),最佳的做法是使用近似算法。
    • 貪婪算法易于實(shí)現(xiàn)、運(yùn)行速度快,是不錯(cuò)的近似算法。

    練習(xí)

    習(xí)題8.1:

    • 你在一家家具公司工作,需要將家具發(fā)往全國(guó)各地,為此你需要將箱子裝上卡車。每個(gè)箱子的尺寸各不相同,你需要盡可能利用每輛卡車的空間,為此你將如何選擇要裝上卡車的箱子呢?請(qǐng)?jiān)O(shè)計(jì)一種貪婪算法。使用這種算法能得到最優(yōu)解嗎?

    將剩余箱子中最大的一個(gè)裝入箱子,直到將所有的箱子裝入卡車為止。使用這種算法不能找到最優(yōu)解。


    習(xí)題8.2:

    • 你要去歐洲旅行,總行程為7天。對(duì)于每個(gè)旅游勝地,你都給它分配一個(gè)價(jià)值——表示你有多想去那里看看,并估算出需要多長(zhǎng)時(shí)間。你如何將這次旅行的價(jià)值最大化?請(qǐng)?jiān)O(shè)計(jì)一種貪婪算法。使用這種算法能得到最優(yōu)解嗎?

    從剩余未去過的旅游勝地中選擇價(jià)值最高的,直至?xí)r間用完為止。使用這種算法不能找到最優(yōu)解。


    習(xí)題8.3-5題干:

    • 下面各種算法是否是貪婪算法。

    習(xí)題8.3:

    • 快速排序。

    不是。


    習(xí)題8.4:

    • 廣度優(yōu)先搜索。

    是。


    習(xí)題8.5:

    • 狄克斯特拉算法。

    是。


    習(xí)題8.6:

    • 有個(gè)郵遞員負(fù)責(zé)給20個(gè)家庭送信,需要找出經(jīng)過這20個(gè)家庭的最短路徑。請(qǐng)問這是一 個(gè)NP完全問題嗎?

    是。可轉(zhuǎn)化為旅行商問題。


    習(xí)題8.7:

    • 在一堆人中找出最大的朋友圈(即其中任何兩個(gè)人都相識(shí))是NP完全問題嗎?

    是。可轉(zhuǎn)化為集合覆蓋問題。


    習(xí)題8.8:

    • 你要制作美國(guó)地圖,需要用不同的顏色標(biāo)出相鄰的州。為此,你需要確定最少需要使用多少種顏色,才能確保任何兩個(gè)相鄰州的顏色都不同。請(qǐng)問這是NP完全問題嗎?

    不是。(圖著色問題,是NP完全問題。)


    總結(jié)

    以上是生活随笔為你收集整理的算法图解第八章笔记与习题(贪婪算法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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