#你知道尛 │ 你知道小星星跟ABC在法律上是實質相同的歌嘛?
----------------------------
金曲獎最佳年度歌曲的《刻在我心底的名字》深陷抄襲疑雲,近日同樣因為歌曲相似度而在網路上引發熱議的,還有發行首張單曲就席捲音樂界的18歲歌手Olivia Rodrigo。
Olivia Rodrigo今年5月發行的新歌Good 4 U被國外網友點名抄襲了搖滾樂團Paramore在2007年推出的Misery Business。如果你還沒聽過這首歌,以下是附timecode的YT連結:
➤ Olivia Rodrigo - Good 4 U (2021):
https://youtu.be/gNi_6U5Pm_o?t=44
➤ Paramore- Misery Business (2007):
https://youtu.be/aCyGvGEtOwc?t=37
仔細聽可以發現兩首歌的和弦非常相似。事實上,Paramore的主唱Hayley Williams與前吉他手Josh Farro事後還被Olivia Rodrigo列成該首歌的共同作曲人。這種擷選原曲旋律後重新填詞的作法,稱為「插值」(Interpolation)。
插值在流行音樂裡是相當常見的做法,Ariana Grande、Bon Jovi、David Bowie、Ed Sheeran、Flo Rida、Kanye West、Nicki Minaj、Taylor Swift與披頭四等都曾在歌曲中插入其他藝術家的原曲旋律。
擅長樂理分析的YouTuber亞當‧尼利(Adam Neely)從和弦(chords)、旋律曲線(Melodic Contour)、各小節的升降音等面向下去比較,發現一個有趣的事實:Good 4 U、Misery Business、Boulevard Of Broken Dreams與We Are Never Ever Getting Back Together都有相同的和弦編曲(chord progression)、主調(target tone)、切分音(syncopation)與結構。
有興趣的人可以跳轉到下面的timecode比較這四首歌的差異(泰勒絲的We Are Never Ever Getting Back Together真的嚇歪我,跟Paramore的Misery Business有夠像):
➤ Green Day - Boulevard Of Broken Dreams (2005):
https://youtu.be/Soa3gO7tL-c?t=78
➤ Taylor Swift - We Are Never Ever Getting Back Together (2010):
https://youtu.be/WA4iX5D9Z64?t=48
根據統計,1990年至2016年間告示牌排行榜前100名的歌曲中,有300多首歌可被歸入常見的四大和弦編曲裡、佔總數的12.3%;可見受歡迎的流行歌存在某種被偏好的編曲旋律,也就是所謂的「金曲公式」。
近年在著作權法的規範下,時常發生兩首聽起來截然不同的歌被判定為「實質相同」的狀況,像是披頭四吉他手George Harrison的歌曲My Sweet Lord被控侵權The Chiffons的歌曲He so Fine,或是Katy Perry的Dark Horse被控抄襲Marcus Gray的福音歌Joyful Noise。
想自證「自己沒有在無意間聽過這首歌」在法庭上極為困難,被告極有可能花費大把金錢卻仍落得敗訴的下場。
為了避免剛起步音樂人的創意被版權規範扼殺在搖籃裡,擁有音樂學位、會寫程式的律師迪米安(Damien Riehl)的諾亞(Noah Rubin)推出All The Music計畫:用演算法將一個八度內所有的音階排列組合譜寫成包含12個音符的旋律,並將旋律無償提供給大眾使用。
迪米安表示,這些數據在被存入外接硬碟後立即享有著作權的保護,如果AI譜寫出的旋律可受著作權保護,他們將以公共領域貢獻(CC0)形式授權給大家;若AI的創作不具著作權,那麼任何人都可使用這些旋律,避免人們再因為旋律的實質相同而被告上法院。
#迪米安跟諾亞真的帥慘了 #音樂法律程式三棲還心懷天下蒼生 #只能respect #尛編
Source: Adam Neely, All The Music
#刻在 #刻在我心底的名字 #OliviaRodrigo #Good4U #Paramore #MiseryBusiness #AdamNeely #AllTheMusic
同時也有1部Youtube影片,追蹤數超過8萬的網紅范琪斐,也在其Youtube影片中提到,唯一戰勝 Google 旗下 Deep Mind 公司開發的人工智慧 AlphaGo 的南韓棋王李世乭,宣布將要退休,因為他認為人類永遠沒辦法擊敗人工智慧。 不過演算法不是只會越來越強大,為什麼 AlphaGo 會錯判輸給李世乭呢? 因為AlphaGo 有個叫『隨機森林』的算法,可以預測對手可能...
「排列組合 演算法」的推薦目錄:
- 關於排列組合 演算法 在 阿尼尛 Anima Facebook 的精選貼文
- 關於排列組合 演算法 在 台灣物聯網實驗室 IOT Labs Facebook 的最佳解答
- 關於排列組合 演算法 在 Facebook 的最讚貼文
- 關於排列組合 演算法 在 范琪斐 Youtube 的最佳貼文
- 關於排列組合 演算法 在 Re: [討論] 排列組合的演算法解題- 看板Programming 的評價
- 關於排列組合 演算法 在 看板Programming - Re: [討論] 排列組合的演算法解題 的評價
- 關於排列組合 演算法 在 演算法-排列組合 - YouTube 的評價
- 關於排列組合 演算法 在 [演算法] [C++ / Python] 當DFS 遇上排列 的評價
- 關於排列組合 演算法 在 排列組合演算法- 課程板 的評價
- 關於排列組合 演算法 在 求解排列組合程式 的評價
- 關於排列組合 演算法 在 javascript-algorithms/README.zh-TW.md at master 的評價
- 關於排列組合 演算法 在 學用數學- 影劇中的數理68《我內心的糟糕念頭》Ep7 平行線 ... 的評價
排列組合 演算法 在 台灣物聯網實驗室 IOT Labs Facebook 的最佳解答
量子計算對新一代物流管理的衝擊
文章來源:文/編輯部特約撰稿人
本文作者是編輯部特約撰稿人,隱姓埋名高深莫測,是台灣武功高強的獨行俠,曾職於國際快遞公司,擔任供應鏈分析與管理工作。經歷於各大物流企業與貨主企業,吸收各大門派功夫,並將其融會貫通,自創一派,爾後擔任各大企業供應鏈物流顧問工作,對台灣物流發展有獨特的眼光,總是能夠洞燭機先,布局未來。近年來,在研究與實踐中,不斷提出科技趨勢與產業創新發展策略,希望能為台灣供應鏈產業注入活水。(編輯部)
量子計算(Quantum Computing)是最早的理論基礎源自1969年,1980年代還處於理論探索的時代,2011年加拿大D-Wave公司推出全球第一套號稱商用量子電腦,但是到目前為止,世界各國所提出的量子電腦嚴格來說都只能做特定的計算,離真正的泛用型商業化(例如如預測氣候變遷、藥物最佳成分組合、材料配方最佳組合…等)仍有一段距離,不過猶如當年萊特兄弟首次飛行12秒,開創了人類商用飛行的序幕;量子計算再過幾年將會有更成熟的技術,對於物流界而言,量子計算應用於日益複雜的物流系統是可期待的。
關於量子計算的相關概念,目前已有許多其他文章有專文介紹,本篇不會再贅述這些基礎知識。對我們而言,我們可以這麼理解:假設有一台新的電腦,其運算速度是目前電腦的幾百萬倍,物流業可用這樣的電腦資源做那些改善?
演算法與資料傳輸的重要性
量子計算打開了物流中心與供應鏈系統「最佳化」的一扇窗,但是要能有效利用量子計算,關鍵還是相關數據的即時回報,以及演算法的設計。
物流的實務應用中,最著名的就是旅行推銷員(Traveling Salesman Problem)問題,也就是一個城市假設共有n個點需要去取件,從物流中心出發,我們希望每個點都只拜訪一次,最後再返回物流中心,要怎麼走可使總路徑最短。
假設拜訪點共有25個,就會有25X24X23…X2X1=25!(第一個點有25個選擇、第二個點有24個選擇…依此類推),這個值大概是「1.55X1025」。要在這麼多排列組合中找到最佳路線,假設電腦每一秒可計算「1013」個路線(每秒計算一兆次,已經是超級電腦等級),也需要「1.55X1012」秒,而一年有 3.1536X107秒,大約需要「5X104」年才能算完,就算是祖孫三代都不停歇,也無法完成此計算。
然而實務上的問題不光是如此:每台貨運車輛在都會間的最後一哩配送,每天至少都是20~40個點,而且以往 我們的運具種類少,因此在做路線最佳化時,大概只需考慮最佳路線這件事;現在(甚至以後),貨運運具種類越來越多,除了無人機、無人車,還有人類駕駛員的電動小車、甚至派送員騎的機車、自行車。
也就是說,如果有n個物流配送點,每個配送點可選擇m種運具,光是運具的排列組合就有「m x m x m .…= m2」種,再考慮最佳的路線求總運輸成本最低,而且這個計算尚未考量各運具所在道路的車流狀況,有時候算出的最短路徑說不定剛好就是塞車的路徑。
在演算法設計上,就好像要計算1+2+3…100的累加,我們可以很直覺利用一個100次的循環,每次把數字依序加入,最後得到結果;也可以利用「(100(100+1))/2」這個公式直接算出來;要計算哪條路徑最短,我們可以使用暴力破解(brute force)方式,先窮舉所有可能的路徑,逐一計算其運輸成本,全部算完後再決定最佳路徑,也可透過啟發式演算法,找到「近似最佳」的路徑。
演算法好壞有著天壤之別,如果使用較差的演算法,或許透過量子電腦可算出最佳解,但是需要耗用較多時間,這些計算時間都代表成本,如果要花很多錢計算去找出最佳解,反而減損了最佳解所帶來的實際效益,因此好的演算法才是最佳化的硬道理。
而在資料的即時回報上,這也是量子計算過程中需要管理者多關注的議題,因為屆時「計算力」已不是問題,問題是我們是否即時餵給中央系統正確的資料!
例如物流中心目前正在路上的各種運具,每分鐘需回報一次自己所在位置與狀態(包括車輛剩餘的油量、電量、目前載重),以及系統對於目前各運具所在位置與道路擁擠狀況,因此這些車輛上必須有相關的IOT設備,將訊息自動回報給物流中心後,物流中心彙整再批次送上雲端交給量子電腦計算。
可想見,我們所謂的即時,最多只能以「一分鐘」為單位,因為如果上傳的是五分鐘、十分鐘前的數據給中央系統,算出來也是五分鐘、十分鐘以前「應該」的最佳化狀態,拿五分鐘前的最佳化狀態指令作為物流資源的調度,恐怕會拉大實際運作的差距。
就拿「十分鐘」來說,十分鐘對一個物流系統而言,已經有很多事又變化,例如原本客人的訂單可能被取消、更改配送地點、緊急訂單加入、或是又有100個新的消費者下單…,而量子計算對於這類多變的動態環境,有機會把「物流最佳化」這件事真的做出來。先決條件就是,是否真的有即時把資料餵給系統。
資料來源:https://www.logisticnet.com.tw/publicationArticle.asp?id=1065
排列組合 演算法 在 Facebook 的最讚貼文
🌟免費兒童程式課程體驗
🌟海外也可報名體驗
在十九世紀蒸汽動能機器普遍進入人類社會後,人類生產製造方式產生巨大改變,多數的人力及手工被機器剝奪取代。當時毫無招架能力的人類面對高效率的機器怪獸,也只能拱手讓出職位,許多良民百姓深受失業貧窮之苦,興起了一場工業革命,進而也把人類社會推向一個嶄新的「工業時代」。
-
經過兩世紀,隨著電腦、網路的高科技發明,時代的巨輪又將人類逐漸推向「人工智慧時代」。英國牛津大學研究指出『未來十年內,有47% 的工作可能被高科技的人工智慧取代』。另外,Google工程總監雷蒙德.庫茲威爾也預測『到 2045 年,AI 智慧將超越人類智慧,許多人的飯碗恐怕也將被淘汰』。
-
人類與 AI 共生共存也已是不可抗拒之命運,尤其又經過了這次的病毒疫情席捲,更加速推動世代的變遷,全人類一批批正往虛擬網路、人工智慧的新世界接踵邁進。因此,現今人類要以工業時代歷史為借鑑,為了避免孩子未來職場被機器人剝奪,在教育觀念上要有所改變,傳統的博聞強記之學應避免,邏輯思考力及創造力才是未來孩子必須培養的能力。
-
《Cheers》雜誌也曾在報導上建議『當面對 AI 浪潮,與其仇視 AI 為搶走工作的敵人,不如與它們合作,各取所長,互補其短。充分了解它們的基本概念、運作邏輯是首要之務。』
-
為了讓新一代輕鬆能輕鬆面對高科技 AI 未來的瞬息萬變,多年前美國的學校、社區或課後班已提供孩子各種程式教育課程。五、六歲的孩子藉由與各種機器人的互動或簡單的樂高遊戲來接觸程式語言的邏輯概念。尤以科技工程師滿山遍谷的矽谷這帶,程式語言教育開發更甚普遍。
-
程式語言對有數理頭腦的孩子是件相當好的創造工具。孩子一進入程式語言變幻莫測的排列組合之間時恍如進入異彩紛呈的魔幻空間,循序漸進地去熟悉掌握語言工具之後,孩子便能發揮能力,激發創意,展現自己。他們大腦不能單單只是被電腦及手機給控制,而是要學會操控這些人工智慧語言,為人類未來建立更美好的新思路。
-
前陣子我也起了讓兒子參加程式教育課程的念頭,希望他在閒暇除了跟朋友們相約連線打電動、聊天外,也能涉獵這些娛樂功能背後所隱藏的語言密碼,讓他大腦培養更清晰的邏輯思考力、解決問題能力及激發創造力。
-
恰巧台灣「 橘子蘋果兒童程式學苑 」特別來邀請兒子免費體驗他們的線上程式教育課程。對電腦有高度興趣的兒子欣然答應。我預約了美國晚上七點到九點的時段 (台灣早上十點到十二點)讓他在遠端平台上線試試「 Scratch 程式設計課程」。
-
起初,我也擔心兒子的中文專業字彙能力有限,會無法吸收課程內容。當準時上線時,專業老師立馬先清楚有條地解說平台的使用方式及上課模式。兒子發現問題馬上可視訊提問,看來師生之間互動交流無障礙,兒子很快便進入學習狀況。
-
橘子蘋果所使用的網路教學平台功能相當完善。兒子先根據課程進度逐一觀看教學影片,然後換到學習平台畫面-自行試著把剛剛學到的程式寫出來。雲端教室內的老師可透由平台上看見兒子的編寫的過程,並給予幫助。若語法寫錯無法順利執行操作時,老師即時進行講解以排除障礙。有時他們之間也會用簡單的英文交流。師生之間溝通流暢度及趣味度與親臨現場教室無異。兒子學習過程相當順利且愉快,也成功地設計了第一款小遊戲。
-
上完兩個小時的課後,設計遊戲的成就感在兒子內心竄動,他對程式語言的興趣大增,拜託我能幫他報名進階課程。看他喜形於色地玩著自己設計的遊戲時,證明此堂體驗課的學習成效頗大,促使我又進一步去了解整體的課程規劃及報名方式。
學苑主任 Roy 老師,在體驗課後親切詳盡解說了橘子蘋果的創建理念及整套課程的規劃。
-
我非常激賞橘子蘋果創辦人 Raymond 自矽谷回台後,十多年來策馬前驅竭力推動台灣兒童的程式教育,成功地開發教材,將四十幾間教室駐點遍佈台灣,並提供規模完善的程式教育環境,課程編排也與時俱進,其優秀的專業師資及教育品質不亞於美國。學成的學員更能進一步與學界、業界進行交流、測驗及比賽,讓熱愛程式語言的兒童能盡情發揮所長,天賦不被埋沒。
-
他們目前提供由淺至深提供了一整套國小到國中孩子設計的程式教育課程,包括:
→ 初階:Scratch 程式設計課程
→ 進階:Python、Java Script 程式開發及 HTMK/CSS 網頁開發
→ 高階:網路資料庫應用、演算法、AI 人工智慧。
-
❤️有興趣的父母可以先幫孩子報名橘子蘋果所提供的『首次免費線上程式體驗課程:👉 http://oaoa.fun/3axu8k 』。
如果像我們一樣是居住在美西的孩子亦可選擇〈太平洋時間周五或周六晚上7:00-9:00〉上課。
-
❤️至於最後讓我決定讓兒子報名參加橘子蘋果程式語言線上課程,原因除了他們提供了專業師資課程、順暢的交流平台外,還有以下三點:
◆ 個人化進度:根據學員的程度個人化學習。程度不好的孩子可以學得慢一些讓學習的每一步驟能更穩健札實;程度好的可以加快學習速度,盡早完成整套課程。
◆ 節省交通時間:線上課程最大的好處就是父母不用浪費時間當司機,辛苦往返接送孩子,大大減少舟車勞頓之苦。
◆ 加強中文溝通能力:針對海外學子來說還可以進一步增強中文聽說讀寫能力,何樂而不為。
-
#學程式就到橘子蘋果
#免費兒童程式課程體驗
◎ 橘子蘋果每年還有舉辦夏令營活動,也深受台灣孩子們的喜愛。若暑假期間有回台灣的海外學子也可以參考看看。
👉 贈送給你們~價值千元的免費體驗課程連結:http://oaoa.fun/3axu8k
❤️ 歡迎大家分享給有需要的朋友
排列組合 演算法 在 范琪斐 Youtube 的最佳貼文
唯一戰勝 Google 旗下 Deep Mind 公司開發的人工智慧 AlphaGo 的南韓棋王李世乭,宣布將要退休,因為他認為人類永遠沒辦法擊敗人工智慧。
不過演算法不是只會越來越強大,為什麼 AlphaGo 會錯判輸給李世乭呢?
因為AlphaGo 有個叫『隨機森林』的算法,可以預測對手可能會下哪一步,但李世乭這一步下在 AlphaGo 認為對方不可能會去下的那一步,李世乭當時下完這步棋,Alphago 還認為自己的贏面超過八成,繼續往後下了十手之後,Alphago 自己有一個勝率的表,突然開始下降,發現自己處於弱勢了,開始慌張了,於是 Alphago 就開始亂下險棋,出現了連業餘選手都不會犯的錯,想賭李世乭會出錯,最後就輸了。
但 AlphaGo 也從敗給李世乭找到自身弱點,再次強化學習能力。像 AlphaGo 的孿生兄弟 AlphaGo Zero,就是完全不靠任何人類經驗訓練的神經網路,它就是不斷跟自己對戰學習,結果在自學 3 天後,就以 100:0 打敗了舊版 AlphaGo ,自學 40 天後,就擊敗了曾經戰勝中國棋手柯潔的 AlphaGo Master,成為世界上最強的圍棋程式!
雖然未來人類可能再也贏不過AI,不過AI 的加入反而讓圍棋有了更多玩法,這時候 AI 的功能,是在擴展人類棋手的思路,和人類合作一起探索圍棋還未被發掘的領域。
因為圍棋是世界上最複雜的遊戲!是看哪個顏色的棋子,圈出的空間最多,誰就獲勝。聽起來規則很簡單,但實際上卻複雜到不行。
圍棋的棋盤是 19X19,通常一步會有 200 種下法,圍棋變化位置的排列組合一共有10 的 170 次方種可能性,比整個宇宙的原子數ㄅ10 的 80 次方還要多更多!人類通常都只能憑經驗跟感覺判斷,但判斷才是最困難的。剛有說嘛,圍棋的勝負是由最終局時,雙方控制地盤的多寡決定,但棋局進行到一半,雙方的地盤都還沒封閉,怎麽判斷形勢呢?很多職業棋手之間微妙的差異,就是體現在這個判斷能力上。
但就連開發 AlphaGo 的團隊都坦言,AlphaGo 面前的最大問題,和人類棋手是一樣的,就是圍棋太難了,還有規則中的規則,例如優勢、虧損、打劫,雖然 AlphaGo 的勝利或失敗,完全取決於這些機率的估計是否準確,但計算力還遠遠達不到『最優解』的程度。目前AlphaGo 團隊的做法是,讓AlphaGo學習像人類棋手一樣,去選點和判斷。
當機器把一件事情做得比人類好時,我們還能做什麼?
你對棋王退休有什麼看法?快和我們一起分享!
---------
《#范琪斐ㄉ寰宇漫遊》每週四晚間十點在寰宇新聞播出,沒跟上的也沒關係,歡迎訂閱我們的 YouTube 頻道 🔔#范琪斐ㄉ寰宇漫遊 🔔https://reurl.cc/ZvKM3 十點半準時上傳完整版!
排列組合 演算法 在 看板Programming - Re: [討論] 排列組合的演算法解題 的推薦與評價
※ 引述《gecer (gecer)》之銘言:
: 標題: Re: [討論] 排列組合的演算法解題
: 時間: Sun Aug 1 21:45:46 2021
:
: 題目如下
: https://ibb.co/kSGwmyk
: 用左邊的6個正方形(1~6)pattern將右邊的grid(20x10)填滿 每一次填入至少含一個
: pattern的正方形(如N.4,只填5) grid不可重複填 要畫出所有排列組合並求最小填入
: 次數 初步考慮每個grid有可能被pattern的(1~6)正方形填入 估計大約<6^200種組合
:
看到這個問題覺得有趣想了一下,我的想法如下:
首先複述一下問題:
a. 物件一:帶有6種pattern的矩形,數字1~6代表6種pattern,0代表空白
102
000
304
000
506
b. 物件二:20x10的table,最左上角為(0, 0)
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
c. 使用物件一的矩形填滿物件二的table
d. 物件一可超過物件二邊界,但必須至少一個pattern在邊界內
e. 放置物件一矩形時,不可覆蓋到其他pattern,即填入1~6時,只能在0的位置填入
再來是分析填入方法:
i. 由左填至右,由上填至下,每次選擇一個pattern填入該格,將整個物件一矩形填入。
如果該格已填,則跳過填下一格。
ii. 是否重複?
對於中間任意格子(x, y)
填入2 = (x-2, y)填入1
填入3 = (x, y-2)填入1
填入4 = (x-2, y-2)填入1
填入5 = (x, y-4)填入1
填入6 = (x-2, y-4)填入1
因此,中間任意格子只需要考慮填入1;
又根據問題c.項,必須填滿整個table,因此如果該格是空白,一定是填1
開頭部分需特殊處理,參考v.
iii. 是否會覆蓋到已填入pattern?
根據i.和i.i.所述填法,當(x, y)為0,填入1後,會影響的位置為
(x+2, y), (x, y+2), (x+2, y+2), (x, y+4), (x+2, y+4)
當(x+2, y-2)填入1時,(x+2, y)為3,(x+2, y+2)為5,因此可能出現衝突。
一旦出現衝突,代表無法填入1,即(x, y)無填入任何值,違反問題c.項
=> 嘗試其他組合
iv. 是否會多算?
否,每格可能為1~6,其pattern分別是:1來自該格,2~6來自前面已填入的格子。
v. 是否會少算?
開頭直接填1會少算到填入2~6的可能。
以(0, 0)為例:
如果要填入2,則必須在(-2, 0)填入1
如果要填入3,則必須在(0, -2)填入1
...
所以從(-2, -4)開始填,可填1或不填,意即(0, 0)為6或其他。
當traverse到(0, 0)時,1~6所有可能都跑過,其他格同理。
結論;
一、在物件二開頭之前加入特殊區域,從(-2, -4)開始填表,如下圖所示:
**********************
**********************
**********************
**********************
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
**00000000000000000000
二、由左至右,由上至下填表,'*'區域可填1或者不填,'0'區域必填1
三、如遇到已填pattern的格子,跳過該格
四、如遇到衝突,返回嘗試其他組合
五、統計所有排列組合和填表次數
運用上面一到五,應該就可以找到所有排列組合,至多'*'數平方 (填或不填)
∴ total <= 2^108
另外補上個recursive的pseudo code
long fill_all(x, y, cnt) {
if (x >= TABLE_WIDTH || y >= TABLE_HEIGHT) {
print_table();
min_cnt = MIN(min_cnt, cnt);
return 1;
}
if ((x, y) is in star area) {
n1 = fill_all(next_x, next_y, cnt)
if (try_fill(x, y)) {
n2 = fill_all(next_x, next_y, cnt+1);
clear(x, y);
return n1 + n2;
} else {
return n1;
}
} else {
if (try_fill(x, y)) {
return fill_all(next_x, next_y, cnt+1);
} else {
return 0;
}
}
}
total = fill_all(-2, -4, 0)
以上是我的idea,如果邏輯上有錯誤,或者有多算或少算,再麻煩各位大大指正。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 119.14.65.100 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1628343343.A.7FA.html
... <看更多>
排列組合 演算法 在 演算法-排列組合 - YouTube 的推薦與評價
演算法 - 排列組合. 147 views · 2 years ago ...more. 洪子凡. 8. Subscribe. 8 subscribers. 0. Share. Save. Report. Comments. thumbnail-image. Add a ... ... <看更多>
排列組合 演算法 在 Re: [討論] 排列組合的演算法解題- 看板Programming 的推薦與評價
首先畫個圖:
9
8
7
6
5
4
3
2
1
1234567 位數
假設數值為2545397。
9 x
8
7 x
6
5 x x
4 x
3 x
2x
1
1234567
很容易可以看到,重要的是建立四個遞增點,剩下的點只要在前一個遞增點以下
就不會影響結果:
9 x
8 -
7 -
6 -
5 x x -
4 - - -
3 - - -
2x - - -
1 - - -
1234567
那麼四個遞增點怎麼建立呢?四層迴圈硬跑基本上寫得正確就不會跑出不可能的
狀態,也就是後數比前數大或相等即可(以Python為例,注意range(a, b)表示包含a
到(b-1)):
sum = 0
n_list = [0] * 4
for n_list[0] in range(0, 10):
for n_list[1] in range(n_list[0], 10):
for n_list[2] in range(n_list[1], 10):
for n_list[3] in range(n_list[2], 10):
sum += poss_num(n_list)
每建立一套遞增點,例如2559,那麼我們就要插入剩下三個數並確保三個數不會
影響遞增點數量。
首先觀察2前面不能插值,因為2前面<= 2會使遞增點多一,> 2會使2不再是遞增
點。
再來,如果我們要插在2跟5之間,合法值有幾個?答案是0、1,也就是< 2的兩
個數。同理,插在5跟5之間只要看前面的5而可以接受0~4,5跟9之間也是看5而同樣
是0~4,9之後則是0~8。也就是說,很巧地,你要插一個值到x這個值後面,就有x這
麼多種不重複的可能性。
我們驗證一下極端值0是不是也符合?0369為例,0後面可以插值而不影響遞增數
量或位置嗎?看來是不行的,插個0或以上就變成遞增五個數了,所以0後面插值的可
能性確實是0種。
那麼同樣2559為例,如果我們要插2個值在2後面,1個在9後面,有幾種可能?
2005590
2005591
2005592
.
.
2005598
2015590
.
.
2115598
接在2後面的值有2種可能,9後面就有9種可能,所以是2*2*9 = 36。也就是說,
我們甚至都不用列出來,直接可以簡單乘法就算出這邊的可能性。
那麼同樣跑完全沒有多餘的迴圈來決定三個數「依序」插在哪裡,就可以個別用
上述公式解算出各種插入位置的可能性。第一個數可以有四個位置選擇(四個遞增點
之後),第二個數必須在第一個數同樣或更後面的位置,以此類推。最後就可以加總
:
def poss_num(n_list):
sum = 0
pos_list = [0] * 3
for pos_list[0] in range(0, 4):
for pos_list[1] in range(pos_list[0], 4):
for pos_list[2] in range(pos_list[1], 4):
sum += (
n_list[pos_list[0]]
* n_list[pos_list[1]]
* n_list[pos_list[2]]
)
return sum
總結一下,關鍵就在於兩個點:
1. 選取數字時的迴圈怎麼樣徹底避開不可能狀況 -> 兩者都是遞增
2. 遞增四個數字以及插入位置確定後,如何避免一一窮舉 -> 注意到內層有公式解
注意Python完整Code要把poss_num()的定義搬到主迴圈前面去。執行時間基本上
按下去就出來了。
有心的話可以將兩個多層迴圈都改寫為stack,這樣你就可以處理此問題的通解
:任意位數,任意遞增長度。
--
「傳說的最後,魔王總是被勇者封印。但勇者會逝去、封印會衰弱,魔王卻永遠
不滅。傳說呢?傳說持續著。只是,變質了。所以對於傳說而言,只有反覆無常的自
己是主角,而魔王只是配角。勇者?勇者不過是消耗品罷了,封印則什麼也不是。妳
好不容易有機會當上配角,怎麼走回頭路想成為消耗品?妳早晚會什麼也不是的。」
--星.幻.夢的傳說
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.32.17.60 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1598937076.A.A19.html
※ 編輯: ddavid (114.32.17.60 臺灣), 09/01/2020 13:14:25
還好,你的改良版cut方式夠好,該砍的都有砍掉的話,大概就只多一些量不大
的邏輯判斷成本吧。
... <看更多>