第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

給定 5 mb 內(nèi)存和 5 秒時(shí)間的限制,如何在中找到一定數(shù)量的唯一單詞?

給定 5 mb 內(nèi)存和 5 秒時(shí)間的限制,如何在中找到一定數(shù)量的唯一單詞?

桃花長(zhǎng)相依 2021-11-16 15:42:06
任何人都好,誰回答了我的問題。我試圖解決找到一定數(shù)量的獨(dú)特單詞的問題,這些單詞將作為輸入輸入,第一個(gè)輸入將是要輸入的單詞數(shù)量。像這樣:5tracklostscalelosttable正確答案應(yīng)該是:4我已經(jīng)嘗試在 Python 中解決這個(gè)問題,如下所示:a=set()x = int(input())a.add(x)for i in range(x):    y = input()    a.add(y)print(len(a)-1)它似乎工作得很好,只是在內(nèi)存方面效率不高(它超出了內(nèi)存限制,在高輸入下)。有沒有更有效的方法來解決這個(gè)問題?
查看完整描述

3 回答

?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

由于您使用的是 Python 3.6+,因此可以節(jié)省廉價(jià)內(nèi)存:使用dict,而不是set. 盡管需要為每個(gè)元素存儲(chǔ)一個(gè)值,dict但即使在舊版本的 Python 中,s 也經(jīng)常使用更少的內(nèi)存(它們針對(duì)不同的事物進(jìn)行了優(yōu)化;set傾向于過度分配桶以降低桶沖突的風(fēng)險(xiǎn),但這會(huì)花費(fèi)更多內(nèi)存) ; 在 3.6+ 中,他們轉(zhuǎn)向更緊湊的dict設(shè)計(jì),只要唯一數(shù)據(jù)不是很大,就可以節(jié)省更多(set當(dāng)唯一項(xiàng)目的數(shù)量超過2**15/32768 時(shí),s 可以再次開始贏得某些大小,因?yàn)榫o湊性收益下降在那一點(diǎn)上戲劇性地)。


因此,要更改它,只需執(zhí)行以下操作:


a = {}

x = int(input())

for _ in range(x):

    a[input()] = None

print(len(a))

此外,為了速度,如果您不需要使用input,您可能應(yīng)該避免使用它并直接讀取sys.stdin;input做了很多不必要的輸出刷新和其他你在這里并不真正需要的工作。所以這樣做可能會(huì)更快:


import itertools, sys


x = int(input())

a = dict.fromkeys(itertools.islice(sys.stdin.buffer, x))

print(len(a))

它只是直接拉動(dòng)線條而無需修改,并將它們直接推入dictC 級(jí)以獲得額外的速度。更改sys.stdin以sys.stdin.buffer避免在所有解碼串,并在包裝map(str.rstrip, ...)或map(bytes.rstrip, ...)用于sys.stdin.buffer去除換行符(如果最后一行可能無法在新行結(jié)束了,這是必要的正確性,我想這樣可以節(jié)省內(nèi)存微不足道的金額)。


如果輸入可能很大(更高的五位數(shù)唯一輸入),那么dict可能無濟(jì)于事,所以堅(jiān)持使用set,但您仍然可以使用sys.stdin優(yōu)化,導(dǎo)致最終形式如下:


x = int(input())

a = set(itertools.islice(map(bytes.rstrip, sys.stdin.buffer), x))

print(len(a))


查看完整回答
反對(duì) 回復(fù) 2021-11-16
?
三國(guó)紛爭(zhēng)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊

根據(jù)數(shù)據(jù)的預(yù)期性質(zhì):


對(duì)于字典單詞,尤其是相似的單詞,請(qǐng)使用 trie

對(duì)于長(zhǎng)文本,使用無損壓縮

zlib壓縮示例:


import zlib


a = set()

x = int(input())

for _ in range(x):

    a.add(zlib.compress(input().encode()))

    #a.add(input())


print("unique: ", len(a))


print("memory: ", sum(len(b) for b in a))

未壓縮:


> echo -e "3\naaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\naaaaaaaaaaaaaaaa" | python3 c.py

unique:  2

memory:  32

壓縮:


> echo -e "3\naaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\naaaaaaaaaaaaaaaa" | python3 c.py

unique:  2

memory:  22


查看完整回答
反對(duì) 回復(fù) 2021-11-16
?
HUH函數(shù)

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊

它給我?guī)砹?2 個(gè)解決方案。第一個(gè)是使用 JSON 結(jié)構(gòu)。JSON 結(jié)構(gòu)使用唯一鍵,然后,您可以創(chuàng)建此結(jié)構(gòu),然后檢查您有多少鍵。


代碼看起來像這樣


對(duì)于這兩個(gè)例子,我假設(shè)你有一個(gè)包含所有單詞的數(shù)組,這個(gè)數(shù)組將是 words_array


unique_words = {}

for word in words_array:

  unique_words[word.lower().strip()] = 1 

  # this  one could be any value

  # i just need to create the key value


print len(unique_words)

我使用lower并strip確保這個(gè)詞是獨(dú)一無二的,無論單詞中的大寫還是空格。


另一種方法是如果單詞已存在則檢查數(shù)組,此方法有效但效率較低


unique_words = []

for word in words_array:

  w = word.lower().strip()

  if not w in unique_words:

    unique_words.append(w)


print len(unique_words)

如果您正在尋找內(nèi)存效率,我會(huì)建議其他替代方案,例如使用 C


查看完整回答
反對(duì) 回復(fù) 2021-11-16
  • 3 回答
  • 0 關(guān)注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)