亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

時間復雜度哈希表

時間復雜度哈希表

楊魅力 2022-12-09 19:41:21
我以兩種方式實現了一個簡單的算法。一種使用 indexOf,另一種使用哈希表。問題:給定一個任意的贖金票據字符串和另一個包含所有雜志字母的字符串,編寫一個函數,如果贖金票據可以從雜志中構造出來,該函數將返回 true;否則,它將返回 false。第一。時間復雜度為 O(N^2) 是因為我在 ransomNote 中有 N 個字母并且我可以在 indexOf 中進行 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;};第二個。時間復雜度是多少?哈希表是否使其成為 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貢獻1820條經驗 獲得超9個贊

第一個解決方案

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

假設你在雜志上有 m 封信。當你將它拆分成數組時,你已經在那里使用了 O(m) 時間復雜度(當然還有 O(m) 空間復雜度,因為你將它全部存儲在一個大小為 m 的新數組中)。

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

我認為它類似于 O(3 * m * n^2) ,它四舍五入到O(m * n^n)時間復雜度。我強烈建議不要indexOf多次調用,只需調用一次并將其結果存儲在某處。你要么有一個索引,要么-1意味著找不到它。

第二種解決方案

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

然后你只需簡單地循環遍歷 randomNote 并在 hashMap 中找到一個字母。在地圖中查找一個字母的時間復雜度為 O(1),因此它對于此類算法非常有用。

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

希望我對你有意義。如果您愿意,我們可以在您回復后的評論中更深入地進行空間分析


查看完整回答
反對 回復 2022-12-09
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號