Bài đăng

Đang hiển thị bài đăng từ Tháng 11, 2018

Stack và Heap là gì? Phần 1: Stack

Hình ảnh
Stack và Heap là hai vùng nhớ cơ bản trong một chương trình máy tính. Khi lập trình, chúng ta thường làm việc với chúng mà không hề hay biết. Hiểu được ưu nhược của từng vùng nhớ sẽ giúp ta kiểm soát chương trình hiệu quả hơn. Khi máy tính chạy một chương trình, chương trình đó sẽ được giao cho một vùng nhỏ trên RAM, ta gọi đó là vùng nhớ . Mỗi chương trình đều có 2 vùng nhớ mà ta cần quan tâm hơn cả đó là Stack và Heap. Stack Bạn có thể tưởng tượng Stack như một chồng đĩa. Khi ta muốn lấy một chiếc đĩa, ta chỉ cần lấy chiếc ở trên cùng và khi bắt đầu xếp chồng đĩa ấy, ta sẽ bắt đầu từ dưới lên. Ta gọi thứ tự xếp đĩa này là LIFO: L ast I n - F irst O ut. Chiếc đĩa nào được đặt vào cuối cùng sẽ được lấy ra đầu tiên. Ngược lại, chiếc đĩa được đặt vào đầu tiên sẽ được lấy ra cuối cùng Ta gọi LIFO là một kiểu cấu trúc dữ liệu. Những dữ liệu của ta ở vùng nhớ Stack cũng được quản lý một cách tương tự. Bây giờ có thể bạn vẫn chưa hình dung được và để mình có thể nói sâu h

Thuật toán tính lũy thừa nhanh. Giải thích một cách đơn giản

Hình ảnh
Khi được yêu cầu viết một hàm tính lũy thừa. Bạn sẽ làm như thế nào? Đáp án khá đơn giản phải không, chỉ với một vòng lặp for  thì có thể giải quyết tất cả. Nhưng như vậy liệu đã tối ưu chưa? Gần đây mình có xem qua một vài chương của cuốn Nhập môn lập trình  và tìm thấy một vài điều thú vị. Trong đó, có phương pháp tính lũy thừa nhanh mà mình muốn chia sẻ lại. Cuốn sách Nhập môn Lập trình Phương pháp thông thường Với đề bài trên, cách làm dễ nhất là: Để dễ dàng thử độ hiệu quả của thuật toán, mình dùng kiểu dữ liệu int64_t  tức kiểu số nguyên sử dụng 64 bit ( 8 byte ) để chứa dữ liệu và kiểu long tức kiểu số nguyên sử dụng 32 bit ( 4 byte ) để chứa dữ liệu. Nếu các bạn đã biết về phân tích độ phức tạp của thuật toán thì độ phức tạp của thuật toán trên là O(n) , có nghĩa là nếu n càng lớn thì thời gian tính toán xong của ta càng lâu. Nếu các bạn cho hàm trên chạy với n = 1 000 000 000  (1 tỷ cho bạn nào lười đếm). Máy mình chạy mất xấp xỉ 8  giây. Đây là một thời g

Tham trị, Tham chiếu và Con trỏ

Hình ảnh
Trong lập trình, tham trị, tham chiếu và con trỏ là ba phương thức khác nhau để truyền dữ liệu trong toàn bộ chương trình. Nắm được chắc chắn những khái niệm này và sử dụng một cách thuần thục sẽ là bàn đạp vững chắc đến trên con đường trở thành lập trình viên giỏi. Ở bài viết này, mình sẽ giải thích ba khái niệm này một cách dễ hiểu nhất kèm theo những ví dụ cụ thể. Mình sẽ dùng C++ cho những ví dụ minh họa trong bài Giới thiệu Khi sử dụng hàm (function) trong lập trình. Ta có quyền lựa chọn có truyền tham số cho hàm hay không. Ngoài việc xác định bao những tham số phù hợp cho hàm, một việc quan trọng cần phải cân nhắc nữa đó là phương pháp truyền tham số đó. Chúng ta có ba phương pháp:  Tham trị Tham chiếu Con trỏ Tham trị Tham trị là cách được sử dụng phổ biến trong lập trình. Tham trị chỉ đơn giản là sao chép giá trị được đưa vào. Như bạn có thể thấy trong hình minh họa, hai biến "Tham số truyền vào" và "Biến số trong hàm" tuy có