[請益] (ByteDance 面試) 兩種不同寫法的複雜度分析
看板Soft_Job (軟體人)作者NTUmaki (西木野真姬)時間2年前 (2022/11/30 17:23)推噓106(108推 2噓 149→)留言259則, 96人參與討論串1/3 (看更多)
事情是這樣的,今天下午面了 ByteDance 2023 的缺 (Algorithm Engineer)
考了 leetcode 3. Longest Substring Without Repeating Characters
(https://reurl.cc/WqNV8k)
我的解法:
https://i.imgur.com/o5wrRMo.png
我原本寫上面那個解法,兩個差異就是 for 裡面放一個 while 跟只用一個 while
面試官說我的解法不是 O(N),是 O(N^2),跟他吵了半小時之後就把解改成下面的。
想問我是不是真的哪裡陷入誤區?
我原本以為他是想看我反應 & 如何解釋,吵到一半發現他是真的不認為我的解法正確
面試官的說法 & 我的回答:
Q1: 你這個 while 應該改成 if 才對,不然會是 O(N^2)
A1: 改成 if 的話會錯,因為我必須"一直"縮左界直到目前的 window 內沒有重複的字符
Q2: 但你這個 for 是 O(N),while 也是 O(N),乘起來是 O(N^2),我要 O(N) 的解
A2: 我的 l 不會超過 r,兩者都是最多從 0 跑到 N (l+=1 總共最多跑 N 次),是分開的不能用乘法
而且複雜度分析的本來就是 upper bound,你要說 O(N^2) 也對,但我的分析方法可以壓到 O(N)
Q3: 我知道你的意思,但是我們只看 while,是不是最糟跑到 O(N)? 然後 for 也是 O(N),這樣分析是不是 O(N^2)
A3: 不是,你分析不能只看某一段 code,我是整個考慮進去所以壓的複雜度還是 O(N)
Q4: 這不是我要的最優解 (然後跳針回 Q2)
A4: 不然這樣講好了,你舉一個 worst case 例子給我我 dry run 給你看他不會是 O(N^2)
然後大概就是說類似這種 case s='qwertaa',遇到第二個 a 的時候他說我的 while 會是 O(N)
A5: 但是遇到的時候 l 也不會超過 r,不會存在一個情況使得 while 會需要每次都跑 O(N),他"總共"需要執行的次數最多就是 N
Q6: 我要的最優解是 O(N),不是 O(2N) (然後繼續跳針回 Q2),我覺得我們對算法複雜度的理解不一樣
A6: O(2N) 跟 O(N) 是一樣的 (然後他說他知道,但這不是他要的最優解)
接著大概就是一直重複跳針回 Q2 然後我一直用不同的方法去解釋跟他說這個是 O(N)
我直接請他舉一個 worst case 會是 O(N^2) 的例子我 dry run,他還是說我是 O(N^2), O(Nk), O(Nn) 之類的,就不是 O(N)
最後我就說總之你不想要 for 裡面有 while 的解對吧?然後就寫了下面那段 code 給他就下一題了..
如果他一開始就說不要用兩個迴圈寫應該就沒什麼問題,但他一直強調那個不是最優,而且是 O(N^2)
就跟他吵了半個小時...
我實際去 leetcode 跑了兩種算法,時間都差不多,到底哪裡有問題QQ
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.204.135.123 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1669800213.A.900.html
推
11/30 17:35,
2年前
, 1F
11/30 17:35, 1F
→
11/30 17:35,
2年前
, 2F
11/30 17:35, 2F
→
11/30 17:36,
2年前
, 3F
11/30 17:36, 3F
我自己是認為兩種解法差別只是在 r 在什麼時候做 +=1,但拆解開來是一樣的
我能理解他可能不想看到 for 裡面有 while,但是他給的理由是這樣寫是 O(N^2) 我就不能理解了
→
11/30 17:41,
2年前
, 4F
11/30 17:41, 4F
推
11/30 17:50,
2年前
, 5F
11/30 17:50, 5F
→
11/30 17:50,
2年前
, 6F
11/30 17:50, 6F
→
11/30 17:52,
2年前
, 7F
11/30 17:52, 7F
我改成下面那個他就給過= =
→
11/30 18:00,
2年前
, 8F
11/30 18:00, 8F
→
11/30 18:01,
2年前
, 9F
11/30 18:01, 9F
permutation 跟nms(object detection那個) 還有 kalman filter,後兩者我說我只知道概念不知道詳細演算法他就跳過不考了
推
11/30 18:08,
2年前
, 10F
11/30 18:08, 10F
→
11/30 18:08,
2年前
, 11F
11/30 18:08, 11F
→
11/30 18:08,
2年前
, 12F
11/30 18:08, 12F
推
11/30 18:22,
2年前
, 13F
11/30 18:22, 13F
用邏輯直接算出他的最多可能執行次數也是一種分析方法,跟是不是成長速度沒有關係
→
11/30 18:23,
2年前
, 14F
11/30 18:23, 14F
→
11/30 18:23,
2年前
, 15F
11/30 18:23, 15F
→
11/30 18:23,
2年前
, 16F
11/30 18:23, 16F
→
11/30 18:23,
2年前
, 17F
11/30 18:23, 17F
推
11/30 18:24,
2年前
, 18F
11/30 18:24, 18F
推
11/30 18:25,
2年前
, 19F
11/30 18:25, 19F
能解釋一下為什麼是 n^2 嗎?我是真不懂,實際測試也是時間差不多,leetcode 的測資應該還沒有那麼弱吧
→
11/30 18:25,
2年前
, 20F
11/30 18:25, 20F
→
11/30 18:25,
2年前
, 21F
11/30 18:25, 21F
推
11/30 18:26,
2年前
, 22F
11/30 18:26, 22F
→
11/30 18:27,
2年前
, 23F
11/30 18:27, 23F
但我的左界跟右界的更新次數都是O(N),為什麼會是 O(N^2)?
你不能用乘法啊,你用 n/10 * n/10 代表左界超過右界繼續算下去,但這不會成立,set 是空的他就會跳出去了
推
11/30 18:30,
2年前
, 24F
11/30 18:30, 24F
→
11/30 18:30,
2年前
, 25F
11/30 18:30, 25F
→
11/30 18:34,
2年前
, 26F
11/30 18:34, 26F
推
11/30 18:36,
2年前
, 27F
11/30 18:36, 27F
推
11/30 18:37,
2年前
, 28F
11/30 18:37, 28F
→
11/30 18:38,
2年前
, 29F
11/30 18:38, 29F
而且這兩個解根本一樣... 我只能猜說他覺得 for 裡面有 while 可能在實際寫 code 不是一個好習慣?
→
11/30 18:38,
2年前
, 30F
11/30 18:38, 30F
推
11/30 18:41,
2年前
, 31F
11/30 18:41, 31F
→
11/30 18:43,
2年前
, 32F
11/30 18:43, 32F
還有 187 則推文
還有 11 段內文
→
12/02 11:04,
2年前
, 220F
12/02 11:04, 220F
→
12/02 11:04,
2年前
, 221F
12/02 11:04, 221F
→
12/02 11:04,
2年前
, 222F
12/02 11:04, 222F
→
12/02 11:04,
2年前
, 223F
12/02 11:04, 223F
→
12/02 11:44,
2年前
, 224F
12/02 11:44, 224F
→
12/02 11:44,
2年前
, 225F
12/02 11:44, 225F
→
12/02 11:44,
2年前
, 226F
12/02 11:44, 226F
→
12/02 11:44,
2年前
, 227F
12/02 11:44, 227F
→
12/02 13:02,
2年前
, 228F
12/02 13:02, 228F
→
12/02 13:03,
2年前
, 229F
12/02 13:03, 229F
→
12/02 13:20,
2年前
, 230F
12/02 13:20, 230F
→
12/02 13:20,
2年前
, 231F
12/02 13:20, 231F
→
12/02 13:22,
2年前
, 232F
12/02 13:22, 232F
→
12/02 13:22,
2年前
, 233F
12/02 13:22, 233F
→
12/02 14:15,
2年前
, 234F
12/02 14:15, 234F
→
12/02 14:17,
2年前
, 235F
12/02 14:17, 235F
→
12/02 14:17,
2年前
, 236F
12/02 14:17, 236F
→
12/02 14:18,
2年前
, 237F
12/02 14:18, 237F
→
12/02 14:28,
2年前
, 238F
12/02 14:28, 238F
推
12/02 15:07,
2年前
, 239F
12/02 15:07, 239F
→
12/02 15:50,
2年前
, 240F
12/02 15:50, 240F
→
12/02 15:53,
2年前
, 241F
12/02 15:53, 241F
推
12/02 19:46,
2年前
, 242F
12/02 19:46, 242F
推
12/02 19:53,
2年前
, 243F
12/02 19:53, 243F
推
12/03 03:15,
2年前
, 244F
12/03 03:15, 244F
→
12/03 03:15,
2年前
, 245F
12/03 03:15, 245F
→
12/03 03:15,
2年前
, 246F
12/03 03:15, 246F
推
12/03 12:33,
2年前
, 247F
12/03 12:33, 247F
→
12/03 19:49,
2年前
, 248F
12/03 19:49, 248F
推
12/03 20:02,
2年前
, 249F
12/03 20:02, 249F
→
12/03 20:02,
2年前
, 250F
12/03 20:02, 250F
推
12/03 21:28,
2年前
, 251F
12/03 21:28, 251F
推
12/03 22:03,
2年前
, 252F
12/03 22:03, 252F
→
12/03 22:03,
2年前
, 253F
12/03 22:03, 253F
推
12/04 15:57,
2年前
, 254F
12/04 15:57, 254F
推
12/04 21:27,
2年前
, 255F
12/04 21:27, 255F
噓
12/05 13:29,
2年前
, 256F
12/05 13:29, 256F
→
12/05 13:36,
2年前
, 257F
12/05 13:36, 257F
推
12/05 20:20,
2年前
, 258F
12/05 20:20, 258F
推
12/05 21:26,
2年前
, 259F
12/05 21:26, 259F
討論串 (同標題文章)
Soft_Job 近期熱門文章
47
185
15
92
PTT職涯區 即時熱門文章
824
1489