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

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

時(shí)間復(fù)雜度哈希表

時(shí)間復(fù)雜度哈希表

楊魅力 2022-12-09 19:41:21
我以兩種方式實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的算法。一種使用 indexOf,另一種使用哈希表。問題:給定一個(gè)任意的贖金票據(jù)字符串和另一個(gè)包含所有雜志字母的字符串,編寫一個(gè)函數(shù),如果贖金票據(jù)可以從雜志中構(gòu)造出來,該函數(shù)將返回 true;否則,它將返回 false。第一。時(shí)間復(fù)雜度為 O(N^2) 是因?yàn)槲以?ransomNote 中有 N 個(gè)字母并且我可以在 indexOf 中進(jìn)行 N 次搜索嗎?var canConstruct = function(ransomNote, magazine) {    if(magazine.length < ransomNote.length) return false;        const arr = magazine.split("");    for(let i=0; i<ransomNote.length; i++) {        if(arr.indexOf(ransomNote[i]) < 0)            return false;        const index = arr.indexOf(ransomNote[i]);        arr.splice(index, 1);    }        return true;};第二個(gè)。時(shí)間復(fù)雜度是多少?哈希表是否使其成為 O(N)?var canConstruct = function(ransomNote, magazine) {    if(magazine.length < ransomNote.length) return false;        const map = new Map();    for(let i =0; i<magazine.length; i++) {        if(map.has(magazine[i]))            map.set(magazine[i], map.get(magazine[i])+1);        else            map.set(magazine[i], 1);    }        for(let i=0; i<ransomNote.length; i++) {        if(!map.has(ransomNote[i]))            return false;        else {            const x = map.get(ransomNote[i]) - 1;            if(x > 0)                map.set(ransomNote[i], x)            else                map.delete(ransomNote[i]);        }    }        return true;};
查看完整描述

1 回答

?
慕妹3146593

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

第一個(gè)解決方案

好吧,你必須考慮一件事,尤其是在第一個(gè)解決方案中,split, slice  and indexOf方法都有自己的時(shí)間復(fù)雜度。

假設(shè)你在雜志上有 m 封信。當(dāng)你將它拆分成數(shù)組時(shí),你已經(jīng)在那里使用了 O(m) 時(shí)間復(fù)雜度(當(dāng)然還有 O(m) 空間復(fù)雜度,因?yàn)槟銓⑺看鎯?chǔ)在一個(gè)大小為 m 的新數(shù)組中)。

現(xiàn)在您輸入一個(gè)將運(yùn)行 n 次的 for 循環(huán)(其中 n 是 ransomNote 中的字母數(shù))。所以就在那時(shí)和那里你有 O(m * n) 時(shí)間復(fù)雜度。indexOf 操作也將被調(diào)用 n 次,但需要注意的是每次調(diào)用時(shí)它都會(huì)運(yùn)行 O(m)。您可以在那里看到您開始增加時(shí)間復(fù)雜度的速度有多快。

我認(rèn)為它類似于 O(3 * m * n^2) ,它四舍五入到O(m * n^n)時(shí)間復(fù)雜度。我強(qiáng)烈建議不要indexOf多次調(diào)用,只需調(diào)用一次并將其結(jié)果存儲(chǔ)在某處。你要么有一個(gè)索引,要么-1意味著找不到它。

第二種解決方案

好多了。在這里你填充了一個(gè)哈希映射(所以使用了一些額外的內(nèi)存,但考慮到你也首先使用了一個(gè)拆分并存儲(chǔ)它,它應(yīng)該大致相同)。

然后你只需簡(jiǎn)單地循環(huán)遍歷 randomNote 并在 hashMap 中找到一個(gè)字母。在地圖中查找一個(gè)字母的時(shí)間復(fù)雜度為 O(1),因此它對(duì)于此類算法非常有用。

我認(rèn)為最終復(fù)雜度為O(n * m)比第一個(gè)要好得多。

希望我對(duì)你有意義。如果您愿意,我們可以在您回復(fù)后的評(píng)論中更深入地進(jìn)行空間分析


查看完整回答
反對(duì) 回復(fù) 2022-12-09
  • 1 回答
  • 0 關(guān)注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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