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

Đ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 à.
Cũng k hẳn là nghĩ được ra hướng giải quyết. Như trên, mình có note là ban đầu mình có hướng giải quyết sai. Đoạn này chỉ là dựa vào scale dữ liệu input để estimate độ phức tạp cần thiết của thuật toán, từ đó:
  • Hướng nào có độ phức tạp cao hơn mức mình estimate thì loại bỏ
  • Hướng nào có độ phứ tạp thấp hơn thì cũng để thử sau, vì thường độ phức tạp đó là tối ưu rồi, không có giải pháp tốt hơn.

Cái này là kinh nghiệm để giải nhanh hơn thôi :D
 
LIS pair có thể làm nlogn được đấy.
sort theo phần tử đầu (nếu strictly LIS thì break tie bằng sort decresase thằng thứ 2, còn loosely LIS thì increase thằng thứ 2), sau đó làm LIS trên thằng thứ 2

C++:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        auto n = envelopes.size();
        vector<pair<int,int>> v;
        v.reserve(n);
        for(auto& env:envelopes){
            v.emplace_back(env[0],env[1]);
        }
        sort(v.begin(),v.end(),[](const pair<int,int>& a,const pair<int,int>& b){
            return a.first == b.first ? a.second > b.second : a.first < b.first;
        });
        vector<int> lis;
        for(auto p:v){
            auto insert_pos = lower_bound(lis.begin(),lis.end(),p.second);
            if(insert_pos == lis.end()) lis.push_back(p.second);
            else *insert_pos = p.second;
        }
        return (int)lis.size();
    }
 
LIS pair có thể làm nlogn được đấy.
sort theo phần tử đầu (nếu strictly LIS thì break tie bằng sort decresase thằng thứ 2, còn loosely LIS thì increase thằng thứ 2), sau đó làm LIS trên thằng thứ 2

C++:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        auto n = envelopes.size();
        vector<pair<int,int>> v;
        v.reserve(n);
        for(auto& env:envelopes){
            v.emplace_back(env[0],env[1]);
        }
        sort(v.begin(),v.end(),[](const pair<int,int>& a,const pair<int,int>& b){
            return a.first == b.first ? a.second > b.second : a.first < b.first;
        });
        vector<int> lis;
        for(auto p:v){
            auto insert_pos = lower_bound(lis.begin(),lis.end(),p.second);
            if(insert_pos == lis.end()) lis.push_back(p.second);
            else *insert_pos = p.second;
        }
        return (int)lis.size();
    }
Quá chuẩn luôn bác, h mới nhận ra là có thể sort theo cách này :p:p.
 
Em hỏi về bài toán "Verify a prime number"
Trên kênh youtube nó ghi công thức đại khái

for i <- 2 to N-1
if i divides N => N is not prime number

Ví dụ mình nhập số 7
thì i chạy từ 2,3,4,5,6 thôi hả mấy thím?
hay là 2,3,4,5,6,7 rồi mới trừ 1
 
Em hỏi về bài toán "Verify a prime number"
Trên kênh youtube nó ghi công thức đại khái

for i <- 2 to N-1
if i divides N => N is not prime number

Ví dụ mình nhập số 7
thì i chạy từ 2,3,4,5,6 thôi hả mấy thím?
hay là 2,3,4,5,6,7 rồi mới trừ 1
Như nhau mà, sao cũng đc fen. Chạy đến 6 thì tiết kiệm hơn chạy đến 7 rồi trừ 1 tí xíu :d
 
Như nhau mà, sao cũng đc fen. Chạy đến 6 thì tiết kiệm hơn chạy đến 7 rồi trừ 1 tí xíu :d
Em hỏi ngu :sweat: Em vẫn chưa hiểu cái này lắm

ví dụ em nhập số 10
i nó chạy từ 2 tới 9
lấy từng cái i/10 đều không chia hết, trong khi 10 không phải là prime number
 
10/i chứ sao lại i/10 :oh:
Sao nó lại để i/10 nhỉ, hay em đang hiểu sai tiếng anh @@
Screenshot 2021-07-25 175932.jpg
 
Sao nó lại để i/10 nhỉ, hay em đang hiểu sai tiếng anh @@
View attachment 675155
divide sth by sth

to calculate the number of times that one number fits (exactly) into another:
10 divided by 5 is/equals 2.
divide (sth) into sth
If a number divides into another number, it fits (exactly) into it when multiplied a particular number of times:
What do you get if you divide 6 into 18?
2 divides into 10 five times.

Cái kiểu ghi kia lạ thế nhỉ, hay fen vào trang bọn Ấn :doubt:
 
Đúng rồi thím, kênh đó của Ấn :sweat:

Vậy chốt lại N/i hả thím, em cũng thấy cái đó hợp lý hơn.
Đúng rồi đấy, cái này là lý thuyết về số nguyên tố cơ bản mà :shame:
Bọn Ấn nhiều khi Tiếng Anh bọn nó dùng không chuẩn lắm đâu :shame:
Mấy bài đơn giản này sao không lên mấy trang Tiếng Việt đọc cho dễ hiểu, đâm đầu vào đống tutorial của bọn Ấn làm gì :burn_joss_stick:
 
Bọn Ấn nhiều khi Tiếng Anh bọn nó dùng không chuẩn lắm đâu :shame:
Mấy bài đơn giản này sao không lên mấy trang Tiếng Việt đọc cho dễ hiểu, đâm đầu vào đống tutorial của bọn Ấn làm gì :burn_joss_stick:
Vãi mấy anh Ấn, làm em loay hoay cả buổi chiều

Em search mấy trang lớn coi code C hay Python em hiểu. Mà cái công thức này em thấy kì kì mà không biết nguyên nhân.

Có trang nào ngon dạy Mathematics for programmer không thím. Em tay ngang qua nên muốn học khả năng tư duy trướ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, 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.
Thím cho hỏi, khi phỏng vấn google xong, pass rồi, thím đã biết vào mình làm gì, assign team nào chưa. Hay vào chính thức vào rồi mới biết.
 
Vãi mấy anh Ấn, làm em loay hoay cả buổi chiều

Em search mấy trang lớn coi code C hay Python em hiểu. Mà cái công thức này em thấy kì kì mà không biết nguyên nhân.

Có trang nào ngon dạy Mathematics for programmer không thím. Em tay ngang qua nên muốn học khả năng tư duy trước

Mấy cái này toán cơ bản cấp 1, cấp 2 thôi (cùng lắm chút ít cấp 3).
Toán trong lập trình đa số học hiểu bản chất công thức ấy, chứ k phải kiểu đi giải loằng ngoằng như hồi học phổ thông đâu, áp dụng đc là đc
 
Mấy cái này toán cơ bản cấp 1, cấp 2 thôi (cùng lắm chút ít cấp 3).
Toán trong lập trình đa số học hiểu bản chất công thức ấy, chứ k phải kiểu đi giải loằng ngoằng như hồi học phổ thông đâu, áp dụng đc là đc
Trừ khi học machine learning, phải dùng đại số tuyến tính toán cao cấp A2, hoặc lúc tính big-O của mấy giải thuật phải tính toán phức tạp xíu, chứ ngoài ra cộng trừ nhân chia cơ bản là được :D
 
Mấy cái này toán cơ bản cấp 1, cấp 2 thôi (cùng lắm chút ít cấp 3).
Toán trong lập trình đa số học hiểu bản chất công thức ấy, chứ k phải kiểu đi giải loằng ngoằng như hồi học phổ thông đâu, áp dụng đc là đc
Tư duy em nói ở đây là tư duy giải quyết bài toán đó thím, kiểu trong đầu mình phân tích làm các bước a -> b được kết quả c

Em thấy cái đó em hơi chậm
 
Back
Top