剛剛編輯文章按到復原草稿
插入很多不必要東西
但用Pitt沒辦法編輯
所以刪除重po不好意思
以下代之前社團認識的學妹代po詢問
我是今年畢業的新鮮人
今天面試白板考的時候考了跟差集有關的問題
關於時間複雜度的部分怎麼想都想不通
已經查過資料也跟要考資工所的朋友、資工系的朋友討論過
仍然不確定答案,想請版上大神開示一下:D
題目:有A、B兩個未經排序的array
A有n個整數,B有m個整數
寫一個function回傳在A且不在B的整數。
(皆先不討論A、B內各自有重複元素的情況)
我的做法:
1.先把B的每個元素放進dictionary
2.然後用for檢查A的每個元素是否為dictionary的key,不是的話就加入ans的list
3.回傳ans
想以python的dictionary來討論這題的時間複雜度
用B建立長度為m的dictionary
新增一組key-value時間複雜度是O(1);A的長度為n
查找是否在dictionary的key時的時間複雜度是O(1)
我覺得時間複雜度是O(m+n)。
參考leetcode簡中板的類似題目的官方詳解(只有簡中版討論區有官方詳解)
https://reurl.cc/KAaRmyleetcode這題基本一樣
是找出在A且在B的整數
官方是用set來實作
時間複雜度是O(m+n)
想請問dictionary和set()底層的hash原理會是造成時間複雜度不同的關鍵嗎?
Python程式碼如下
def solution(A:List[int], B:List[int]):
ans = []
dic = dict()
for b in B:
dic[b] = b
for a in A:
if a not in dic:
ans.append(a)
return ans
另外,我知道hash在python以外的語言像是C/C++
若是基於紅黑樹來實做的話
時間複雜度會是O(nlogm)。
我想問的是python的時間複雜度!
補充
想知道答案是因為
面試官說我的答案O(m+n)一定不對
他很肯定說這樣做答案絕對不是線性的
想請問這樣計算時間複雜度到底哪裡有問題
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.250.114 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1629135646.A.93D.htmlmimi91261樓O(m+n)是對的吧 08/17 02:01
→ sjensen2樓兩個loop分開怎麼不會是線型的,不解+1 08/17 02:09
→ charle09113樓不專業回答:HashMap廣義來說都是O(1)碰撞之後才會用 08/17 02:54
→ charle09114樓紅黑樹實踐排列碰撞的元素 當Hash array足夠大時紅黑 08/17 02:54
→ charle09115樓樹的成本可以不計 廣義是這樣 若有錯請高手指點迷津 08/17 02:54
→ charle09116樓不過你po的程式碼O(m+n)完全沒毛病 不知面試官的思 08/17 02:54
→ charle09117樓路是怎樣為何會覺得不是 08/17 02:54
sorryla8樓你應該當場反問哪裡不對的,搞不好是面試官自己根本不懂 08/17 04:28
→ wawi29樓面試官搞錯的機率很大 也有可能你們的溝通有一些誤會 08/17 06:41
→ wawi210樓move on就可以了 08/17 06:41
shiauji11樓面試官大概把TreeMap and HashMap搞錯了吧 08/17 06:55
NciscalA12樓c++ 的 std::set 不是 hash map ,std::unorderd_map 08/17 07:05
→ NciscalA13樓才是噢。不過前面 O(m+n) 看起來沒什麼問題。 08/17 07:05
→ NciscalA14樓啊是 std::map 不是 std::set 08/17 07:06
WaterLengend15樓O(m+n) 一票 08/17 08:13
aspwell52016樓再一票O(m+n) 08/17 08:31
Amazonite9617樓c++ 的map (TreeMap)vs unordered map(HashMap)前 08/17 08:39
→ Amazonite9618樓者強調有序所以會用RBTree就會多了log複雜度,後者大 08/17 08:39
→ Amazonite9619樓Hash 表查詢O(1) 但有碰撞好像另當別論,不過機率低 08/17 08:39
→ Amazonite9620樓,Amortized 應該仍是O(1),有誤歡迎指正 08/17 08:39
→ aa0669721樓O(m+n)吧 但如果面試官說錯的話 我會問他是因為hash coll 08/17 08:39
→ aa0669722樓ision嗎 08/17 08:39
sooge23樓不是線性的話就是nlogn了吧 面試官一定想到紅黑樹了 08/17 09:00
→ yyc121724樓面試官搞錯了 08/17 09:18
eigen55525樓unordered map發生嚴重碰撞的話 搜尋的worst case 是 O( 08/17 09:40
→ eigen55526樓m) 08/17 09:40
→ eigen55527樓average case才是O(1) 08/17 09:41
DarkIllusion28樓面試官沒解釋自己的思路 感覺有點雷R 08/17 11:06
zenithyoung29樓O(m+n) +1 08/17 11:28
jass97099130樓這面試官不太行啊 不過建議你可以問下數據大小 如果 08/17 13:09