番外篇:分享一道用Python基礎+蒙特卡洛算法實現(xiàn)排列組合的題目(附源碼)
大家好,我是Python進階者。
是不是覺得很詫異?明明上周剛發(fā)布了這篇:分享一道用Python基礎+蒙特卡洛算法實現(xiàn)排列組合的題目(附源碼),今天又來一篇,名曰番外篇!其實今天是想給大家分享【🌑(這是月亮的背面)】大佬的解法,拍案叫絕!
前情回顧
前幾天在才哥交流群里,有個叫【Rick Xiang】的粉絲在Python交流群里問了一道關于排列組合的問題,初步一看覺得很簡單,實際上確實是有難度的。
題目是:一個列表中有隨機15個數(shù),沒有重復值。從列表里面任意選5個數(shù),如何選出來包含a, a+1的所有組合。a可以是15個數(shù)中的任意一個。
關于思路和解決方法,這篇文章分享一道用Python基礎+蒙特卡洛算法實現(xiàn)排列組合的題目(附源碼)中提供了【張老師】和【有點意思】大佬的想法和解決方案,一共有5份代碼,足夠大家學習了,感興趣的小伙伴快去學習吧,干貨滿滿。
二、新代碼
上周五的時候,發(fā)布了這篇分享一道用Python基礎+蒙特卡洛算法實現(xiàn)排列組合的題目(附源碼)原創(chuàng)文章,很慶幸還有粉絲親自實踐,并給出了建設性的方案,如下圖所示。
這里先給出【🌑(這是月亮的背面)】大佬的偽代碼,這樣看上去大家也更加好理解一些。
- # -*- coding: utf-8 -*-
- # 模塊化
- import random
- import numpy as np
- import time
- # 取出隨機的15個數(shù)值
- def get_random15():
- random_array = [np.array(random.sample(range(2000), 15)) for i in range(100000)]
- random5 = {get_random5(random15) for random15 in random_array}
- return [i for i in random5 if i]
- # 遍歷隨機的15個數(shù)值,取相鄰的兩個隨機數(shù),判斷后返回滿足條件的值
- def get_random5(random_15):
- random_5 = set(random_15[random.sample(range(15), 5)]) # np.array的索引替換choice取值
- # 利用set特性判斷元素是否含有給定的元素
- random_5_resp = {True if len(random_5.intersection({num, num + 1})) == 2 else False for num in random_5}
- return tuple(random_5) if True in random_5_resp else ()
- if __name__ == '__main__':
- start_time = time.time()
- final_result = get_random15()
- print("共%d個符合題意的列表" % len(final_result))
- print("分別是:%s" % final_result)
- end_time = time.time()
- used_time = end_time - start_time
- print()
- print("本次程序用時:{}".format(time.strftime('%H(小時):%M(分鐘):%S(秒)', time.gmtime(used_time))))
這個代碼寫的真的很好,沒有Python基礎的小伙伴看上去肯定有些吃力的,小編自己初看的時候,也覺得有點難以吸收,需要多看幾遍,領悟。
這個代碼親測有效,用之前的代碼大概需要12秒,改用這個只需要1.5秒。
他這里做了三個優(yōu)化,其一是之前從15個數(shù)中隨機取5個值耗時較長,這里用使用了numpy.array的特性來優(yōu)化代碼,在科學計算中,可以省掉很多循環(huán)語句,代碼使用方面比Python列表簡單,Python list 無法直接運算, Numpy Array 可直接運算;其二是刪除了之前的去重函數(shù),這里他也用set去優(yōu)化,所以在這塊也節(jié)約了時間;其三是使用了集合的交集運算(Intersection),較之前的if判斷來說,節(jié)約了時間。
想到這里,不得不感嘆一下,【人生苦短,我用python】!
三、總結
我是Python進階者。本文基于粉絲針對排列組合問題的提問,給出了一個利用Python基礎+蒙特卡洛算法的解決方案,基本上可以達到了粉絲的要求。
不過話說回來,這個方案雖是當下最優(yōu),但不是永遠最優(yōu)。