作者cccict (马路柏油)
看板Soft_Job
标题[请益] 面试白板考题目的时间复杂度
时间Tue Aug 17 01:40:44 2021
刚刚编辑文章按到复原草稿
插入很多不必要东西
但用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/KAaRmy
leetcode这题基本一样
是找出在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://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1629135646.A.93D.html
1F:推 mimi9126: O(m+n)是对的吧 08/17 02:01
2F:→ sjensen: 两个loop分开怎麽不会是线型的,不解+1 08/17 02:09
3F:→ charle0911: 不专业回答:HashMap广义来说都是O(1)碰撞之後才会用 08/17 02:54
4F:→ charle0911: 红黑树实践排列碰撞的元素 当Hash array足够大时红黑 08/17 02:54
5F:→ charle0911: 树的成本可以不计 广义是这样 若有错请高手指点迷津 08/17 02:54
6F:→ charle0911: 不过你po的程式码O(m+n)完全没毛病 不知面试官的思 08/17 02:54
7F:→ charle0911: 路是怎样为何会觉得不是 08/17 02:54
8F:推 sorryla: 你应该当场反问哪里不对的,搞不好是面试官自己根本不懂 08/17 04:28
9F:→ wawi2: 面试官搞错的机率很大 也有可能你们的沟通有一些误会 08/17 06:41
10F:→ wawi2: move on就可以了 08/17 06:41
11F:推 shiauji: 面试官大概把TreeMap and HashMap搞错了吧 08/17 06:55
12F:推 NciscalA: c++ 的 std::set 不是 hash map ,std::unorderd_map 08/17 07:05
13F:→ NciscalA: 才是噢。不过前面 O(m+n) 看起来没什麽问题。 08/17 07:05
14F:→ NciscalA: 啊是 std::map 不是 std::set 08/17 07:06
15F:推 WaterLengend: O(m+n) 一票 08/17 08:13
16F:推 aspwell520: 再一票O(m+n) 08/17 08:31
17F:推 Amazonite96: c++ 的map (TreeMap)vs unordered map(HashMap)前 08/17 08:39
18F:→ Amazonite96: 者强调有序所以会用RBTree就会多了log复杂度,後者大 08/17 08:39
19F:→ Amazonite96: Hash 表查询O(1) 但有碰撞好像另当别论,不过机率低 08/17 08:39
20F:→ Amazonite96: ,Amortized 应该仍是O(1),有误欢迎指正 08/17 08:39
21F:→ aa06697: O(m+n)吧 但如果面试官说错的话 我会问他是因为hash coll 08/17 08:39
22F:→ aa06697: ision吗 08/17 08:39
23F:推 sooge: 不是线性的话就是nlogn了吧 面试官一定想到红黑树了 08/17 09:00
24F:→ yyc1217: 面试官搞错了 08/17 09:18
25F:推 eigen555: unordered map发生严重碰撞的话 搜寻的worst case 是 O( 08/17 09:40
26F:→ eigen555: m) 08/17 09:40
27F:→ eigen555: average case才是O(1) 08/17 09:41
28F:推 DarkIllusion: 面试官没解释自己的思路 感觉有点雷R 08/17 11:06
29F:推 zenithyoung: O(m+n) +1 08/17 11:28
30F:推 jass970991: 这面试官不太行啊 不过建议你可以问下数据大小 如果 08/17 13:09
31F:→ jass970991: 面试官说数据量很大 那你可以说有碰撞问题 如果不是 08/17 13:09
32F:→ jass970991: 那你可以选别家公司了 08/17 13:09
33F:推 pttano: 这间面试官程度太差了 08/17 18:19
34F:推 TheOneisNEO: 南港面过做手机的公司 主管也是坚持hash search not 08/17 18:39
35F:→ TheOneisNEO: O(1) 08/17 18:39
36F:推 Parazicecum: 面试官只是希望你说一下worst case而已吧 我感觉面试 08/17 21:22
37F:→ Parazicecum: 的时候被要求分别提一下worst case跟average case的 08/17 21:22
38F:→ Parazicecum: 情况还蛮常见的啊 08/17 21:22
39F:推 MyNion: O(n+m) +1,除非每一个插进HashSet的元素都杂凑碰撞 08/17 21:58
40F:→ MyNion: 才会让复杂度变成O(n*m) 08/17 21:58
41F:→ MyNion: 那面试官的主观意识感觉过强+不善沟通,雷雷的不去也罢 08/17 21:59
42F:→ cha122977: 也有可能是问worse case 或者现场的程式码不一样 08/17 22:49
43F:推 jolyoy: 已经在讨论时间复杂度了,应该都是用最基本的资料结构, 08/18 01:04
44F:→ jolyoy: 先入为主用unordered map来算,其实也有问题,一定是双方 08/18 01:04
45F:→ jolyoy: 没沟通清楚 08/18 01:04
46F:→ wulouise: 我觉得说人错,到最後都没给提示算是面试官问题 08/18 07:20
47F:推 Parazicecum: 我看过几本中国的面试刷题书 分析hash table的time 08/18 09:30
48F:→ Parazicecum: complexity都会要求面试者要特别提一下运气极差所有 08/18 09:30
49F:→ Parazicecum: key都collision的情况跟一般情况 我猜那个主管大概也 08/18 09:31
50F:→ Parazicecum: 是看过类似的书 所以预设你应该要回答.. 08/18 09:32
51F:推 s0914714: 沟通不良吧 如果如原PO所言 面试官责任较大 08/19 13:41
53F:推 jlhc: 你的实作就是线性... 08/19 22:03
54F:→ jlhc: 面试官也是人 面试官搞错的可能性也是有的 08/19 22:04
55F:→ rems: 其实讨论Big O我觉得就是在讲worst case了 08/20 23:30
56F:→ rems: 我倒觉得科班出身念过演算法的会答linear time很奇怪... 08/20 23:32
57F:推 BBSealion: c++ 的 unordered_set 预设的 hash function 很容易造 08/21 19:33
58F:→ BBSealion: 出让他全部 collision 的状况,所以要更乾净还得自制 08/21 19:33
59F:→ BBSealion: 乱数更均匀的 hash function,但感觉上不是在考这个... 08/21 19:33
60F:→ BBSealion: 不过真遇到这种面试官自己搞不清楚状况的时候,就是把 08/21 19:34
61F:→ BBSealion: 你所有知道的底层知识都搬出来跟他讨论一遍就对了,看 08/21 19:35
62F:→ BBSealion: 是他会突然发现自己搞错,或是你突然打中他某个神秘的 08/21 19:35
63F:→ BBSealion: 想听得关键点,你就会过了 08/21 19:35
64F:推 imjeffreylee: M+n哪里不对 又不是nested loop 面试官不要不懂装懂 08/23 10:21
65F:→ imjeffreylee: 欸 08/23 10:21
66F:→ rems: 我只能说algorithm课本是好东西,可以多念一下 08/23 22:59
67F:→ rems: 要讨论实作这样写没什麽问题 08/23 22:59
68F:→ rems: 但是如果是要讨论time complexity回linear真的比较外行 08/23 23:00
69F:→ rems: 去查一下大O小o还有omega 08/23 23:01
70F:→ rems: big O就是在讨论worst case 08/23 23:02
71F:→ rems: 建立一组O(1)? 查询O(1)? 不懂不要装懂 08/23 23:03
72F:推 s0914714: 照楼上的说法 一堆排序例如quicksort应该是O(n^2) 08/24 07:52
73F:→ peter98: 回头看到这篇 rems是真的很外行 worst case跟big-O没什 12/03 04:48
74F:→ peter98: 关系 big-O也可以用在best case和avg case 12/03 04:49