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

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

生活随笔

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

编程问答

贪婪算法近似集合覆盖问题的解

發(fā)布時(shí)間:2024/9/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪婪算法近似集合覆盖问题的解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)例:
假設(shè)你辦了個(gè)廣播節(jié)目,要讓全美50個(gè)州的聽(tīng)眾都聽(tīng)到。為次,你需要決定哪些廣播臺(tái)播出。在每個(gè)廣播臺(tái)播出都需要支付費(fèi)用,因此你要盡可能少的在廣播臺(tái)播出。。

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

這樣的話要遍歷所有的可能的子集合組合,就有2n,其中n為廣播臺(tái)數(shù)目,用大O表示法運(yùn)行時(shí)間為O(2n)。如果廣播臺(tái)很多,就成了一個(gè)NP難問(wèn)題,而貪婪算法可以得到非常接近的解:

  • 選出這樣一個(gè)廣播臺(tái),即它覆蓋了最多的州。即便這個(gè)廣播臺(tái)覆蓋了一些已覆蓋的州,也沒(méi)有關(guān)系
  • 重復(fù)第一步,直到覆蓋所有的州
  • 這是一種近似算法,因?yàn)楂@得精確解需要的時(shí)間太長(zhǎng),而貪婪算法可以很好的近似。。
    而貪婪算法的運(yùn)行時(shí)間為O(n2),減少的時(shí)間不止一點(diǎn)點(diǎn)。。

    # coding=utf-8# 要覆蓋的州 states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])# 廣播臺(tái)清單 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() # 存儲(chǔ)最終選擇的廣播臺(tái)while states_needed: # 只要沒(méi)有全部覆蓋完best_station = None states_covered = set() # 存儲(chǔ)已經(jīng)覆蓋的州for station, states in stations.items(): # items()存儲(chǔ)鍵值(廣播臺(tái)和相應(yīng)的覆蓋州)covered = states_needed & states # 集合的交集,判斷還未覆蓋的州與此廣播臺(tái)的交集個(gè)數(shù) if len(covered) > len(states_covered): # 如果當(dāng)前廣播臺(tái)州交集的個(gè)數(shù)大于當(dāng)前要覆蓋的州 best_station = station # 就替換為最優(yōu)的廣播臺(tái)states_covered = covered # 替換已經(jīng)覆蓋的州states_needed -= states_covered # 從要覆蓋的州中減去已經(jīng)覆蓋過(guò)的(集合相減)print 'states_needed:',states_neededfinal_stations.add(best_station) # 添加最優(yōu)的廣播臺(tái)print final_stations

    結(jié)果:

    ========== RESTART: C:\Users\LiLong\Desktop\Algorithm\set_cover.py ========== states_needed: set(['ut', 'ca', 'az', 'or', 'nv']) states_needed: set(['ut', 'az']) states_needed: set(['ut']) states_needed: set([]) set(['ktwo', 'kthree', 'kone', 'kfive']) >>>

    得到了最終選的廣播臺(tái)集合是:’ktwo’, ‘kthree’, ‘kone’, ‘kfive’這4個(gè)

    這只是個(gè)很簡(jiǎn)單的NP難得例子,還有其他的很多,有待進(jìn)一步學(xué)習(xí)。。

    參考:《算法圖解》

    與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的贪婪算法近似集合覆盖问题的解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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