Showing posts with label thuattoanungdung. Show all posts
Showing posts with label thuattoanungdung. Show all posts

7/08/2024

Top website rèn luyện thuật toán tốt nhất cho sinh viên


Xem lại bài viết về thuật toán trên website Thuật toán ứng dụng | Tài liệu, cơ sở ngành CNTTCấu trúc dữ liệu và thuật toán | Tài liệu, cơ sở ngành CNTT

Rèn luyện tư duy và kỹ năng về thuật toán là việc không thể thiếu cho bất cứ sinh viên nào theo học IT, kể cả bạn có học AI, Khoa học dữ liệu hay công nghệ phân mềm thì thuật toán và cấu trúc dữ liệu luôn là thứ cần phải rèn luyện và cải thiện nhất là khi còn ngồi trên ghế nhà trường. Tại Bách Khoa thì dù cho bạn có học ngành nào của trường CNTT & TT đi chăng nữa thì 2 môn thuật toán ứng dụng và cấu trúc dữ liệu và thuật toán luôn là bắt buộc, nó là nền tảng cho tư duy lập trình ban đầu cho mỗi lập trình viên. 

Trong bài viết này tailieubkhn sẽ giới thiệu tới các bạn các trang giúp rèn luyện thuật toán cho học tập và thi đấu.

Code Tour


Code Tour khởi đầu là nền tảng cung cấp những kỳ thi và bài tập giúp các thành viên nâng cao tư duy lập trình. Sau 5 năm, cuộc thi đã thu hút gần 7.500 thí sinh tham gia, làm cầu nối hiệu quả giữa nhà trường và doanh nghiệp, bước đệm để sinh viên rèn luyện kiến thức học trên lớp.

Hội đồng giám khảo của Code Tour có sự xuất hiện TS. Đỗ Phan Thuận hiện là giảng viên cao cấp bộ môn Khoa học máy tính trường CNTT&TT, ĐHBKHN, những ai thường xuyên tham gia các cuộc thi Olympic tin học, ICPC chắc không còn lạ gì thầy.

Đăng ký tham gia contest tại Code Tour tại: https://codetour.org/contest/public

Codeforces

Website: https://codeforces.com/



Codeforces là một nền tảng, nơi các lập trình viên có thể tham gia các cuộc thi lập trình cạnh tranh. Tại đây, các vòng thi có giới hạn thời gian và cách thức phân chia điểm cho những người tham gia. 

Coding challenge site này ra đời từ năm 2009, và được vận hành bởi một nhóm đến từ Đại học ITMO do Mikhail Mirzayanov dẫn đầu. Tính đến năm 2018, đã có hơn 600.000 người dùng đã đăng ký tham gia các thử thách tại đây.

Codeforces được đánh giá là là trang luyện lập trình và thuật Toán rất hay.

Môn thuật toán ứng dụng của đại học Bách Khoa cũng đang sử dụng Codeforces cho phần thực hành và bài tập hàng tuần.

Codelearn

Website: https://codelearn.io/

Codelearn là nền tảng học và thi lập trình trực tuyến, cung cấp kiến thức lập trình, quản trị dự án CNTT cho sinh viên, cộng đồng lập trình viên. Hiện nền tảng cán mốc 50.000 người sử dụng đến từ nhiều quốc gia trên thế giới.


Codelearn có các phần luyện tập giúp người dùng có thể giải quyết các bài toán cụ thể từ dễ tới khó, phần thi đấu gồm một số bài thi với một số bài tập được giải quyết trong một thời gian cho trước và có bảng xếp hạng để có thể so sánh, phần thử thách là các thử thách tối ưu, giải quyết bài toán. Ngoài ra Codelearn còn là nền tảng học tập, chia sẻ kiến thức liên quan tới lập trình.

SPOJ PTIT

Spoj là một trang web chấm bài online. Trong đó có nhiều kiểu bài tập khác nhau: 

- Bài oi là bài tập tính theo điểm.

- Bài acm là bài tập chỉ accepted nếu các test trình chấm đều đúng

- Bài challenge là bài tập tùy thuộc vào từng đề, có thể là code ngắn nhất, kết quả gần tối ưu nhất …

Trang Spoj học viện bưu chính viễn thông là trang rất nổi tiếng với "rừng" bài tập từ dễ tới khó, đa dạng thể loại để rèn luyện.

Website: https://www.spoj.com/PTIT/problems/acm_12_round_1/


Hackerrank

Website: https://www.hackerrank.com/

Hackerrank có lẽ không cần mình giới thiệu nhiều nữa, đây là một website cực kỳ nổi tiếng trên thế giới về rèn luyện kỹ năng lập trình, rất nhiều công ty lớn trên thế giới sử dụng hackerrank làm tiêu chuẩn để đánh giá lập trình viên. Việc có một rank cao trên hackerrank cũng giúp bạn có ấn tượng lớn trong mắt các nhà tuyển dụng.

Leetcode

Website: https://leetcode.com/

Giống với hackerrank, leetcode cũng rất nổi tiếng với dân lập trình không chỉ ở Việt Nam mà còn trên thế giới. LeetCode là một nền tảng trực tuyến giúp rèn luyện kỹ năng lập trình và giải quyết bài tập cấu trúc dữ liệu và giải thuật. Nó cung cấp các bài tập lập trình đa dạng, phân loại theo chủ đề và độ khó. LeetCode không chỉ giúp vượt qua vòng phỏng vấn, mà còn hỗ trợ nâng cao kiến thức và kỹ năng lập trình.

11/12/2021

C/C++ có thực sự cần thiết? Giới thiệu các IDE, Text Editor sử dụng cho lập trình C/C++


C/C++ có thực sự cần thiết?

C/C++ là ngôn ngữ dùng và giảng dạy trong hầu hết các môn học liên quan tới các môn cơ sở cốt lõi ngành CNTT như tin đại cương, cấu trúc dữ liệu, kỹ thuật lập trình, thuật toán ứng dụng,... tại Bách Khoa và hầu hết các trường đại học khác vì tính "nền tảng của C/C++".

Trong phần này mình sẽ giải thích cho các bạn vai trò của C/C++, và với sự phát triển mạnh mẽ của các ngôn ngữ lập trình bậc cao thì C/C++ có thực sự cần thiết?

- Câu trả lời của mình về C/C++ là cần thiết (*).

- Đầu tiên là mình muốn nói về C/C++ còn được các công ty sử dụng hay không?, chúng ta hãy xem danh sách các ngôn ngữ mà các công ty lớn đang sử dụng cho sản phẩm/dịch vụ của họ nha (Ảnh: Wiki - 2021): 

Như mọi người thấy C++ được hầu hết các ông lớn sử dụng ở phía server vì hiệu năng, tốc độ của nó là cực kì tốt.

- C/C++ gần với ngôn ngữ máy tính nhất nên qua đó, bạn có thể hiểu được bên dưới thật sự máy tính nó đang làm gì, cấp phát bộ nhớ ra sao, hoạt động như thế nào.

- C/C++ là cơ sở để xây dựng rất nhiều ngôn ngữ khác như Python, các thư viện hay core của Python đều được viết bằng C++, vì thế khi hiểu rõ bạn có thể tác động sâu hơn vào các ngôn ngữ này, cái này khá là hay mà khi mà mình đã bị bạn mình khuất phục bằng những thứ mình nghĩ là không thể nếu chúng ta chỉ là người giỏi ngôn ngữ Python mà không hiểu hệ thống bên dưới nó được chạy thế nào.

- Nhiều ngôn ngữ lập trình khác được phát triển dựa trên nền tảng C++, bao gồm C#, D, Java và các phiên bản mới hơn của C. Vậy nên các cấu trúc, câu lệnh, khai báo biến,... đều có phần giống với C/C++. Vì thế khi bạn học xong C/C++ thì tiếp cận các ngôn ngữ khác cũng dễ dàng hơn.

- Lập trình viên C/C++ được trả lương rất cao

Tuy nhiên chúng ta cần quay lại (*) ở bên trên, mình đã nói rằng C/C++ là cần thiết tuy nhiên chúng không phải là tất cả, bạn có thể bước vào và trở thành một lập trình viên mà không cần biết cũng như cần học qua C/C++. Với các bạn sinh viên và đặc biệt là sinh viên Bách Khoa thì C/C++ được sử dụng làm ngôn ngữ giảng dạy trong một số môn thì lời khuyên của mình là các bạn hãy cố gắng học cho tốt chú đừng cố kêu ca rằng nó đã lỗi thời và không còn được sử dụng.

Các IDE, Text Editor sử dụng cho lập trình C/C++

Khi năm nhất cũng mới học tin đại cương thôi, lúc ấy cũng là dân mới vào nghề, mình cũng không biết là dùng IDE gì để code C/C++, cũng đã thử cài vào rồi gỡ ra rất nhiều ứng dụng. Trong phần này mình sẽ chia sẻ tới mọi người một số IDE, Text Editor phổ biến cho lập trình C/C++ và các ưu, nhược điểm của nó để các bạn có thể chọn ra IDE, Text Editor phù hợp cho mình nha.

Dev-C/C++

Cái tên gạo cội thì phải nhắc tới Dev-C/C++, nó là IDE chính được sử dụng trong môn tin học đại cương, nó dễ cài đặt, dễ sử dụng và nhẹ tuy nhiên chưa phải là một IDE mạnh. Thường thì Dev-C/C++ sử dụng cho người mới bắt đầu.

Codeblocks

Codeblocks là IDE mà mình thấy là phù hợp cho việc học thuật toán và nó cũng được các thầy/cô giáo trong môn thuật toán ứng dụng gợi ý sử dụng. Codeblocks cũng rất dễ cài đặt, sử dụng và nhẹ. Với góc độ thuật toán thì Codeblocks là một IDE khá mạnh, tuy nhiên với project lớn phải chia các mô-đun thì mình thấy là Codeblocks chưa đủ mạnh.

Eclipse / Netbeans

C/C++ như là nghề tay trái khi nhắc tới 2 IDE này. Netbeans hay Eclipse đều là các IDE mạnh mẽ hỗ trợ Java và thường sử dụng cho các lập trình viên Java (Eclipse thì có cả 1 hệ sinh thái các ứng dụng của riêng chúng). 

Điểm mạnh của 2 IDE này là mã nguồn mở, hoàn toàn free cho người dùng và rất mạnh mẽ. Tuy nhiên thì việc sử dụng 2 IDE này trong 2 môn tin đại cương hay thuật toán ứng dụng có vẻ là hơi to và nặng.

Clion

Clion là một sản phẩm của Jetbrains và như mình đã viết trong một số bài viết thì các sản phẩm của Jetbrains là miễn bàn, ngon khỏi chê. 

Tuy nhiên Clion rất nặng, như với Netbeans và Eclipse thì Clion dành cho các project lớn. Còn nữa, Clion là không có bản miễn phí, nhưng với sinh viên chúng ta hoàn toàn có thể sử dụng miễn phí Clion mà không tốn một đồng nào từ mail edu của các bạn, bạn có thể xem lại bài hướng dẫn Mail edu của trường làm được gì để nhận và sử dụng miễn phí tất cả các sản phẩm của Jetbrains.

VSCode / Sublime Text

VSCode hay Sublime Text đều là các Text Editor, và muốn sử dụng chúng cho bất cứ ngôn ngữ hay framework nào thì các bạn phải cài thêm các extension hỗ trợ, và việc mày mò cài thêm  các extension cho từng ngôn ngữ là rắc rối. Thường thì những pro mới dùng editor để code, lời khuyên của mình nếu các bạn là newbie thì hãy lựa chọn Dev-C hoặc Codeblocks chứ đừng bem ngay vào 2 editor này.

Một editor nữa mình giới thiệu luôn ở phần này đó là vim, cũng giống như VSCode hay Sublime Text, bạn muốn sử dụng chúng cho các ngôn ngữ hay framework nào thì phải cài thêm các extension hỗ trợ. Vim thì sử dụng rất khó, cài đặt thêm các extension cũng khó. Thường thì các super-pro mới dùng vim để code.

replit

Cái này là một IDE online hỗ trợ khá nhiều các ngôn ngữ. Vì là online nên rất tiện vì các bạn không cần phải cài đặt, chỉ cần một trình duyệt có mạng là có thể vào code luôn, dùng mọi nơi chỉ cần là có máy tính nối mạng không cần phải cài môi trường hay gì cả. 

Tuy nhiên vì là online nên có rất nhiều hạn chế như các thư viện không đủ, các trình gợi ý code chưa đủ mạnh,...

Tham khảo: https://en.wikipedia.org/https://codelearn.io/

7/04/2021

Thuật toán có thực sự quan trọng? | Blogging


Thuật toán là gì? Theo wiki, trong toán học và khoa học máy tính, một thuật toán, còn gọi là giải thuật, là một tập hợp hữu hạn các hướng dẫn được xác định rõ ràng, có thể thực hiện được bằng máy tính, thường để giải quyết một lớp vấn đề hoặc để thực hiện một phép tính.

Vậy học thuật toán để làm gì? Và tại sao gần như mọi trường đại học và điển hình tại Bách Khoa Hà Nội thì thuật toán là môn học không thể thiếu? Cùng nghe về chia sẻ của mình nha, nếu bạn có những ý kiến khác thì hãy comment để mọi người cùng biết nha.

Tại sao cần dùng thuật toán?

Bạn chỉ cần search trên Google là 'Tại sao cần dùng thuật toán' thì sẽ ra cả tá bài viết viết về vấn đề này, hoặc tiêu biểu bạn có thể xem bài viết Đôi chút về cấu trúc dữ liệu và thuật toán, bài viết này mình sẽ tóm gọn lại nhanh vấn đề nha.

Thuật toán không giúp code của bạn ngắn hơn mà thậm chí nó phải dài hơn. Nhưng hiệu quả là vấn đề không phải bàn cãi, thuật toán giúp chương trình của bạn chạy nhanh hơn, với những thuật toán tối ưu chương trình của bạn còn có thể chạy nhanh hơn rất nhiều nữa. 

Học thuật toán sẽ giúp các bạn có một tư duy tốt hơn và có thể là tốt hơn rất nhiều để giải quyết vấn đề.

Am hiểu về thuật toán sẽ là một điểm cộng khi tham gia phỏng vấn. Với bạn nào mà muốn theo đuổi lập trình Game hay muốn làm việc tại 1 số tập đoàn lớn như VNG, Viettel, Samsung thì thuật toán là thứ không thể thiếu nay. Phỏng vấn đầu vào là thuật toán, tại Samsung nếu bạn muốn làm các chức vụ cao hơn thì bạn phải thi các cuộc thi về thuật toán nữa nha,... Vậy nếu các bạn có những định hướng về hướng đi giống như trên thì hãy học thuật toán ngay đi nha. 

...

Không học, không giỏi thuật toán có được không?

Mình không hề master thuật toán, và cũng không phải là fan cuồng thuật toán vậy nên nhận xét thật lòng thì không giỏi thuật toán chả sao, chúng ta vẫn có thể trở thành thành lập trình viên giỏi trên các lĩnh vực của mình.

Không cần thuât toán bạn vẫn sẽ đưa ra được cái giải pháp của mình, tuy nhiên nó có thể không tối ưu với vôn thuật toán hạn chế của lập trình viên nhưng nó chắc cũng sẽ là một giải pháp.

Nếu bạn là một lập trình viên viết những web thiên về nội dung. blog hay những app với những xử lý logic đơn giản có lẽ những djikstra, quick sort,... cũng không có nhiều đất dụng võ.

Bây giờ một số thuật toán kinh điển đều đã được cài đặt sẵn và xây dựng thành các thư viện và đã được tối ưu, kiểm thử lỗi,... nên lập trình viên muốn dùng chỉ cần gọi ra và sử dụng.

Có nhiều phần mềm, sự hiểu biết về thiết kế, tổ chức dữ liệu sẽ quan trọng hơn rất nhiều so với những thuật toán hay được sử dụng trong phần mềm.

Vậy thuật toán có thực sự quan trọng không?

Những người đọc bài viết này của mình chắc đa số đều là sinh viên Bách Khoa và chắc chắn dù muốn hay không thì các bạn đều phải học, thậm chí là cày ngày, đêm để còn qua môn cấu trúc dữ liệuthuật toán ứng dụng hay là để thi tuyển vào samsung,...

Một số bạn thì so sánh rằng, các trường như FPT họ không học thuật toán mà học thẳng trực tiếp các framework, thư viện, những thứ thực tế cần dùng hơn. Nhưng mình xin đính chính lại là FPT có học toán rời rạc, cấu trúc dữ liệu,... nha chỉ là họ học khá là nhẹ nhàng hơn so Bách Khoa mà thôi, nhưng cũng vì thế mà một người anh của mình tại FPT cũng từng nói với mình rằng là thật tiếc rằng ngày đó anh không được tiếp cận đồ thị sớm hơn khi còn học tại trường.

Không nhắc về các trường đại học nữa, vậy thì một số trung tâm, hệ thống đào tạo lập trình viên thì sao? Như APTECH. Nhưng cũng xin đính chính tiếp với các bạn, những lập trình viên mà APTECH đào tạo ra họ là những người thợ code, khi họ học thì họ thực hành là chủ yếu, code ngày code đêm và trình độ code của họ chắc chắn là hơn sinh viên đại học như chúng ta. Tuy nhiên, chúng ta không phải là những thợ code, chúng ta không thể chỉ biết code, chúng ta là những kỹ sư mà kỹ sư là phải giải quyết các vấn đề chứ không chỉ đơn giản là bạn được vứt cho một loạt mẫu có sẵn và code theo những mẫu này như những người thợ code thực thụ.

Vậy kết luận lại thì thuật toán cần không? Thuật toán cần, phải học, ít nhất là phải học để biết nhưng không phải là tất cả. Đó là những suy nghĩ của mình về vấn đề khá nan giải này. Còn bạn nghĩ gì thì hãy comment cho mọi người cùng biết nha.

2/26/2021

Thuật toán ứng dụng | Tài liệu, cơ sở ngành CNTT


Môn này hay thường được gọi là môn cấu trúc dữ liệu và thuật toán 2. Ở cấu trúc dữ liệu thì đã học full lý thuyết, thi code cũng bằng giấy và các bạn đòi code máy thì môn này là môn thỏa mãn đam mê đó đây, phải gọi là môn này "code cho tới không còn hơi thở nào thì thôi". Thi giữa thì thi trên máy, thi cuối kì thi trên máy. Kì thi được tổ chức chuyên nghiệp như thi Olympic, nếu có thầy, cô nào cộng điểm giữa kì cho sinh viên cũng là thi trên máy hết.

Xem thêm : Cấu trúc dữ liệu và thuật toán | Tài liệu, cơ sở ngành CNTT



Hầu như các kiến thức ở môn này chỉ là nhắc lại. Các thuật toán như sử dụng CTDL cơ bản, quy hoạch động, đệ quy quay lui, các thuật toán trên đồ thị, tham lam, chia để trị,.... sẽ được dạy theo từng chủ đề riêng ( thường thì mỗi tuần dạy một chủ đề và làm bài tập về chủ đề đó và thực hành về chủ đề này trên codeforces). Thực hành môn này thì không có điểm, đi học chỉ để các thầy cô và các anh trợ giảng hướng dẫn để giải các bài tập thôi, đối với các bạn không biết thế nào chứ đối với mình mấy tuần đầu các chủ đề, thuật toán dễ còn làm được chứ sang mấy chủ đề về quy hoạch động hay chia để trị thì thực sự khó, nhiều lúc còn không nghĩ ra ý tưởng để giải quyết bài toán cơ.

Có một lời khuyên về môn này nữa là các bạn hãy làm thật nhiều rồi nhớ lưu lại code của mình với những cái tên thật dễ nhớ. Những thuật toán hay dùng mà dễ kiểu quên quên như DFS, BFS, CTDL Disjoint set thì cài đặt trước luôn đi. Vì môn này đi thi các bạn sẽ được dùng máy tính cá nhân và sử dụng lại source code mà các bạn đã làm.

Mình có slide bài giảng của thầy Phạm Quang Dũng muốn chia sẻ tới các bạn, mình thấy slide này rất hay, chi tiết và nên đọc cho các bạn muốn tìm hiểu cũng như đang học môn Thuật toán ứng dụng : TẢI VỀ SLIDE

Đề thi giữa kì 20201 - thuật toán ứng dụng (đề thi + test cases + sourcecode): TẢI VỀ ĐỀ THI

Đề thi cuối kì 20201 - thuật toán ứng dụng (đề thi + test cases + sourcecode): TẢI VỀ ĐỀ THI
(các file .pdf là các file đề bài, các file .cpp là các file sourcecode, các file .zip là các file testcases, nếu có git thì bạn có thể clone repo về bằng lệnh git clone)

Còn đây là một số bài trên codeforces mà mình có lưu lại : TẢI VỀ
(đề bài trong thư mục problems, các file .cpp bắt đầu bằng số là problem của tuần đó và kèm theo là tên bài, ví dụ file 04PIE.cpp là source code của bài PIE trong problem 4, một lưu ý to nữa là đây là các bài do mình tự làm lên đôi khi một số bài code cũng không được đúng quy tắc, gọn gàng và còn nhiều thiếu sót, và nếu bạn nào có tài khoản github thì cho mình 1 sao trên repo nha)

Ngoài ra, nếu muốn luyện tập thêm thì bạn có thể giải bài trên các trang sau :