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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

A-priori算法的优化实现

發(fā)布時間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 A-priori算法的优化实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前幾天做了一個作業(yè),要求算出0-9999每一個的質(zhì)因子計算出頻繁集。以前的簡單程序計算太慢,需要30多秒,仔細思考了一下,發(fā)現(xiàn)計算過程有很多的冗余。花了3個小時進行優(yōu)化,結(jié)果改進到0.15s就可以算出來。

(1)優(yōu)1不再區(qū)分每一個bucket對應(yīng)的k頻繁集,而是將所有的頻繁集放在一個集合里面。

(2)優(yōu)2:針對每一個候選頻繁集的過濾,我們可以采取如下策略:因為候選頻繁集是由一個1頻繁集和k-1頻繁集合并得到的,所以我們只需要預(yù)處理所有1頻繁集對應(yīng)的bucket,然后只在這些bucket里面進行查找即可。同時可以過濾掉所有長度小于k的bucket,因為k頻繁集也不可能是這些bucket的子集。

優(yōu)3:針對1頻繁集的優(yōu)化,選擇利用collection模塊的Counter來進行計算,威力無窮,我們需要的就是把一個二維的輸入展開成一個一維的集合,然后利用Counter進行統(tǒng)計即可。怎么把二維展開成一維呢,利用itertools提供的chain函數(shù)(u for u in chain(*raw_data))就可以生成一個生成器,速度非常快,然后把這個生成器給Counter就ok了。

優(yōu)4針對預(yù)處理的優(yōu)化,我們在統(tǒng)計每一個1頻繁集對應(yīng)的bucket時候,是從bucket開始遍歷,然后看該bucket里面有哪些1頻繁集。為了提高效率,可以利用filter進行過濾,這比你自己判斷要快的多。如果頻繁集的單個元素比較大(內(nèi)存占用多),也可以考慮只存索引,在需要的時候再轉(zhuǎn)換回來。

def A_pri(raw_data,s,k):def get_singlgeitems():count = Counter((u for u in chain(*raw_data)))single_count = [set() for i in range(n)]count_filter = set(key for key,val in count.items() if val>=s)return count_filterdef convet_set(data):data_list = list(set(item) for item in data)return data_listraw_data = convet_set(raw_data)n = len(raw_data)single_items = get_singlgeitems()print('single done')data = [{key} for key in single_items]#preprocessD = defaultdict(list)for i,item in enumerate(raw_data):for single in filter(lambda x:x in single_items,(u for u in item)):D[single].append(item)for size in range(2,k+1):next = set()for single in single_items:check = list(filter(lambda x:len(x)>=size,D[single]))for k_item in data:tmp = {single}|set(k_item)tmp_tuple = tuple(sorted(tuple(tmp)))if len(tmp) < size or tmp_tuple in next:continue count = 0for subset in check:if tmp<=subset:count+= 1if count>=s:next.add(tmp_tuple)data = nextfor i in data:print(i)

最后給出生成x(1<=x<=9999)所有質(zhì)數(shù)因子的代碼,利用素數(shù)曬法算出所有素數(shù)(小于9999),然后對每一個素數(shù)找它們的倍數(shù)并添加相應(yīng)的素數(shù)。速度非常的快。

def get_primes(N):end = math.sqrt(N)+1nums = list(range(N+1))i = 2while i<=end: while i<=end and nums[i]==0:i+=1for j in range(i*2,N,i):nums[j] = 0i+=1return [x for x in nums if x!=0][1:]def gen_data(N):primes = get_primes(N)data = [[] for i in range(N)]for x in primes:for t in range(x,N,x):data[t].append(x)return data

總結(jié)

以上是生活随笔為你收集整理的A-priori算法的优化实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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