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.

7/07/2024

Trí tuệ nhân tạo sinh là gì? Chương trình đào tạo kỹ sư chuyên sâu đặc thù "GENERATIVE AI ENGINEER PROGRAM" của đại học Bách Khoa Hà Nội


Ngày 15/6/2024 Trường công nghệ thông tin và truyền thông, Đại học Bách Khoa Hà Nội đã tổ chức lễ ra mắt chương trình GENERATIVE AI ENGINEER PROGRAM - GenAI Engineer Program - Ready for a New Era of AI.


Trí tuệ nhân tạo sinh hay AI tạo sinh ( tiêng Anh là GENERATIVE AI hay ngắn gọn là GenAI) là gì? Trí tuệ nhân tạo sinh là một loại công cụ trí tuệ nhân tạo có thể tạo ra nhiều loại nội dung khác nhau, bao gồm văn bản, âm thanh, hình ảnh và dữ liệu tổng hợp. Ví dụ AI tạo sinh có thể học từ vựng tiếng Anh và làm thơ. AI tạo sinh có thể sử dụng cho nhiều mục đích khác nhau như làm chatbot, tạo nội dung truyền thông, phát triển và thiết kế sản phẩm. ChatGPT cũng là một trong những sản phẩm của AI tạo sinh.

Nhận thức được sự quan trọng của trí tuệ nhân tạo sinh trong kỷ nguyên AI bùng nổ, vào ngày 5/7/2023, Trường CNTT&TT – ĐHBK Hà Nội đã thành lập Phòng Thí nghiệm mô hình nền tảng (Foundation Models Lab – FML) thuộc Trung tâm Nghiên cứu Quốc tế về Trí tuệ Nhân tạo (BKAI) vào năm 2023 để chuẩn bị nguồn lực khoa học và công nghệ cho lĩnh vực quan trọng này. Từ khi ra đời, FML đã hoạt động rất tích cực và có được một số thành tựu nghiên cứu đáng ghi nhận, cũng như mở rộng được mạng lưới hợp tác chặt chẽ với nhiều trung tâm nghiên cứu – phát triển và phòng thí nghiệm trong và ngoài nước trong lĩnh vực GenAI. Thông qua các hợp tác của FML, Trường CNTT&TT nhận thấy một nhu cầu lớn về nhân lực trong lĩnh vực này không những chỉ ở Việt Nam mà còn ở các nước trong khu vực, chính vì vậy, từ cuối năm 2023, Trường đã thành lập tổ công tác với nòng cốt là các nhà khoa học của FML-BKAI để xây dựng Chương trình đào tạo Kỹ sư chuyên sâu đặc thù về Trí tuệ nhân tạo tạo sinh (GenAI Engineer Program). 

“GenAI Engineer Program” của Trường CNTT&TT – ĐHBK HN có thể coi là chương trình đào tạo chuyên sâu về GenAI đầu tiên tại Việt Nam, và cũng là một trong những chương trình đầu tiên trên Thế giới. Đây là chương trình đào tạo sau đại học cấp bằng “Kỹ sư chuyên sâu đặc thù” cho mọi đối tượng đã có bằng cử nhân trong lĩnh vực CNTT&TT. Theo Khung trình độ quốc gia Việt Nam thì, bằng cấp Kỹ sư chuyên sâu đặc thù và Thạc sỹ có cùng bậc 7. 

Theo học Chương trình này, Sinh viên không những được trang bị các kiến thức nền tảng về trí tuệ nhân tạo, mà còn được đặc biệt cung cấp các mảng kiến thức hiện đại, chuyên sâu, và cập nhật nhất về trí tuệ nhân tạo tạo sinh. Đội ngũ giảng dạy được lựa chọn từ các chuyên gia uy tín trong lĩnh vực trí tuệ nhân tạo, với kinh nghiệm phong phú trong nghiên cứu và phát triển sản phẩm GenAI. Ngoài ra, ĐHBK HN cam kết sẽ cung cấp cho học viên các cơ sở vật chất tốt nhất phục vụ học tập và nghiên cứu, ví dụ: Hệ thống siêu máy tính DGX A100 vừa mới được trang bị đầu tháng 6 năm 2024. 

Với định hướng học tập thông qua trải nghiệm, cũng như gắn đào tạo với doanh nghiệp, học viên sẽ có trọn một học kỳ thực tập tại các đơn vị nghiên cứu, phát triển, ứng dụng công nghệ hàng đầu tại Việt Nam. 

Nội dung đào tạo của chương trình kỹ sư chuyên sâu đặc thù trí tuệ nhân tạo sinh: 

- Nền tảng về AI, học máy, học sâu, học máy đa thể thức và các mô hình đào tạo sinh.

- Vận hành, triển khai và giám sát mô hình học máy (Machine Learning Operations).

- Huấn luyện, hiệu chỉnh, căn chỉnh và khai thác các mô hình ngôn ngữ lớn.

- Xây dựng các ứng dụng GenAI để xử lý các tác vụ bằng ngôn ngữ tự nhiên trong nhiều lĩnh vực khác nhau.

- Tạo sinh văn bản, hình ảnh, video, âm thanh và các thể thức dữ liệu khác.

- Ứng dụng GenAI trong: kỹ thuật phần mềm, đa phương tiện, thương mại điện tử, marketing, y học và chăm sóc sức khỏe,...

- Đạo đức AI và xây dựng trí tuệ nhân tạo đáng tin cậy

Fanpage dành riêng cho chương trình trí tuệ nhân tạo sinh của đại học Bách Khoa Hà Nội: https://www.facebook.com/GenAI.Engineer 

Website thông tin chính thức của chương trình trí tuệ nhân tạo sinh đại học Bách Khoa Hà Nội: https://soict.hust.edu.vn/genai

Nhóm Zalo hỗ trợ tư vấn và hỏi đáp về ngành học với các thầy cô trường CNTT&TT: https://zalo.me/g/xpeqyg692

Cá nhân mình thì thấy đây là một chương trình khá đáng học cho các bạn đam mê tìm hiểu và phát triển bản thân trong lĩnh vực trí tuệ nhân tạo. Tuy nhiên cần phải xem xét trên nhiều yếu tố khía cạnh như là công việc, định hướng tương lai của bản thân và khả năng, vì theo học các ngành học AI rất nặng về toán và không chỉ đơn thuần là lập trình. Một mùa tuyển sinh nữa lại tới chúc tất cả mọi người theo đuổi được ngành học mà mình yêu thích.

3/25/2024

Free For Students 2 | Sharing


Neon Postgresql

Giống với MongoDB Atlas là một nền tảng lưu trữ dữ liệu dành cho cơ sở dữ liệu Mongodb thì Neon là một nền tảng lưu trữ dành cho cơ sở dữ liệu Postgresql, Neon tách biệt điện toán và lưu trữ để cung cấp các tính năng hiện đại dành cho nhà phát triển. 

Cũng với 512MB Free, mặc dù là không nhiều tuy nhiên sử dụng cho mục đích bài tập cá nhân hay đồ án thì cũng là một sự lựa chọn rất phù hợp cho sinh viên.

Website: 

Truy cập website tại: https://neon.tech/

alwaysdata.com

Lưu trữ web miễn phí 100 MB hỗ trợ MySQL, PostgreSQL, CouchDB, MongoDB, PHP, Python, Ruby, Node.js, Elixir, Java, Deno, máy chủ web tùy chỉnh, truy cập qua FTP, WebDAV và SSH; bao gồm hộp thư, danh sách gửi thư và trình cài đặt ứng dụng.

Dung lượng hỗ trợ cũng không nhiều, tuy nhiên trong bài tập lớn sử dụng trên trường có lẽ cũng đủ để có thể dựng một dự án nho nhỏ để demo.



Truy cập website tại: https://www.alwaysdata.com/

moqups.com

Những người làm thiết kế hay lập trình viên bình thường có lẽ đã rất quen với figma, công cụ thiết kế cực kỳ phổ biến. Tuy nhiên thì figma lại thường dành cho những người có chuyên môn và muốn làm được figma cũng phải dành chút thời gian ra với nó. 

Với bài tập lớn thì công việc mẽ mockup hay thiết kế chỉ là một công việc phụ vì vậy không thể dành nhiều thời gian quá nhiều cho nó, moqups cung cấp rất nhiều mẫu giao diện có sẵn để có thể làm những công việc này một cách dễ dàng hơn.


Truy cập website tại: https://app.moqups.com/

creately

Giống với moqups.com là nền tảng để vẽ mockup thì creately là một nền tảng hỗ trợ vẽ biểu đồ UML. creately cung cấp các mẫu UML cho phép xây dựng các sơ đồ UML một cách dễ dàng hơn.

Cũng giống với vẽ mockup chỉ là một bước nhỏ trong quá trình làm bài tập lớn, vì thế cũng không nên tập chung quá nhiều thời gian cho những công việc này, nên việc sử dụng các nền tảng hỗ trợ đa dạng mẫu template là rất cần thiết trong quá trình làm bài tập lớn.


Truy cập website tại: https://app.creately.com/

draw.io

Draw.io có lẽ không còn xa lạ gì với mọi người, đây là một nền tảng vô cùng phổ biến. Với draw.io chúng ta có thể làm gần như mọi thứ: vẽ biểu đồ UML, vẽ luồng hoạt động, vẽ kiến trúc, vẽ mockup, mindmap... Là về cơ bản thì draw.io cũng hoàn toàn có thể thay thế cho 2 nền tảng trên và đây là một nền tảng cực kỳ đa năng.

Draw.io còn cung cấp một kho mẫu có sẵn cho nhiều loại để có thể tùy chỉnh. Đây là một nền tảng mà mình rất hay sử dụng khi đi học và bây giờ là ngay cả khi đi làm. Mỗi lần bị bắt vẽ UML hay mockup là nghĩ ngay tới draw.io.


Truy cập website tại: https://app.diagrams.net/

replit

Replit cung cấp nhiều công cụ và tính năng cần thiết cho việc phát triển phần mềm. Nó hoạt động như một IDE oneline giúp mọi người tỏng nhóm có thể cùng nhau lập trình, nhà cung cấp đám mây, cộng đồng nhà phát triển.

Với các ngôn ngữ lập trình hay sử dụng thì chắc chắn là phải cài nó vào trong máy, còn với một số ngôn ngữ lập trình ít sử dụng mà yêu cầu trong môn học các bạn có thể sử dụng replit để có thể giảm bớt thời gian cài đặt môi trường và sau đó là gỡ đi khi hết môn học.



Truy cập website tại: https://replit.com/

dbdesigner.net

dbdesigner.net là một công cụ vẽ và mô hình hóa về cơ sở dữ liệu. Nền tảng này còn hỗ trợ việc gen các câu SQL sau khi thiết kế và hỗ trợ trên rất nhiều các cơ sở dữ liệu như là MySQL, PostgreSQL, Oracle, Sqlite,...

Tuy nhiên, phiên bản miễn phí hiện đang chỉ hỗ trợ gen SQL với hệ thống dưới 10 table.


Truy cập website tại: https://app.dbdesigner.net/

Paraphrasing Tool

https://quillbot.com/ là công cụ giúp viết lại câu văn để tránh bị ghi nhận đạo văn trên các nền tảng check đạo văn. Hiện tại hệ thông cũng hô trợ một số ngôn ngữ có cả tiếng Việt và Anh. Mọi người viết báo khoa học hay là viết báo cáo bài tập lớn mà có tham khảo từ nguồn khác hay tham khảo từ một bài viết của nhóm khác của thể sử dụng công cụ này để viết lại đoạn văn để tránh bị check đạo văn.


Microsoft Azure

Việc nhận được 100$ cho Azure qua email trường và 1 số package miễn phí dành cho sinh viên mình đã nó qua tại bài viêt Mail edu của trường làm được gì ? mọi người có thể xem chi tiết hơn tại bài viết trên.

123host

Nhận hosting free tại 123host.vn, các bạn có thể triển khai một số dự án bằng PHP hoặc HTML tĩnh để demo cho giáo viên/ giảng viên môn học. Phần này mình cũng có nói chi tiết tại bài viết Free hosting, domain trọn đời, phù hợp cho sinh viên, mọi người có thể xem chi tiết hơn tại bài viết trên.

Một số nền tảng khác

Một số nền tảng khác mình muốn chia sẻ thêm, có thể cũng có thể giúp ích cho mọi người trong một khoảnh khắc nào đó: 

- Công cụ biên dịch code online: https://www.codechef.com/ide

- Vẽ chart online: https://dashboard.visme.co/

- Công cụ viết markdown online theo nhóm: https://hackmd.io/

- Công cụ viết markdown: https://stackedit.io/


Cẩm nang HUST | Sharing


Ghi chú: bài viết sẽ được cập nhật thường xuyên khi có những thông tin mới

Trong quá trình học hay là hoạt động tại trường chắc hẳn nhiều lúc ai đó cũng sẽ một lần ngạc nhiên rằng là "ơ cái hoạt động này ở đâu vậy?", "ơ cái biểu mẫu này lấy ở đâu vậy?", "ơ sao mày biết phải email cho thầy/cô này!". Thực ra tất cả những thông tin này đều được trường đưa lên các trang web cổng thông tin của trường, nhưng vì lượng thông tin là quá nhiều nên việc tìm kiếm cũng rất khó khăn với nhiều cái trường hiện tại cũng đang tiến hành hợp nhất để mọi người có thể tìm kiếm trên một cổng thông tin duy nhất nhưng vẫn đang trong quá trình. Trong bài viết này mình sẽ ghi chú ra những thông tin hữu ích và cần thiết cho các bạn, nhớ bookmark lại các mục này để khi cần có thể tìm lại một cách nhanh nhất nha.

Mình chia sẻ còn thiếu những phần nào, hoặc mọi người thấy thiếu sót phần nào mà mọi người cho là quan trọng có thể comment lại dưới bài viết để những người sau có thể đọc được nha. Rất cảm ơn mọi người!

Hướng dẫn thủ tục, biểu mẫu, thắc mắc về học tập, học phí.

Tại Bách Khoa các bạn có thể sẽ phải email rất nhiều để hỏi về học tập, thắc mắc về học phí, biểu mẫu hay thủ tục gì đó. Có rất nhiều bạn đã bị trả về email vì email sai cách, không đúng cách, không đúng format hoặc email cho sai người. Việc vấn đề nào đó email cho ai, format email như nào đã được trường quy định và đăng trên cổng thông tin sinh viên tại https://sv-ctt.hust.edu.vn/#/so-tay-sv/69/huong-dan-gui-cau-hoi-toi-phong-dao-tao-cac-van-de-ve-hoc-tap-hoc-phi


Biểu mẫu về học tập

Các biểu mẫu về học tập như: 

- Đơn đề nghị điều chỉnh điểm
- Đơn xin chuyển điểm tương đương 
- Đơn xin đăng ký lớp
- Đơn xin rút lui học phần 
- Đơn xin hoãn thi 
- Đơn xin thi bù do hoãn thi
- Đơn xin học tiếp lên kỹ sư

Mọi người có thể tải về biểu mẫu tại: https://ctt.hust.edu.vn/DisplayWeb/DisplayBaiViet?baiviet=77&fbclid=IwAR1S-wuiqnE33s_ZOSwheDR-e4CNQiolznf7D_vL8Yy1fJBPDa7PHFdf12s

Hoặc tải biểu mẫu tại link (những biểu mẫu không có là mọi người sẽ phải tìm trong mục email phía trên để email cho giáo viên/ giảng viên): BIỂU MẪU HỌC TẬP

Thông báo

Thông báo của trường mới nhất sẽ được đăng tải tại https://ctt.hust.edu.vn/DisplayWeb/DisplayListBaiViet?tag=%C4%90T%C4%90H

Sẽ gồm có lịch thi giữa kì, cuối kì, thông tin cấp bằng, đăng ký xét tốt nghiệp, xét nhận đồ án, đăng ký môn, công tác sinh viên,...

2/12/2024

Free For Students | Sharing


Trong các bài viết trước đã có một số bài viết mình chia sẻ về cách sử dụng mail edu để sử dụng một số các ưu đãi dành cho sinh viên. Vì mail edu một số dịch vụ cũng hết hạn khá là nhanh, một số dịch vụ không khả dụng tại Việt Nam, một số dịch vụ cũng khó đăng ký và sử dụng, vì vậy bài viết này mình giới thiệu một số dịch vụ khác hữu ích cho sinh viên IT sử dụng trong quá trình làm đồ án hay bài tập lớn của mình.

1. MongoDB Atlas

MongoDB Atlas là nền tảng thuộc sự quản lý trực tiếp của MongoDB, người dùng đăng ký được sử dụng 512MB dung lượng miễn phí từ nền tảng này. Dung lượng lưu trữ không nhiều nhưng là vừa đủ để sinh viên sử dụng trong bài tập lớn hay đồ án của mình khi cần triển khai database lên internet.


MongoDB Atlas còn cung cấp tùy chọn lưu trữ dữ liệu trên Aws, GCP (Google Cloud Platform) hoặc Azure. Mình thấy đây là nền tảng mà sinh viên khá ưa thích khi bài tập lớn có sử dụng database là MongoDB.

Truy cập website tại: https://www.mongodb.com/atlas/database

2. InfinityFree - Free Website Hosting

Trang web cho phép bạn tạo website miễn phí mà không quảng cáo. Mình đã từng dùng nền tảng này để triển khai bài tập lớn môn công nghệ web và dịch vụ trực tuyến (Github của dự án tại https://github.com/trannguyenhan/selling-computer), đã hơn 2 năm mà website vẫn còn được giữ trên nền tảng này.

Tuy nhiên, thì nền tảng chỉ cho phép triển khai với ngôn ngữ lập trình PHP và cơ sở dữ liệu MySQL và tối đa 3 website trên 1 tài khoản.


Truy cập website tại https://www.infinityfree.com/

3. Proxy Free

Proxy là một phần không thể thiếu khi bạn làm các bài tập lớn liên quan tới thu thập dữ liệu từ internet. Một số môn học có yêu cầu là nhập môn khai phá dữ liệu một số thầy/cô có thể yêu cầu các bạn tự thu thập dữ liệu cho mô hình, tích hợp dữ liệu và đặc biệt là nhập môn khoa học dữ liệu cần phải làm một luồng từ đầu tới cuối về thu thập, xử lý và xây dựng mô hình.

Một website cung cấp proxy uy tín mà mình hay sử dụng là https://www.webshare.io/, website cung cấp miễn phí 10 proxy để để sử dụng trong bài tập lớn môn học. 

Ngoài ra, nếu có nhu cầu lớn hơn bạn cũng có thể tham khảo thêm về các dịch vụ trả phí mà website cung cấp, tất cả đều rất rẻ so với những nhà cung cấp khác. Ở trường hay ở cty mình cũng thường xuyên sử dụng proxy trên đây.



11/01/2023

Cấu trúc dữ liệu và thuật toán | tổng hợp 7 CTDL phổ biến


Xem lại 3 bài viết về CTDL trên website: 

Cấu trúc dữ liệu và thuật toán | Mảng (Array) và Linked List

Cấu trúc dữ liệu và thuật toán | Ngăn xếp (Stack)

Cấu trúc dữ liệu và thuật toán | Hàng đợi (Queue)

Cấu trúc dữ liệu là cách tổ chức và lưu trữ dữ liệu trong máy tính để chúng ta có thể thực hiện các hoạt động dựa trên dữ liệu được lưu trữ một cách hiệu quả hơn. Với sinh viên CNTT hay là các bạn đã ra trường đi làm, các lập trình viên lâu năm thì CTDL là hành trang không thể thiếu, và CTDL cũng là các câu hỏi được các nhà tuyển dụng thường xuyên sử dụng để hỏi các ứng viên. Trên website cũng đã có một bài viết tổng hợp các câu hỏi phỏng vấn về CTDL các bạn có thể xem lại TẠI ĐÂY.

7 CTDL phổ biến được đề cập tới trong bài viết bao gồm: 

- Mảng (Array)

- Danh sách liên kết ( Linked list)

- Ngăn xếp ( Stack)

- Hàng đợi ( Queue)

- Cây ( Tree)

- Đồ thị ( Graph)

- Bảng băm ( Hash table)

1. Mảng ( Array)

Một mảng ( Array) là một cấu trúc dữ liệu với kích thước cố định, lưu trữ các phần tử cùng kiểu dữ liệu. Nó có thể là một mảng số nguyên, mảng số thực, mảng chuỗi hay một mảng của mảng. Mảng được đánh chỉ mục, được lưu ở các ô nhớ liên tiếp nhau cho phép ta có thể truy cập ngẫu nhiên vào mảng một cách dễ dàng, nhanh chóng.


2. Danh sách liên kết ( Linked List)

Danh sách liên kết là một cấu trúc tuần tự bao gồm một chuỗi các phần tử theo thứ tự tuyến tính được liên kết với nhau. Việc truy cập vào các phần tử trong danh sách liên kết phải là tuần tự, không thể thực hiện truy cập ngẫu nhiên.

- Các phần tử trong danh sách liên kết được gọi là các node

- Mỗi node chứa giá trị và một con trỏ trỏ tới node kế tiếp

- Có một con trỏ head trỏ tới phần tử đầu tiên của danh sách liên kết


3. Ngăn xếp ( Stack)

Là một CTDL hoạt động theo nguyên tắc LIFO ( Last In First Out - phần tử đưa vào sau cùng sẽ được truy cập đầu tiên), CTDL này được thấy thường xuyên trong ngôn ngữ lập trình và ứng dụng của nó đem lại cũng là rất lớn.

Có 2 hoạt động cơ bản được thực hiện trên 1 ngăn xếp đó là: 

- Push: Thêm một phần tử vào đỉnh của ngăn xếp

- Pop: Xóa một phần tử khỏi đỉnh của ngăn xếp

Tùy vào nhu cầu mỗi bài toán chúng ta có thể thêm các hàm phù hợp để thuận tiện hơn khi sử dụng ngăn xếp, ví dụ như xem phần tử ở đỉnh mà không xóa, kiểm tra ngăn xếp rỗng,...


4. Hàng đợi ( Queue)

Là một CTDL hoạt động theo nguyên tắc FIFO ( First In First Out - phần tử được đặt ở đầu sẽ được truy cập đầu tiên), có 2 hoạt động cơ bản được thực hiện trên một hàng đợi đó là:  

- enqueue: thêm một phần tử vào phía cuối hàng đợi

- dequeue: xóa một phần tử ở phía đầu hàng đợi

Tùy vào nhu cầu mỗi bài toán chúng ta có thể thêm các hàm phù hợp để thuận tiện hơn khi sử dụng hàng đợi tương tự như ngăn xếp. Ngoài ra còn có rất nhiều biến thể của hàng đợi để phù hợp hơn với một số bài toán đặc thù như hàng đợi ưu tiên, hàng đợi 2 đầu,...

5. Cây ( Tree)

Cây là một cấu trúc dữ liệu có phân cấp, trong đó dữ liệu được tổ chức theo thứ bậc và được liên kết với nhau khi lưu trữ. Ứng dụng của cây là rất lớn mà bình thường chúng ta sẽ thấy được ở một số khái niệm như cây đơn vị, cây thư mục,...

Có rất nhiều loại cây đã ra đời để giải quyết các bài toán từ dễ tới khó, khắc phục nhược điểm của cây trước như: cây tìm kiếm nhị phân, B-Tree, Splay Tree, Cây đỏ đen,...


6. Đồ thị ( Graph)

Đồ thị là một tập hợp hữu hạn đỉnh ( nút) và đường đi giữa các đỉnh này. Có nhiều khái niệm liên quan tới đồ thị như bậc của đồ thị, kích thước đồ thị,... 2 đỉnh được gọi là liền kề nếu chúng được nối với nhau bởi 1 đường.

Cây cũng là một loại đồ thị và là đồ thị liên thông, không có chu trình. Nhưng vì cây đặc biệt và ứng dụng lớn vì thế chúng thường được nhắc riêng khi nói về chủ đề đồ thị.

Có 2 loại đồ thị: 

- Đồ thị có hướng: tất cả đường đi đều được đánh dấu chiều giữa điểm đầu và điểm cuối

- Đồ thị vô hướng: tất cả đường đi trên nó đều không quy định chiều


7. Bảng băm ( Hash table)

Bảng băm cũng là một loại CTDL khá phổ biến và đặc biệt, nó lưu trữ các giá trị mà mỗi giá trị có một khóa ( key) được liên kết với nó. Bảng băm hỗ trợ tìm kiếm hiệu quả nếu ta biết được khóa của giá trị cần tìm. 



10/01/2023

Những gì sắp tới mình sẽ viết và chia sẻ trên Blog? Xa hơn việc chỉ chia sẻ tài liệu | Sharing


Chắc nhiều bạn biết tới https://www.tailieubkhn.com/ qua những bài viết về tài liệu học tập, chia sẻ một ít source code các môn học như thuật toán ứng dụng, kỹ thuật lập trình,... Một số các chia sẻ của mình về môn học, trải nghiệm khi đi học hay là các kiến thức thú vị xung quanh. Nhưng mà tài liệu thì cũng có hạn và chắc là cũng tới lúc phải hết thôi, các bài viết về tài liệu các môn học mình sẽ CẬP NHẬT trực tiếp vào các bài viết đấy khi có những tài liệu mới và phù hợp với môn học, các bạn hãy cứ theo dõi các bài viết để cập nhật thêm những thông tin mới nhất mà mình update.


Các bài viết gần đây của website các bạn đang thấy là nó đi vào một số hướng hẹp hơn, ví dụ như là chỉ một chủ đề nhỏ thôi Pull down refresh và Pull up loading, đây chỉ là một câu hỏi trong môn phát triển ứng dụng đa nền tảng hay là việc cài đặt các CTDL ở 3 bài viết trước bài viết này cũng chỉ là 3 bài tập nhỏ trong môn CTDL&TT mà một số thầy cô yêu cầu... Và đây cũng là hướng đi sắp tới của Blog, mình sẽ đi sâu hơn nữa vào các vấn đề cụ thể, ngoài ra mình cũng sẽ chia sẻ nhiêu hơn về cuộc sống đi làm và cuộc sống đi học là trải nghiệm của chính bản thân mình.

Một điều nhỏ nhoi muốn gửi gắm tới mọi người, Blog của mình có đặt quảng cáo và mình đã cố gắng chèn những quảng cáo vào vị trí thích hợp nhất để không ảnh hưởng gì tới mọi người khi truy cập website và không bao giờ dùng những quảng cáo cả trang khi chuyển trang gây khó chịu cho các đọc giả. Mong rằng những quảng cáo mình đặt trên website không gây ảnh hưởng tới trải nghiệm của các bạn, nếu có thể các bạn có thể click vào các banner quảng cáo để mình có thêm kinh phí để gia hạn domain, một cốc cafe,... Rất cảm ơn các bạn  thời gian qua đã ủng hộ Blog của mình.

Tác giả: trannguyenhan

8/31/2023

Cấu trúc dữ liệu và thuật toán | Hàng đợi (Queue)


1. Cấu trúc dữ liệu hàng đợi và ứng dụng

Hàng đợi là một dạng CTDL mà ở đó thao tác chèn vào sẽ được diễn ra ở một đầu, thường gọi là phía sau hay cuối (back or rear), trong khi phép toán xóa chỉ được thực hiện ở phía còn lại, gọi là phía trước hay đầu (front or head).

Nguyên tắc của hàng đợi: Vào trước ra trước, First-In First-Oout (FIFO)


Giống với ngăn xếp, hàng đợi cũng có 2 cách cài đặt cơ bản là dùng mảng và con trỏ.

Hàng đợi cũng có rất nhiều ứng dụng trong thực tế, ví dụ như là:

- Trong hệ điều hành: hàng đợi xử lý sự kiện, quản lý tiến trình, xử lý các câu lệnh. CPU không thể chạy tất cả các task cùng lúc nên các task sẽ được sắp xếp theo thứ tự ưu tiên lần lượt.

- Web server: một trang web cần phải xử lý vài nghìn files của người dùng nhưng khả năng của trang web chỉ xử lý được 100 files cùng một lúc, lúc này chúng ta cần một hàng đợi để đưa các request vào hàng đợi để chờ xử lý.

- Ứng dụng khi in hoặc upload nhiều ảnh cùng lúc

- Lưu vết trong quá trình tìm kiếm, quay lui, vét cạn,...

- Duyệt đồ thị

2. Cài đặt ngăn xếp sử dụng mảng

Khai báo một struct Queue và viết các hàm tương ứng với các phép toán trên hàng đợi:

- isFull(): kiểm tra hàng đợi đã đầy chưa

- enqueue(): thêm phần từ vào cuối hàng đợi

- dequeue(): lấy phần tử ra khỏi đầu hàng đợi

- getFront(): xem phần tử đầu hàng đợi

- getRear(): xem phần tử ở cuối hàng đợi

Tùy thuộc vào từng bài toán, khi cần thêm những chức năng cụ thể nào cho hàng đợi thì chúng ta có thể viết thêm các hàng tương ứng để công việc được thực hiện một cách dễ dàng hơn.

#define INT_MIN -2147483648

struct Queue {
    int front, rear, size;
    unsigned capacity;
    int* array;
};

struct Queue* createQueue(unsigned capacity){
    struct Queue* queue = (struct Queue*) malloc(sizeof(struct Queue));
    queue->capacity = capacity;
    queue->front = queue->size = 0;
    queue->rear = -1;
    queue->array = (int*) malloc(queue->capacity * sizeof(int));
    return queue;
}

// Kiem tra queue day
int isFull(struct Queue* queue){
    return (queue->size == queue->capacity);
}

// Kiem tra queue rong
int isEmpty(struct Queue* queue){
    return (queue->size == 0);
}

// Them phan tu vao queue
void enqueue(struct Queue* queue, int item){
    if(isFull(queue)){
        return;
    }

    queue->rear = (queue->rear + 1);
    queue->array[queue->rear] = item;
    queue->size = queue->size + 1;
    printf("%d enqueued to queue\n", item);
}

int dequeue(struct Queue* queue){
    if(isEmpty(queue)){
        return INT_MIN;
    }

    int item = queue->array[queue->front];
    queue->front = (queue->front + 1);
    queue->size = queue->size - 1;
    return item;
}

int getFront(struct Queue* queue){
    if(isEmpty(queue)){
        return INT_MIN;
    }

    return queue->array[queue->front];
}

int getRear(struct Queue* queue){
    if(isEmpty(queue)){
        return INT_MIN;
    }

    return queue->array[queue->rear];
}

int main(){
    struct Queue* queue = createQueue(10);
    enqueue(queue, 1);
    enqueue(queue, 2);
    printf("Top of queue is %d", getFront(queue));
    printf("Rear of queue is %d", getRear(queue));

}

3. Cài đặt ngăn xếp sử dụng con trỏ

Với con trỏ thì chúng ta cũng cài đặt tương tự các hàm so với sử dụng mảng.


#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
};

struct node *front = NULL, *rear = NULL;

void enqueue(int val)
{
    struct node *newNode = malloc(sizeof(struct node));
    newNode->data = val;
    newNode->next = NULL;

    if(front == NULL && rear == NULL){
        front = rear = newNode;
    } else {
        rear->next = newNode;
        rear = newNode;
    }
}

void dequeue()
{
    struct node *temp;

    if(front == NULL)
         printf("Queue is Empty\n");
    else
    {
        temp = front;
        front = front->next;

        if(front == NULL){
            rear = NULL;
        }

       free(temp);
    }

}

void printList()
{
    struct node *temp = front;

    while(temp)
    {
        printf("%d->",temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

int main()
{
    enqueue(10);
    enqueue(20);
    enqueue(30);
    printf("Queue :");
    printList();
    dequeue();
    printf("After dequeue the new Queue :");
    printList();
    dequeue();
    printf("After dequeue the new Queue :");
    printList();

    return 0;
}

Xem đầy đủ code tại repo github: https://github.com/piandhust/data-structures/blob/main/queue.chttps://github.com/piandhust/data-structures/blob/main/queue_pointer.c

8/27/2023

Cấu trúc dữ liệu và thuật toán | Ngăn xếp (Stack)


1. Cấu trúc dữ liệu ngăn xếp và ứng dụng

Ngăp xếp là một dạng cấu trúc dữ liệu mà ở đó các thao tác với CTDL này chỉ diễn ra ở một đầu, được gọi là đỉnh của ngăn xếp (top). Hai thao tác phổ biến đối với ngăn xếp là đẩy vào (push) và lấy ra (pop), cả hai thao tác này đều tác động vào đỉnh của ngăn xếp.

Nguyên tắc của ngăn xếp: Vào trước ra sao, First-In Last-Out (FILO)

Có 2 cách cài đặt ngăn xếp là sử dụng mảng hoặc sử dụng con trỏ.

Mặc dù nhìn bề ngoài ngăn xếp có vẻ trông đơn giản nhưng nó lại có ứng dụng rất lớn trong thực tế. Ứng dụng trong sử dụng điều hướng các màn hình của điện thoại, ví dụ chúng ta đang ở một màn hình Settings của Facebook, Khi bấm vào General sẽ bị chuyển hướng sang một màn khác, vậy thì làm sao để khi bấm quay lại có thể quay lại đúng màn Settings một cách nhanh nhất? Đó chính là vứt nó vào ngăn xếp, mỗi khi bấm quay lại chỉ cần lấy nó ra từ đỉnh của ngăn xếp là được. Một số các ứng dụng khác của ngăn xếp như là lịch sử trình duyệt, hay là các cơ chế Undo (Redo) trong các trình soạn thảo văn bản. 

Ngăn xếp còn rất quan trọng trong việc giải một số bài toán như: 

- Tính giá trị biểu thức trung tố, hậu tố

- Bài toán cộng hai số lớn

- Bài toán kiểm tra ngoặc đúng 

- Bài toán đảo ngược xâu

2. Cài đặt ngăn xếp sử dụng mảng

Khai báo một struct Stack và viết các hàm tương ứng với các phép toán trên ngăn xếp: 

- isFull(stack): kiểm tra xem ngăn xếp đã đầy chưa 

- isEmpty(stack): kiểm tra ngăn xếp có rỗng không

- push(stack, item):  thêm phần tử vào ngăn xếp

- pop(stack): lấy phần tử ra khỏi ngăn xếp

- getTop(stack): xem phần tử ở đầu ngăn xếp và không xóa phần tử đó khỏi ngăn xếp

Tùy thuộc vào từng bài toán, khi cần thêm những chức năng cụ thể nào cho ngăn xếp thì chúng ta có thể viết thêm các hàm tương ứng để công việc được thực hiện một cách dễ dàng hơn.


#define INT_MIN -2147483648

struct Stack {
    int top;
    unsigned capacity;
    int* array;
};


// Khoi tao ngan xep
struct Stack* createStack(unsigned capacity){
    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (int*) malloc(stack->capacity * sizeof(int));
}

// Kiem tra xem ngan xep day chua
int isFull(struct Stack* stack){
    return stack->top == stack->capacity - 1;
}

// Kiem tra ngan xep rong khong
int isEmpty(struct Stack* stack){
    return stack->top == -1;
}

// Them phan tu vao stack
void push(struct Stack* stack, int item){
    if(isFull(stack)){
        return;
    }

    stack->array[++stack->top] = item;
    printf("%d push to stack\n", item);
}

int pop(struct Stack* stack){
    if(isEmpty(stack)){
        return INT_MIN;
    }

    return stack->array[stack->top--];
}

int getTop(struct Stack* stack){
    if(isEmpty(stack)){
        return INT_MIN;
    }

    return stack->array[stack->top];
}

int main(){
    struct Stack* stack = createStack(10);
    push(stack, 2);
    push(stack, 3);
    printf("Top of value in stack: %d", getTop(stack));

}

3. Cài đặt ngăn xếp sử dụng con trỏ

Với con trỏ thì chúng ta cũng cài đặt tương tự các hàm so với cài đặt ngăn xếp sử dụng mảng.


#include <stdio.h>

struct Node {
    int data;
    struct Node* next;
};

struct Node* newNode(int val){
    struct Node* newN = (struct Node*) malloc(sizeof(struct Node));
    newN->data = val;
    newN->next = NULL;

    return newN;
}

void push(struct Node* head, int val){
    struct Node* newN = newNode(val);
    if(head == NULL){
        newN->next = NULL;
    } else {
        newN->next = head;
    }

    head = newN;

    printf("Top of stack is %d\n", head->data);
    printf("----------------\n");
}

int pop(struct Node* head){
    if(head == NULL){
        printf("Stack is empty\n");
        return;
    }

    int item = head->data;
    struct Node* tmp = head;
    head = head->next;
    free(tmp);

    printf("Top of stack is %d\n", head->data);
    return item;
}

int isEmpty(struct Node* head){
    return head == NULL;
}

int getTop(struct Node* head){
    if(head == NULL){
        return NULL;
    }

    return head->data;
}

int main(){
    struct Node* head = NULL;
    push(head, 10);
    pop(head);

    //printf("Top stack: %d", getTop(head));
}

Xem đầy đủ code tại repo github: https://github.com/piandhust/data-structures/blob/main/stack.chttps://github.com/piandhust/data-structures/blob/main/stack_pointer.c

8/19/2023

Cấu trúc dữ liệu và thuật toán | Mảng (Array) và Linked List


1. "Cấu trúc dữ liệu"

Cấu trúc dữ liệu là một họ các biến có thể có kiểu dữ liệu khác nhau, được liên kết với nhau theo một cách thức được quy định trước nào đó. Ví dụ như mảng là một dãy các ô có cùng kiểu dữ liệu xác định. 

Một số cấu trúc dữ liệu phổ biến như là: 

- Mảng

- Danh sách

- Đồ thị

- Ngăn xếp

- Hàng đợi

- Cây

Với các bài viết về cấu trúc dữ liệu này, mình sẽ đề cập tới khái niệm chính và cách cài đặt từng loại cấu trúc dữ liệu.

2. Cấu trúc dữ liệu mảng 

Dữ liệu dạng mảng là một dạng dữ liệu vô cùng phổ biến mà chúng ta có thể gặp thường xuyên trong mọi ngôn ngữ lập trình và mọi dự án.

Thông thường mảng thường được lưu trữ trên một dãy liên tiếp các ô nhớ trên bộ nhớ, vì vậy việc truy cập các phần tử trong mảng là cực kỳ nhanh chóng, nhưng lại bất lợi trong việc phân bổ thêm ô nhớ cho mảng.

Mảng thì rất quen thuộc rồi, các ngôn ngữ lập trình đều hỗ trợ hầu như mọi phép toán liên quan tới mảng, nên phần cài đặt mảng mình sẽ không đề cập tới trong phần này.

3. Cấu trúc dữ liệu danh sách liên kết đơn 

Danh sách liên kết đơn (hay một số tài liệu đề cập là danh sách móc nối đơn) là danh sách các phần tử mà mỗi phần tử sẽ chứa giá trị và một con trỏ chứa trỏ tới ô kế tiếp của danh sách.



Danh sách liên kết sẽ khắc phục được một số nhược điểm của việc sử dụng mảng đó là: 

- Bổ sung một phần tử tốn kém thời gian

- Lãng phí khoảng bộ nhớ trống khai báo ban đầu không dùng đến

- Phải duy trì một khoảng không gian lưu trữ liên tục trong bộ nhớ

3.1 Cài đặt danh sách liên kết đơn

Các ví dụ về cài đặt cấu trúc dữ liệu trong các bài viết mình sẽ sử dụng ngôn ngữ lập trình C.

Khai báo một struct node, và viết 5 hàm tương ứng với 5 phép toán trên danh sách liên kết: 

- isEmpty(): kiểm tra danh sách liên kết rỗng 

- print_list(): in danh sách phần tử 

- push(item): thêm phần tử vào đầu danh sách liên kết

- pop(): loại bỏ phần tử cuối danh sách

- insert_by_index(inx, item): chèn một phần tử vào vị trí bất kỳ trong danh sách liên kết

Tùy thuộc vào từng bài toán, khi cần thêm những chức năng cụ thể nào cho danh sách liên kết thì chúng ta có thể viết thêm các hàm tương ứng để công việc được thực hiện một cách dễ dàng hơn.

#include<stdio.h>
#define INT_MIN -2147483648

struct node {
    int data;
    struct node *next;
};

struct node* head = NULL;

int isEmpty(){
    return head == NULL;
}

void print_list(){
    struct node *current = head;

    while(current != NULL){
        printf("%d\n", current->data);
        current = current->next;
    }
}

// push to front list
void push(int item){
    struct node* newN = (struct node*) malloc(sizeof(struct node));
    newN->data = item;
    newN->next = head;

    head = newN;
}

// pop last
void pop(){
    struct node* it = head;

    if(it->next == NULL){
        head = NULL;
        free(it);
        return;
    }

    while(it->next->next != NULL){
        it = it->next;
    }

    struct node* lastN = it->next;
    it->next = NULL;
    free(lastN);
}

void insert_by_index(int item, int inx){
    if(inx == 0){
        push(item);
        return;
    }

    struct node* it = head;
    int cnt = 1;

    while(cnt < inx){
        it = it->next;
        cnt++;
    }

    struct node* prev = it;
    struct node* next = it->next;

    // create new node
    struct node* newN = (struct node*) malloc(sizeof(struct node));
    newN->data = item;


}

3.2 Kiểm tra danh sách liên kết đơn vừa cài đặt

Chúng ta kiểm tra nhanh về cấu trúc dữ liệu vừa cài đặt có đúng không bằng cách sử dụng các hàm vừa cài đặt để thao tác với cấu trúc dữ liệu và kiểm tra dữ liệu sau khi sử dụng các hàm đã đúng chưa bằng cách in ra (sử dụng hàm print_list()).

int main(){
    // data example
    push(1);
    push(2);
    push(4);
    pop();
    pop();
    push(4);

    print_list();
}

Xem đẩy đủ code tại repo github: https://github.com/piandhust/data-structures/blob/main/list.c