thảo luận [Học Tập] Topic thuật toán

  • Người tạo chủ đề Người tạo chủ đề unknowpc90
  • Ngày bắt đầu Ngày bắt đầu
Em ưng ý kiến của bác này, tiếc là không thể thả tim, em chuẩn bị sang năm 3 rồi, mà thuật toán còn yếu quá, mấy bài từ mức dễ còn giải được lên mức trung bình là phân tích không nổi nữa :beat_shot::beat_shot: không biết cải thiện được trình độ giải thuật không nữa chứ cứ mấy bài ngang mức trung bình nhiều lúc loay hoay gần 1 tiếng mà chưa giải được
đời còn dài. Hồi xưa mình cũng ngu thuật toán lắm, giờ phải lọ mọ đi học lại. Trên reddit nó liệt kê ra 14 pattern của thuật toán, bạn ôn theo pattern, mỗi pattern luyện đến khi nào chạy ra accepted mà k cần xem đáp án là ok. Khi đi PV đôi khi về ngôn ngữ có thể k quá thành thạo, nhưng nếu thuật toán tốt vẫn có thể pass. Nhất là mấy ông mới ra trường, ngoài thuật toán thì biết hỏi gì.Đồ án các bố trên trời dưới biển chán bỏ mẹ :D
Có thể nói giỏi thuật toán con đường sự nghiệp sẽ mở rộng hơn rất nhiều, k chỉ ở trong nước mà còn có cơ hội làm việc ở nước ngoài. Tây nó toàn hỏi thuật toán thôi, còn lại là SOLID, rồi domain liên quan :D
 
đời còn dài. Hồi xưa mình cũng ngu thuật toán lắm, giờ phải lọ mọ đi học lại. Trên reddit nó liệt kê ra 14 pattern của thuật toán, bạn ôn theo pattern, mỗi pattern luyện đến khi nào chạy ra accepted mà k cần xem đáp án là ok. Khi đi PV đôi khi về ngôn ngữ có thể k quá thành thạo, nhưng nếu thuật toán tốt vẫn có thể pass. Nhất là mấy ông mới ra trường, ngoài thuật toán thì biết hỏi gì.Đồ án các bố trên trời dưới biển chán bỏ mẹ :D
Có thể nói giỏi thuật toán con đường sự nghiệp sẽ mở rộng hơn rất nhiều, k chỉ ở trong nước mà còn có cơ hội làm việc ở nước ngoài. Tây nó toàn hỏi thuật toán thôi, còn lại là SOLID, rồi domain liên quan :D
Em cám ơn bác :sweet_kiss:
 
k pv cái này thì biết pv cái gì bác, nó phản ánh tư duy của ng lập trình. Còn ngôn ngữ nó bao la lắm. 1 cty có tỷ cái project, mỗi project 1 loại ngôn ngữ nền tảng. Tuyển thằng thuật toán tốt tức là tư duy nó tốt, dễ thích ứng với cty
Uhm, mình hiểu cái này bà con cũng bàn nhiều rồi, và có vẻ kết luận algo là cách tốt nhất để tuyển large scale. Nhưng mình k đồng tình lắm. Về cơ bản:
  • Cái công việc của 1 dev hằng ngày có liên quan rất ít đến những thuật toán khó vkl trong lúc phỏng vấn.
  • Đồng ý là 1 ng giỏi algo thường sẽ có tiềm năng trở thành 1 dev tốt. Nhưng điều ngc lại k đúng, 1 ng k giải được các bài hard trên leetcode k có nghĩa họ là developer kém.
  • Cái này tạo ra một khoảng gap giữa việc phỏng vấn và công việc thực tế. Dẫn đến rất nhiều người có thể làm được việc nhưng bị loại => Làm tăng chi phí tuyển dụng và lãng phí tgian, công sức. Nếu bạn nào từng phải dính vào tuyển dụng rồi thì sẽ hiểu chi phí cho recruiment bên mảng IT nó thốn cỡ nào.

Cuối cùng, để trả lời câu hỏi k phỏng ván algo thì phỏng vấn cái gì. Mình share một clip của 1 dev (từng làm tại FAANG) đồng quan điểm với mình, trong đó nói chi tiết hơn những gì mình viết ở đây.
 
Uhm, mình hiểu cái này bà con cũng bàn nhiều rồi, và có vẻ kết luận algo là cách tốt nhất để tuyển large scale. Nhưng mình k đồng tình lắm. Về cơ bản:
  • Cái công việc của 1 dev hằng ngày có liên quan rất ít đến những thuật toán khó vkl trong lúc phỏng vấn.
  • Đồng ý là 1 ng giỏi algo thường sẽ có tiềm năng trở thành 1 dev tốt. Nhưng điều ngc lại k đúng, 1 ng k giải được các bài hard trên leetcode k có nghĩa họ là developer kém.
  • Cái này tạo ra một khoảng gap giữa việc phỏng vấn và công việc thực tế. Dẫn đến rất nhiều người có thể làm được việc nhưng bị loại => Làm tăng chi phí tuyển dụng và lãng phí tgian, công sức. Nếu bạn nào từng phải dính vào tuyển dụng rồi thì sẽ hiểu chi phí cho recruiment bên mảng IT nó thốn cỡ nào.

Cuối cùng, để trả lời câu hỏi k phỏng ván algo thì phỏng vấn cái gì. Mình share một clip của 1 dev (từng làm tại FAANG) đồng quan điểm với mình, trong đó nói chi tiết hơn những gì mình viết ở đây.
như mình có nói, khi phỏng vấn trong phạm vi domain mà bạn k xuất sắc hoặc đuối thì thuật toán là cái cứu cánh. Ở VN mình thấy k đặt nặng cái phần thuật toán nên cũng ok. Còn phận làm thuê nghe ngóng ng ta tuyển sao thì ôn vậy thôi chớ hơi đâu phản biện :cry:
 
Uhm, mình hiểu cái này bà con cũng bàn nhiều rồi, và có vẻ kết luận algo là cách tốt nhất để tuyển large scale. Nhưng mình k đồng tình lắm. Về cơ bản:
  • Cái công việc của 1 dev hằng ngày có liên quan rất ít đến những thuật toán khó vkl trong lúc phỏng vấn.
  • Đồng ý là 1 ng giỏi algo thường sẽ có tiềm năng trở thành 1 dev tốt. Nhưng điều ngc lại k đúng, 1 ng k giải được các bài hard trên leetcode k có nghĩa họ là developer kém.
  • Cái này tạo ra một khoảng gap giữa việc phỏng vấn và công việc thực tế. Dẫn đến rất nhiều người có thể làm được việc nhưng bị loại => Làm tăng chi phí tuyển dụng và lãng phí tgian, công sức. Nếu bạn nào từng phải dính vào tuyển dụng rồi thì sẽ hiểu chi phí cho recruiment bên mảng IT nó thốn cỡ nào.

Cuối cùng, để trả lời câu hỏi k phỏng ván algo thì phỏng vấn cái gì. Mình share một clip của 1 dev (từng làm tại FAANG) đồng quan điểm với mình, trong đó nói chi tiết hơn những gì mình viết ở đây.
Ông này faang nào thế bác :confuse:
 
như mình có nói, khi phỏng vấn trong phạm vi domain mà bạn k xuất sắc hoặc đuối thì thuật toán là cái cứu cánh. Ở VN mình thấy k đặt nặng cái phần thuật toán nên cũng ok. Còn phận làm thuê nghe ngóng ng ta tuyển sao thì ôn vậy thôi chớ hơi đâu phản biện :cry:
Hợp lý mai fen. Như mình có nói thuật toán tuy nó k thực tế nhưng là dấu hiệu của 1 ứng viên tiềm năng. Cái quy trình phỏng vấn phải làm sao k bỏ sót cả 2 nhóm.
Anw, mình cũng phận làm thuê và chỉ biết lên voz gáy thế thôi chứ vẫn cày leetcode để phỏng vấn , k khác gì. :cry:
 
Sửa lần cuối:
k pv cái này thì biết pv cái gì bác, nó phản ánh tư duy của ng lập trình. Còn ngôn ngữ nó bao la lắm. 1 cty có tỷ cái project, mỗi project 1 loại ngôn ngữ nền tảng. Tuyển thằng thuật toán tốt tức là tư duy nó tốt, dễ thích ứng với cty
vậy sao k tuyển mấy cha nội iq cao, loại đó dễ train thành master thuật toán lắm mà?
Nói vậy để thấy cái tư duy tuyển chỉ qua thuật toán nó phiến diện ấy.
 
vậy sao k tuyển mấy cha nội iq cao, loại đó dễ train thành master thuật toán lắm mà?
Nói vậy để thấy cái tư duy tuyển chỉ qua thuật toán nó phiến diện ấy.
sao thi Đh lại thi toán lý hóa sinh văn sử địa, vào đại học có học mấy môn đó nữa đâu :D:D
với iq is a fake measure scale :whistle::whistle:
 
sao thi Đh lại thi toán lý hóa sinh văn sử địa, vào đại học có học mấy môn đó nữa đâu :D:D
với iq is a fake measure scale :whistle::whistle:
vì đh bây giờ (và chắc là có cả lí do xã hội nữa t không đủ trình ptich) chưa chơi được kiểu phỏng vấn đánh giá toàn diện thí sinh. Một phần lí do hiển nhiên là đông quá + thiếu tiền.
 
GGWP à :p chưa thấy anh nào xuất thân từ faang mà chửi pv algo cả :ROFLMAO: :ROFLMAO:
Tôi làm quản lý ở big tech chửi pv algo đây. Mấy lần nói chuyện này ở cty với đồng nghiệp rồi nhưng nghĩ đi nghĩ lại thì pv algo nó vẫn dễ scale nhất và phù hợp với việc đánh giá tư duy các bạn ra trường chưa có kinh nghiệm làm việc với code lớn

Tuyển dụng chính xác nhân lực nhất theo tôi là đến từ thực tập: 3 tháng làm việc production đấy thể hiện bản chất con người nhiều hơn vài tiếng pv, nhưng rất tiếc là ko thể scale mô hình này ra cả triệu người nộp đơn xin việc vào big tech mỗi năm được
 
Thanh niên nào éo biết bất cứ tí gì về algo thì đúng nghĩa code monkey. Than vãn gì :angry:
Cho vào làm 3 tháng production để biết thực lực thì ai trả lương 3 tháng này cho, các ông chủ tư nhân bao giờ chả tiếc tiền
 
GGWP à :p chưa thấy anh nào xuất thân từ faang mà chửi pv algo cả :ROFLMAO: :ROFLMAO:
Uhm, tui cũng đọc đâu đó xong nhớ v thôi, k chắc lắm về thông tin này. Tuy nhiên pp this pp that, trong FAANG có ng chửi pv algo thì thấy cũng bth mà. Box CNTT của voz bé như cái lỗ mũi còn cãi nhau loạn, huống gì FAANG =)).

Tôi làm quản lý ở big tech chửi pv algo đây. Mấy lần nói chuyện này ở cty với đồng nghiệp rồi nhưng nghĩ đi nghĩ lại thì pv algo nó vẫn dễ scale nhất và phù hợp với việc đánh giá tư duy các bạn ra trường chưa có kinh nghiệm làm việc với code lớn

Tuyển dụng chính xác nhân lực nhất theo tôi là đến từ thực tập: 3 tháng làm việc production đấy thể hiện bản chất con người nhiều hơn vài tiếng pv, nhưng rất tiếc là ko thể scale mô hình này ra cả triệu người nộp đơn xin việc vào big tech mỗi năm được

Chính xác pv algo dễ scale nhất, nhưng đó là nhìn vào bề nổi chỉ tính chi phí / case phỏng vấn. Còn cái risk khi loại ứng viên tốt vì họ k pass algo thì mình nhận thấy đang bị bỏ qua. Anw, cái mình chỉ trích đây là văn hóa rập khuôn của cả market EU + US khi ở đâu cũng pv algo bất kể nhu cầu hay môi trường thực tế. Chứ k chỉ trích việc phỏng vấn bằng algo.

Thanh niên nào éo biết bất cứ tí gì về algo thì đúng nghĩa code monkey. Than vãn gì :angry:
Cho vào làm 3 tháng production để biết thực lực thì ai trả lương 3 tháng này cho, các ông chủ tư nhân bao giờ chả tiếc tiền

K biết tí gì về algo thì đúng là code monkey thật. Nhưng k biết tí gì nó khác với không làm đc bài medium / hard trên leetcode trong vòng 45p. Mình thấy vấn đề ở đây là các cty đang đánh đồng 2 khái niệm này.
 
Uhm, mình hiểu cái này bà con cũng bàn nhiều rồi, và có vẻ kết luận algo là cách tốt nhất để tuyển large scale. Nhưng mình k đồng tình lắm. Về cơ bản:
  • Cái công việc của 1 dev hằng ngày có liên quan rất ít đến những thuật toán khó vkl trong lúc phỏng vấn.
  • Đồng ý là 1 ng giỏi algo thường sẽ có tiềm năng trở thành 1 dev tốt. Nhưng điều ngc lại k đúng, 1 ng k giải được các bài hard trên leetcode k có nghĩa họ là developer kém.
  • Cái này tạo ra một khoảng gap giữa việc phỏng vấn và công việc thực tế. Dẫn đến rất nhiều người có thể làm được việc nhưng bị loại => Làm tăng chi phí tuyển dụng và lãng phí tgian, công sức. Nếu bạn nào từng phải dính vào tuyển dụng rồi thì sẽ hiểu chi phí cho recruiment bên mảng IT nó thốn cỡ nào.

Cuối cùng, để trả lời câu hỏi k phỏng ván algo thì phỏng vấn cái gì. Mình share một clip của 1 dev (từng làm tại FAANG) đồng quan điểm với mình, trong đó nói chi tiết hơn những gì mình viết ở đây.
Halo effect à? Cha này làm Faang bao h? https://www.linkedin.com/in/benawad/

Tôi Google engineer đây, làm tech ở FAANG thì tech stack hầu như khác hẳn vs bên ngoài, chỉ có programming language là chung, nên việc tập trung vào algo vs problem solving skill cũng dễ hiểu thôi.

SWE là công việc đòi hỏi phải có tư duy + sáng tạo, ko phải công nhân nhà máy, khi mà công việc chỉ mang tính rập khuôn, lặp lại; nên nếu nói chỉ phỏng vấn những gì sẽ làm thì tôi thấy khá khó. Đương nhiên tuỳ bản chất công ty nữa, ví dụ như FAANG, việc cho nhân viên 1 năm để làm quen với tech stack là điều chấp nhận đc, thì việc tuyển dụng chỉ cần vững lập trình + problem solving skill là hợp lý. Ở chiều ngược lại, start up thì ko có thời gian như vậy, nên tập trung tuyển những người có background để giảm thời gian training lại là điều nên làm.

There is no silver bullet.
 
Hơn cả tháng này ngồi luyện tập trên leetcode thì với ý kiến cá nhân của em là dù là bài easy hay medium hay là hard thì nó đều khó hơn trên thực tế 1 bậc.
Đối chiếu với những bài em đã giải trên leetcode với cái dự án mình đang làm cho công ty thì em thấy có nhưng mà là rất rất ít. Với cá nhân em hiện tại thì là vậy.
Mong là cứ tiếp tục giải leetcode thì biết đâu gặp các bài toán hay có thể áp dụng đc.
 
Halo effect à? Cha này làm Faang bao h? https://www.linkedin.com/in/benawad/

Tôi Google engineer đây, làm tech ở FAANG thì tech stack hầu như khác hẳn vs bên ngoài, chỉ có programming language là chung, nên việc tập trung vào algo vs problem solving skill cũng dễ hiểu thôi.

SWE là công việc đòi hỏi phải có tư duy + sáng tạo, ko phải công nhân nhà máy, khi mà công việc chỉ mang tính rập khuôn, lặp lại; nên nếu nói chỉ phỏng vấn những gì sẽ làm thì tôi thấy khá khó. Đương nhiên tuỳ bản chất công ty nữa, ví dụ như FAANG, thì việc cho nhân viên 1 năm để làm quen với tech stack là điều chấp nhận đc, thì việc tuyển dụng chỉ cần vững lập trình + problem solving skill là hợp lý. Ở chiều ngược lại, start up thì ko có thời gian như vậy, nên tập trung tuyển những người có background để giảm thời gian training lại là điều nên làm.

There is no silver bullet.
Halo effect thật =)). Chắc đọc đâu đó r nhớ nhầm.
Tui chưa làm ở FAANG nên chắc góc nhìn phiến diện. Chỉ đánh giá bên ngoài thì thấy nó k cần thiết lắm.
 
Halo effect thật :LOL:. Chắc đọc đâu đó r nhớ nhầm.
Tui chưa làm ở FAANG nên chắc góc nhìn phiến diện. Chỉ đánh giá bên ngoài thì thấy nó k cần thiết lắm.
Thực ra point của ông cũng hạp lý mà, cty không nên rập khuôn FAANG quá khi phỏng vấn; họ nên học hỏi và điều chỉnh để phù hợp vs tình hình và điều kiện của công ty.
 
Tiếp tục chuyên mục mỗi ngày một leetcode. Ba bài mình làm ngày hôm nay:

#354. (Hard) https://leetcode.com/problems/russian-doll-envelopes/
#355. (Medium) https://leetcode.com/problems/design-twitter/
#357. (Medium) https://leetcode.com/problems/count-numbers-with-unique-digits/

Mình sẽ share về bài Russian Doll Envelopes:
#354. (Hard) https://leetcode.com/problems/russian-doll-envelopes/

Bài này Hard và mình thấy khá chua, mất khoảng 2h để giải. Mình chọn share bài này vì 2 bài kia 1 cái quá phức tạp, 1 cái quá simple.

Phân tích bài toán:
- 1 <= envelopes.length <= 5000: Độ phức tạp tối ưu có vẻ là O(nlogn). Cái này làm nhiều sẽ có kinh nghiệm, đề thường cho khoảng dữ liệu đủ lớn để timedout các solution không tối ưu:
. 2^31 => Tối ưu là O(1) hoặc O(logn)
. 10^6 => 10^8 => O(n)
. 10^4 => 10^5 => O(nlogn)
. 2000 => 10^4 => O(nlogn) hoặc O(n^2)
. 300 - 5000 => O(n^2)
. Nhỏ hơn nữa thì thường là O(2^n) hoặc O(n!)

- Thấy O(nlogn) thì thường sẽ dính đến việc sắp xếp hoặc tổ chức dữ liệu trước khi xử lý. Thường sẽ là:
. (1) Sort lại: O(nlogn)
. (2) For với mỗi element: O(n)
. (3) Giải bài toán nhỏ cho element đó: O(logn) vì dữ liệu đã sắp xếp

- Điểm khó của bài này chính là dữ liệu 2 chiều nên khó sắp xếp hợp lý, nếu chỉ sắp xếp theo 1 chiều thì bước 3 sẽ fallback về O(n) và bị timed-out.

Solution:
  • Nhận thấy nếu sort dữ liệu theo diện tích của bao thư thì sẽ đảm bảo được nếu bao thư a bọc được bao thư b, thì diện tích của a chắc chắn lớn hơn b.
  • Sau khi sort xong thì bài toán trở thành tìm mảng con các bao thư bọc nhau, sao cho mảng con này có chiều dài lớn nhất.
  • Đây là biến thể của bài toán kinh điển của QHĐ: Tìm mảng con tăng dài nhất (https://leetcode.com/problems/longest-increasing-subsequence/). Mà bài này có thể được giải đơn giản với đpt O(nlogn).

Python:
class Solution:
    def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
        if not envelopes:
            return 0
     

        envelopes.sort(key=lambda envl: envl[0] * envl[1]) # Sắp xếp theo diện tích tăng dần
     
        # Ý tưởng tương tự như bài mảng con tăng dài nhất
        # Mảng layers là số lượng lớp bao thư lớn nhất, đến hiện tại
        # Mỗi phần tử thứ i trong mảng layer lại là một list chứa các bao thư nằm ở lớp thứ i
        # Bao thư nằm ở lớp 0 nghĩa là bên trong nó không chứa được thêm bao thư nào
        # Bao thư nằm ở lớp i nghĩa là bên trong nó có thể chứa được i - 1 bao thư nằm ở các lớp trước đó
        layers = []
        for envl in envelopes:
            # với mỗi bao thư, tìm layer thứ i sao cho ở layer này có ít nhất 1 bao thư mà có thể chứa trong bao thư này
            # => bao thư hiện tại sẽ nằm ở thứ i + 1
            i = len(layers) - 1
            while i >= 0:
                if any(envl2 for envl2 in layers[i] if envl[0] > envl2[0] and envl[1] > envl2[1]):
                    break
                i -= 1
             
            # Nếu i == -1 => bao thư không chứa được ai cả, cho vào layer 0
            # i == len(layers) - 1: Bao thư này chứa được bao thư lớn nhất => Tạo thêm 1 layer mới
            if i == len(layers) - 1:
                layers.append([])
             
            # set bao thư vào layer thứ i + 1
            layers[i + 1].append(envl)
         
        # Số lượng layer chính là kết quả cần tìm
        return len(layers)

Note:
  • Solution ở trên thật ra có độ phức tạp trong trường hợp xấu nhất là O(n^2). Khi tất cả các bao thư không cái nào chứa được trong cái nào (Tất cả bằng nhau chẳng hạn).
  • Về trung bình thì số layer sẽ bằng log(n) so với số bao thư. Nên độ phức tạp trong trường hợp trung bình là O(nlogn)
  • Mình chỉ faster than 22% thôi. Còn có nhiều điểm có thể tối ưu, nhưng pass là vui rồi, bạn nào hứng thú có thể improve thêm:
. Mỗi layer có thể lưu minWidth và minHeight để hạn chế loop vào trong từng layer để kiểm tra
. Dữ liệu trong từng layer cũng có thể có thứ tự và dùng binary search để improve
  • Giải pháp ban đầu của mình là tổ chức dạng graph và quy về bài toán tìm đường đi dài nhất trong đồ thị => mất hơn 1 tiếng trước khi đập hết và nghĩ ra giải pháp trên.
  • Việc có một hướng tiếp cận đúng đắn sẽ giúp tiết kiệm rất rất nhiều thời gian. Trong pv thực tế các bạn nên communicate liên tục với interviewer để họ sửa ngay khi mình đi sai đường.

Welcome mọi người thảo luận và đưa ra solution tốt hơn nữa.
 
Sửa lần cuối:
Phân tích bài toán:
- 1 <= envelopes.length <= 5000: Độ phức tạp tối ưu có vẻ là O(nlogn). Cái này làm nhiều sẽ có kinh nghiệm, đề thường cho khoảng dữ liệu đủ lớn để timedout các solution không tối ưu:


- Thấy O(nlogn) thì thường sẽ dính đến việc sắp xếp hoặc tổ chức dữ liệu trước khi xử lý. Thường sẽ là:


- Điểm khó của bài này chính là dữ liệu 2 chiều nên khó sắp xếp hợp lý, nếu chỉ sắp xếp theo 1 chiều thì bước 3 sẽ fallback về O(n) và bị timed-out.

Solution:
  • Nhận thấy nếu sort dữ liệu theo diện tích của bao thư thì sẽ đảm bảo được nếu bao thư a bọc được bao thư b, thì diện tích của a chắc chắn lớn hơn b.
  • Sau khi sort xong thì bài toán trở thành tìm mảng con các bao thư bọc nhau, sao cho mảng con này có chiều dài lớn nhất.
  • Đây là biến thể của bài toán kinh điển của QHĐ: Tìm mảng con tăng dài nhất (https://leetcode.com/problems/longest-increasing-subsequence/). Mà bài này có thể được giải đơn giản với đpt O(nlogn).
Đoạn này của bác là nhìn vào độ phức tạp để suy nghĩ ra hướng giải quyết à.
 

Thống kê chủ đề

Ngày tạo
unknowpc90,
Người trả lời cuối
Spaghetti Code,
Trả lời
1.460
Lượt xem
154.075
Quay lại
Lên đầu trang