thắc mắc dạy algorithm chương trình ntn ổn k các bác

Chương trình ổn hay ko luôn phụ thuộc vào đối tượng người học là ai. Nó có thể có lý với người này nhưng lại ko có lý với người khác. Mà mấy thằng cu lên ĐH cũng có this có that. Cho nên bước đầu tiên là phải test trình độ của bọn nó, cái gì đã tốt và cái gì đang thiếu.

Cái đầu tiên nên dạy theo mình là tư duy mô hình hóa vấn đề và giải quyết ở high level, là thứ bọn Tây nó rất chú trọng nhưng ở VN thì gần như là ko dạy.

Ví dụ dạy học sinh cách suy ra kết quả của bài toán bằng cách tổng hợp kết quả của những bài toán tương tự nhỏ hơn. Có tư duy đấy rồi bọn nó tự suy ra quy hoạch động.

Hay như discrete structure mình được học ở Tây thì những thứ như graph, topology, circle v.v... bạn đề cập dù có trong nội dung môn học đấy nhưng lại ko phải mục tiêu chính của môn học này. Mục tiêu cơ bản của môn đấy là tại sao lại nghĩ tới việc lấy graph làm model cho problem để đưa ra solution, chẳng hạn thế.
Nhìn dưới góc độ đó thì Dijkstra có thể tự suy ra cách implement từ BFS. Hay bài toán xếp hậu chẳng hạn, nếu modeling problem bằng cách coi mỗi state của bàn cờ là 1 đỉnh, mỗi lần đặt thêm 1 quân hậu là 1 cạnh, thì problem này hoàn toàn có thể giải bằng BFS.

Chứ nếu như ko có tư duy ấy, thì Dijkstra là 1 bài, Dijkstra thay đổi 1 tí kiểu như tìm đường đi ngắn nhất nhưng phải qua ít nhất 4 đỉnh chẳng hạn có khi thành bài mới. Xếp hậu là 1 bài mà mã đi tuần là 1 bài khác, trong khi nếu đã có tư duy thì kể cả có là 1 quân quái thai nhảy zigzag thì vẫn là nó, vẫn implement bằng BFS thôi. Ngay như trong cái list bạn đưa mấy cái thuật toán sinh để mà chạy được thì cũng vẫn ... BFS. Mọi thứ vẫn chỉ là thằng A, chỉ đơn giản 1 cái là A quay phải, 1 cái là A quay trái hay A trồng cây chuối, ví dụ thế.

Mình nghĩ có tư duy ở high level rồi thì mới dạy đến kỹ thuật cụ thể vì như thế ko cần dạy nhiều mà sau đấy người học có thể tự học tự nâng cao trình độ. Cho nên, nếu dạy cho người mới mình sẽ dạy như sau.

1) Tư duy quy nạp
2) Lý thuyết đồ thị và cách mô hình hóa
3) Các thể loại mô hình hóa khác.

Bước tiếp theo là dạy đến các cách biểu diễn phổ biến của các thể loại trên trong tin học (có thể biểu diễn bằng Array, List v.v...) cũng như cách implement các thuật toán cơ bản.

Cuối cùng mới dạy kỹ thuật cụ thể, đầu tiên chắc là đệ quy.
Sau đó có thể là 2 con trỏ, tìm kiếm nhị phân v.v...
Cuối cùng mới tới đánh giá độ phức tạp. Bởi đơn giản nếu ko đưa được ra solution thì lấy gì mà đánh giá. Đánh giá và tối ưu theo cá nhân mình nên đứng cuối.

Tối ưu có thể dạy cuối
Nhưng đánh giá độ phức tạp nó là nằm trong phần đầu của DSA, chính trong chương trình của các trường (lớn) của nước ngoài.



Mà cái mô hình hoá vấn đề để giải 1 bài toán to là sau khi nắm vững hết lý thuyết DSA hết rồi mới cho giải quyết chứ không biết tí gì DSA thì phân tích bài toán kiểu gì
 
Last edited:
Tối ưu có thể dạy cuối
Nhưng đánh giá độ phức tạp nó là nằm trong phần đầu của DSA, chính trong chương trình của các trường (lớn) của nước ngoài.



Mà cái mô hình hoá vấn đề để giải 1 bài toán to là sau khi nắm vững hết lý thuyết DSA hết rồi mới cho giải quyết chứ không biết tí gì DSA thì phân tích bài toán kiểu gì
Cho nên mình mới nói dạy thế nào phải tùy vào người học là ai. Những sách bạn đưa là thuộc dạng đi sâu vào giải thuật rồi, cái khác không nói nhưng nếu như bạn đưa những thứ này vào dạy sinh viên năm nhất ở VN mình khẳng định hơn 90% là ko thể tiếp thu được. Vì sao mình dám nói thế là bởi nhìn vào đối tượng sách hướng tới, cụ thể mình xem prerequisites của cuốn "Introduction To Algorithms" bạn đưa thì

"You should have some programming experience. In particular, you should understand recursive procedures and simple data structures such as arrays and linked list.

You should have some facility with proofs by mathematical induction ..."

Mình nói thật số lượng học sinh chuẩn bị vào ĐH hiểu rõ đệ quy cũng như có tư duy quy nạp theo như yêu cầu của sách ở VN là ko nhiều, ít ra ở thời của mình thì là như thế. Trường chuyên may ra còn khả dĩ, chứ trường trường chắc cả trăm ko nổi 1 code được 1 back-tracking solution khi đang là học sinh.

Mô hình hóa là cách biểu diễn vấn đề, sao lại cần phải nắm vững hết lý thuyết DSA mới làm được? Giống như 1 bài toán thực tế, có thể mô hình bằng sơ đồ, bằng phương trình v.v... Hay giờ cho 1 con sông chẳng hạn, cần dự đoán có lũ hay ko thì trong số vô vàn chỉ số như lượng mưa, sức gió, vận tốc dòng chảy abc xyz thì lấy chỉ số gì ra đo, đo ở chỗ nào, là bề mặt hay giữa, đo ở vị trí nào, đầu sông hay cuối sông. Logic nào để có phản ánh chính xác lũ? Mô hình hóa là dựa trên tư duy bình thường ở high level mà ko cần kiến thức thủy lực gì hết, ví dụ đo tôi sẽ đo ở nơi nhiều dòng chảy hội tụ bởi lưu lượng nước nơi đó là lớn nhất, chẳng hạn vậy.

Hay lấy ví dụ tin học cho dễ hiểu đi, bài toán xếp hậu chẳng hạn. 1 trong những cách mô hình hóa tự nhiên nhất là dùng 1 mảng 2 chiều để thể hiện. Nhưng sau 1 hồi thì nhận thấy trên 1 cột tối đa 1 hậu nên chỉ cần mảng 1 chiều là đủ thể hiện rồi. Những thứ như thế mình nghĩ chả cần học DSA cũng nhận ra.

Còn tại sao lại phải dạy mô hình hóa, là bởi khâu này thực ra rất quan trọng mà ở VN, hay ít ra cá nhân mình thấy rất quan trọng nhưng ở thời của mình nó hoàn toàn bị bỏ qua. Mô hình là luôn được cho sẵn ko bao giờ cần động não tại sao có mô hình đó.

Cái này bọn Tây coi trọng hơn rất nhiều. Như mình đang dạy cu 7t nhà mình lập trình với "Scratch" đây. Tiếng là lập trình nhưng ko hề có dòng code nào, toàn bộ là high level.
 
Cho nên mình mới nói dạy thế nào phải tùy vào người học là ai. Những sách bạn đưa là thuộc dạng đi sâu vào giải thuật rồi, cái khác không nói nhưng nếu như bạn đưa những thứ này vào dạy sinh viên năm nhất ở VN mình khẳng định hơn 90% là ko thể tiếp thu được. Vì sao mình dám nói thế là bởi nhìn vào đối tượng sách hướng tới, cụ thể mình xem prerequisites của cuốn "Introduction To Algorithms" bạn đưa thì

"You should have some programming experience. In particular, you should understand recursive procedures and simple data structures such as arrays and linked list.

You should have some facility with proofs by mathematical induction ..."

Mình nói thật số lượng học sinh chuẩn bị vào ĐH hiểu rõ đệ quy cũng như có tư duy quy nạp theo như yêu cầu của sách ở VN là ko nhiều, ít ra ở thời của mình thì là như thế. Trường chuyên may ra còn khả dĩ, chứ trường trường chắc cả trăm ko nổi 1 code được 1 back-tracking solution khi đang là học sinh.

Mô hình hóa là cách biểu diễn vấn đề, sao lại cần phải nắm vững hết lý thuyết DSA mới làm được? Giống như 1 bài toán thực tế, có thể mô hình bằng sơ đồ, bằng phương trình v.v... Hay giờ cho 1 con sông chẳng hạn, cần dự đoán có lũ hay ko thì trong số vô vàn chỉ số như lượng mưa, sức gió, vận tốc dòng chảy abc xyz thì lấy chỉ số gì ra đo, đo ở chỗ nào, là bề mặt hay giữa, đo ở vị trí nào, đầu sông hay cuối sông. Logic nào để có phản ánh chính xác lũ? Mô hình hóa là dựa trên tư duy bình thường ở high level mà ko cần kiến thức thủy lực gì hết, ví dụ đo tôi sẽ đo ở nơi nhiều dòng chảy hội tụ bởi lưu lượng nước nơi đó là lớn nhất, chẳng hạn vậy.

Hay lấy ví dụ tin học cho dễ hiểu đi, bài toán xếp hậu chẳng hạn. 1 trong những cách mô hình hóa tự nhiên nhất là dùng 1 mảng 2 chiều để thể hiện. Nhưng sau 1 hồi thì nhận thấy trên 1 cột tối đa 1 hậu nên chỉ cần mảng 1 chiều là đủ thể hiện rồi. Những thứ như thế mình nghĩ chả cần học DSA cũng nhận ra.

Còn tại sao lại phải dạy mô hình hóa, là bởi khâu này thực ra rất quan trọng mà ở VN, hay ít ra cá nhân mình thấy rất quan trọng nhưng ở thời của mình nó hoàn toàn bị bỏ qua. Mô hình là luôn được cho sẵn ko bao giờ cần động não tại sao có mô hình đó.

Cái này bọn Tây coi trọng hơn rất nhiều. Như mình đang dạy cu 7t nhà mình lập trình với "Scratch" đây. Tiếng là lập trình nhưng ko hề có dòng code nào, toàn bộ là high level.

"You should have some programming experience. In particular, you should understand recursive procedures and simple data structures such as arrays and linked list.

You should have some facility with proofs by mathematical induction ..."

Mình nói thật số lượng học sinh chuẩn bị vào ĐH hiểu rõ đệ quy cũng như có tư duy quy nạp theo như yêu cầu của sách ở VN là ko nhiều, ít ra ở thời của mình thì là như thế. Trường chuyên may ra còn khả dĩ, chứ trường trường chắc cả trăm ko nổi 1 code được 1 back-tracking solution khi đang là học sinh.

Suy luận toán học thì chẳng học ở ngay năm lớp 10 còn gì nữa, vào đại học thì cũng học đến lớp 12 rồi. Mà mấy cái suy luận toán học kiểu quy nạp từ năm 11 đến năm 12 trong chương trình Toán phổ thông chẳng học nhẵn ra, chứ không làm mấy cái bài toán về dãy số kiểu gì.

Trước khi học DSA thì sẽ được học qua 1 ngôn ngữ lập trình qua môn nhập môn. 1 số trường dạy Python, 1 số trường dạy C. Lấy ví dụ luôn cái môn này:

Unit (https://www.qut.edu.au/study/unit?unitCode=CAB301)

IFB104 -> CAB201 -> CAB301

Mô hình hóa là cách biểu diễn vấn đề, sao lại cần phải nắm vững hết lý thuyết DSA mới làm được? Giống như 1 bài toán thực tế, có thể mô hình bằng sơ đồ, bằng phương trình v.v...

Cái này sinh viên năm nhất đại học lúc học nhập môn lập trình chẳng học về sơ đồ khối. Cấp 3 thì giải toán bằng phương trình rồi còn gì nữa.

DSA giúp giải quyết vấn đề tối ưu. Tất nhiên không nắm lý thuyết DSA vẫn có thể giải quyết 1 bài toán thôi, nó chạy trong O(n^2) với 1 số người cũng không sao cả.
 
bác xếp quay lui vét cạn sinh nhị phân, tổ hợp lên trên qhđ đi, như thế có nền tảng qua học qhđ dễ hiểu hơn, hiểu được bản chất của đệ quy quay lui thì sang qhđ nhanh lắm, à tham lam cụng có nhiều bài tập hay lắm ấy
 
Bác lên 28tech check chương trình dạy khoá c++ nâng cao đến cấu trúc dữ liệu giải thuật, r đến lập trình thi đấu tham khảo xem. Em thấy dạy algo cho bài tập thì làm test case chặt cũng quan trọng lắm đấy, đôi khi k chặt tưởng pass hết case nhưng nó lại có nguy cơ WA hoặc TLE
 
Bác lên 28tech check chương trình dạy khoá c++ nâng cao đến cấu trúc dữ liệu giải thuật, r đến lập trình thi đấu tham khảo xem. Em thấy dạy algo cho bài tập thì làm test case chặt cũng quan trọng lắm đấy, đôi khi k chặt tưởng pass hết case nhưng nó lại có nguy cơ WA hoặc TLE
việt nam em chỉ tham khảo mấy chỗ có tiếng chứ em vẫn thích bọn mỹ tho nó làm hơn
 
Chương trình ổn hay ko luôn phụ thuộc vào đối tượng người học là ai. Nó có thể có lý với người này nhưng lại ko có lý với người khác. Mà mấy thằng cu lên ĐH cũng có this có that. Cho nên bước đầu tiên là phải test trình độ của bọn nó, cái gì đã tốt và cái gì đang thiếu.

Cái đầu tiên nên dạy theo mình là tư duy mô hình hóa vấn đề và giải quyết ở high level, là thứ bọn Tây nó rất chú trọng nhưng ở VN thì gần như là ko dạy.

Ví dụ dạy học sinh cách suy ra kết quả của bài toán bằng cách tổng hợp kết quả của những bài toán tương tự nhỏ hơn. Có tư duy đấy rồi bọn nó tự suy ra quy hoạch động.

Hay như discrete structure mình được học ở Tây thì những thứ như graph, topology, circle v.v... bạn đề cập dù có trong nội dung môn học đấy nhưng lại ko phải mục tiêu chính của môn học này. Mục tiêu cơ bản của môn đấy là tại sao lại nghĩ tới việc lấy graph làm model cho problem để đưa ra solution, chẳng hạn thế.
Nhìn dưới góc độ đó thì Dijkstra có thể tự suy ra cách implement từ BFS. Hay bài toán xếp hậu chẳng hạn, nếu modeling problem bằng cách coi mỗi state của bàn cờ là 1 đỉnh, mỗi lần đặt thêm 1 quân hậu là 1 cạnh, thì problem này hoàn toàn có thể giải bằng BFS.

Chứ nếu như ko có tư duy ấy, thì Dijkstra là 1 bài, Dijkstra thay đổi 1 tí kiểu như tìm đường đi ngắn nhất nhưng phải qua ít nhất 4 đỉnh chẳng hạn có khi thành bài mới. Xếp hậu là 1 bài mà mã đi tuần là 1 bài khác, trong khi nếu đã có tư duy thì kể cả có là 1 quân quái thai nhảy zigzag thì vẫn là nó, vẫn implement bằng BFS thôi. Ngay như trong cái list bạn đưa mấy cái thuật toán sinh để mà chạy được thì cũng vẫn ... BFS. Mọi thứ vẫn chỉ là thằng A, chỉ đơn giản 1 cái là A quay phải, 1 cái là A quay trái hay A trồng cây chuối, ví dụ thế.

Mình nghĩ có tư duy ở high level rồi thì mới dạy đến kỹ thuật cụ thể vì như thế ko cần dạy nhiều mà sau đấy người học có thể tự học tự nâng cao trình độ. Cho nên, nếu dạy cho người mới mình sẽ dạy như sau.

1) Tư duy quy nạp
2) Lý thuyết đồ thị và cách mô hình hóa
3) Các thể loại mô hình hóa khác.

Bước tiếp theo là dạy đến các cách biểu diễn phổ biến của các thể loại trên trong tin học (có thể biểu diễn bằng Array, List v.v...) cũng như cách implement các thuật toán cơ bản.

Cuối cùng mới dạy kỹ thuật cụ thể, đầu tiên chắc là đệ quy.
Sau đó có thể là 2 con trỏ, tìm kiếm nhị phân v.v...
Cuối cùng mới tới đánh giá độ phức tạp. Bởi đơn giản nếu ko đưa được ra solution thì lấy gì mà đánh giá. Đánh giá và tối ưu theo cá nhân mình nên đứng cuối.
Tư duy quy nạp giống như trong toán học à bác, kiểu chứng minh đúng với n+1 à. Đệ quy thật sự hơi khó hiểu nhất là lúc chạy debug từng dòng code. Nhưng mà phần chứng minh quy nạp trong toán thì thấy nó cũng chẳng liên quan gì trong code... khi trong code phải tìm điểm dừng
 
Last edited:
việt nam em chỉ tham khảo mấy chỗ có tiếng chứ em vẫn thích bọn mỹ tho nó làm hơn
Thì ở vn dạy nền tảng về algo, kĩ thuật lập trình thì đám 28tech, với đám bigo có tiếng nhất rồi chứ còn đâu nữa phen :)) không phải seeder chứ e tham gia khoá c++ với dsa bên đó, giờ là lập trình thi đấu để nuôi mộng bigtech thì thấy dạy ổn nhất trong đám dạy ở VN rồi, bài tập thì siêu khó nên e mới bảo phen thớt tham khảo chương trình rồi tự về biên soạn thêm
 
Khóa học thuật toán - công cụ:
  • IDE Code Block hoặc VS code
Nội dung:
  • Đánh giá độ phức tạp thuật toán
  • Phân tích hình học 2D
  • Toán học logic
  • Kỹ thuật tìm kiếm trên mảng 1 chiều
  • Kỹ thuật tìm kiếm nhị phân
  • Kỹ thuật 2 con trỏ
  • Kỹ thuật tổng tiền tố
  • Quy hoạch động cơ bản
  • Quy hoạch động nâng cao
  • Sinh nhị phân
  • Sinh hoán vị - tổ hợp
  • Bài toàn xác suất
  • Đồ thị cơ sở
  • Duyệt đồ thị DFS - BFS
  • Thành phần liên thông
  • DSU
  • Giải thuật vét cạn
  • Math
  • Luyện tập tổng hợp

mình đang thiết kế để dạy mấy thằng cu mới lên đại học, chương trình thế này ổn k nhỉ
khóa này thím làm udemy hay youtube vậy thím
 
Bác lên 28tech check chương trình dạy khoá c++ nâng cao đến cấu trúc dữ liệu giải thuật, r đến lập trình thi đấu tham khảo xem. Em thấy dạy algo cho bài tập thì làm test case chặt cũng quan trọng lắm đấy, đôi khi k chặt tưởng pass hết case nhưng nó lại có nguy cơ WA hoặc TLE
TLE đã là gì, MLE nó còn thốn hơn :sad:
 
Thì ở vn dạy nền tảng về algo, kĩ thuật lập trình thì đám 28tech, với đám bigo có tiếng nhất rồi chứ còn đâu nữa phen :)) không phải seeder chứ e tham gia khoá c++ với dsa bên đó, giờ là lập trình thi đấu để nuôi mộng bigtech thì thấy dạy ổn nhất trong đám dạy ở VN rồi, bài tập thì siêu khó nên e mới bảo phen thớt tham khảo chương trình rồi tự về biên soạn thêm
+1 confirm nhé. Đội này dạy rất có tâm. Em học xong khóa dsa thấy đam mê thuật toán hẳn.
 
Back
Top