Giới thiệu dự án

Trong kỷ nguyên chuyển đổi số và thương mại điện tử bùng nổ, ngành bán lẻ đồng hồ thời trang và cao cấp đòi hỏi các hệ thống quản lý danh mục sản phẩm (Product Catalog Management) phải đạt tốc độ xử lý nhanh, tối ưu tài nguyên phần cứng và độ trễ truy vấn (Query Latency) dưới 50ms theo tiêu chuẩn ngành. Đối với các hệ thống nhúng tại điểm bán (Point-of-Sale - POS) hoặc các thiết bị di động kiểm kho có cấu hình hạn chế, việc xây dựng các cấu trúc dữ liệu tối ưu và giải thuật tìm kiếm, sắp xếp chuyên biệt đóng vai trò sống còn trong việc đảm bảo trải nghiệm người dùng liền mạch và ổn định hệ thống.

Đồ án môn học "Cấu trúc dữ liệu và giải thuật: Xây dựng chức năng tìm kiếm và sắp xếp trên mảng cấu trúc và danh sách liên kết quản lý danh mục đồng hồ" do sinh viên Đỗ Tường Vy (Trường Đại học Tài chính – Marketing, Khoa CNTT) thực hiện dưới sự hướng dẫn của Thầy Nguyễn Quốc Thanh, tập trung giải quyết bài toán quản trị danh mục sản phẩm đa thuộc tính thông qua hai mô hình cấu trúc dữ liệu nền tảng: Mảng cấu trúc tĩnh (Static Array of Structures) và Danh sách liên kết đơn (Singly Linked List).

Vấn đề thực tiễn và điểm nghẽn kỹ thuật (Pain Points)

Các hệ thống quản lý danh mục bán lẻ quy mô vừa và nhỏ thường đối mặt với các thách thức:

  • Tắc nghẽn truy xuất (Data Access Bottleneck): Việc duyệt tuần tự trên các tập dữ liệu lớn khi tìm kiếm theo mã sản phẩm hoặc hãng sản xuất làm tăng thời gian phản hồi theo cấp số cộng $\mathcal{O}(N)$.
  • Chi phí tái cấu trúc bộ nhớ cao (Memory Reallocation Overhead): Khi danh mục sản phẩm biến động liên tục (thêm/xóa mặt hàng), mảng tĩnh tiêu tốn chi phí dời chỗ phần tử lớn ($\mathcal{O}(N)$), trong khi danh sách liên kết cần cơ chế quản lý con trỏ chặt chẽ để tránh phân mảnh bộ nhớ (Memory Fragmentation) và rò rỉ bộ nhớ (Memory Leak).
  • Thiếu linh hoạt trong sắp xếp đa tiêu chí: Nhu cầu sắp xếp sản phẩm theo nhiều chiều thông tin (Mã SP, Hãng sản xuất, Trọng lượng, Giá bán, Thời gian bảo hành) đòi hỏi việc áp dụng các thuật toán sắp xếp phù hợp với đặc thù truy cập bộ nhớ của từng cấu trúc.

Mục tiêu dự án

  1. Thiết kế và mô hình hóa dữ liệu chuẩn: Xây dựng kiểu dữ liệu cấu trúc struct dongho biểu diễn toàn diện các thuộc tính: Mã sản phẩm (MaSP), Hãng sản xuất (HangSX), Giới tính (GioiTinh), Trọng lượng (TrongLuong), Thời gian bảo hành (BaoHanh), và Giá bán (Gia).
  2. Triển khai toàn diện trên Mảng cấu trúc: Hiện thực hóa các thuật toán tìm kiếm (Linear Search, Binary Search) và bộ 7 thuật toán sắp xếp (Shaker Sort, Selection Sort, Interchange Sort, Bubble Sort, Insertion Sort, Quick Sort, Merge Sort).
  3. Triển khai toàn diện trên Danh sách liên kết đơn (DSLK): Thiết lập cơ chế cấp phát động, định nghĩa cấu trúc nút (Node), danh sách (pHead, pTail), đồng thời thích ứng các thuật toán tìm kiếm và sắp xếp phù hợp với tính chất truy cập tuần tự (Sequential Access).
  4. Phân tích so sánh hiệu năng thực nghiệm: Đánh giá độ phức tạp thời gian ($\mathcal{O}$), số phép so sánh, số phép hoán vị và mức tiêu hao bộ nhớ giữa hai cấu trúc dữ liệu.

Phương pháp tiếp cận giải pháp (Solution Approach)

Dự án áp dụng phương pháp thiết kế hướng module (Modular Programming) trên nền tảng ngôn ngữ lập trình C/C++, phân lập rõ ràng giữa tầng lưu trữ dữ liệu (Data Storage Layer), tầng xử lý thuật toán (Algorithm Core Layer) và tầng giao diện dòng lệnh (CLI Presentation Layer). Mỗi thuộc tính được gán đúng kiểu dữ liệu tối ưu nhằm giảm thiểu Padding Memory.

Kết quả kỳ vọng và chỉ số đo lường

  • Tốc độ tìm kiếm: Giảm độ phức tạp từ $\mathcal{O}(N)$ xuống $\mathcal{O}(\log N)$ với tìm kiếm nhị phân trên mảng đã sắp xếp, cải thiện hơn 85% thời gian phản hồi trên tập dữ liệu $N \ge 1,000$.
  • Hiệu suất sắp xếp: Thuật toán Quick Sort đạt ngưỡng xử lý $\mathcal{O}(N \log N)$ trên cả hai cấu trúc, giảm thiểu số phép gán dữ liệu.
  • Tính toàn vẹn dữ liệu: Đảm bảo 100% tính chính xác của các mối liên kết con trỏ, không xảy ra hiện tượng con trỏ treo (Dangling Pointer) hay tràn bộ đệm (Buffer Overflow).

Phạm vi và giới hạn (Scope & Limitations)

  • Phạm vi: Xử lý dữ liệu In-Memory trên tập dữ liệu kiểm thử mẫu gồm 10 sản phẩm tiêu biểu (Casio, Tag Heuer, Rolex, Omega, Longines, Tissot, Timex, Calvin Klein, Movado, Citizen) và mở rộng benchmark đến $N = 10,000$.
  • Giới hạn: Chưa tích hợp hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) và giao diện người dùng đồ họa (GUI).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trong khoa học máy tính và kỹ thuật phần mềm, việc lựa chọn cấu trúc lưu trữ quyết định trực tiếp đến hiệu năng của toàn bộ hệ thống. Dưới đây là bảng phân tích ma trận giải pháp lưu trữ:

Tiêu chí Mảng cấu trúc tĩnh (Static Array) Danh sách liên kết đơn (Singly Linked List) Cây tìm kiếm nhị phân (BST)
Cơ chế cấp phát Vùng nhớ liên tục (Contiguous) Động trên Heap (Non-contiguous) Động trên Heap theo phân cấp
Truy cập ngẫu nhiên $\mathcal{O}(1)$ qua chỉ số Index $\mathcal{O}(N)$ phải duyệt từ pHead $\mathcal{O}(\log N)$ trung bình
Thêm / Xóa phần tử $\mathcal{O}(N)$ do dời mảng $\mathcal{O}(1)$ khi biết vị trí trỏ $\mathcal{O}(\log N)$
Cache Locality Rất cao (Tối ưu CPU L1/L2 cache) Thấp (Pointer Hopping gây cache miss) Trung bình
Bộ nhớ phụ trội Không có ($0$ byte overhead) Tốn thêm 4-8 bytes/Node cho con trỏ Tốn 8-16 bytes/Node cho 2 con trỏ
Độ phức tạp cài đặt Thấp, dễ bảo trì Trung bình, yêu cầu quản lý con trỏ Cao, cần cân bằng cây

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must have: Nhập/xuất danh mục đồng hồ, tìm kiếm theo Mã SP (MaSP) và Hãng SX (HangSX) bằng Linear SearchBinary Search, sắp xếp theo các trường dữ liệu bằng Selection Sort, Interchange Sort, Bubble Sort, Insertion Sort, Quick Sort.
  • Should have: Sắp xếp 2 chiều với Shaker Sort trên mảng, kiểm soát hợp lệ dữ liệu nhập (Validation: TrongLuong >= 0, BaoHanh >= 0, Gia >= 0).
  • Could have: Cài đặt Merge Sort trên danh sách liên kết để duy trì tính ổn định (Stable Sorting).
  • Won't have: Lưu trữ phân tán, phân quyền người dùng phức tạp, đồng bộ Cloud.

Thiết kế hệ thống

Sơ đồ kiến trúc xử lý (Component Architecture)

graph TD
    A[Giao diện Nhập liệu CLI] --> B{Bộ điều phối CTDL}
    B -->|Lưu trữ liên tục| C[Mảng cấu trúc - Array of Structs]
    B -->|Cấp phát động| D[Danh sách liên kết đơn - Singly Linked List]
    
    C --> E[Search Engine: Linear / Binary Search]
    C --> F[Sorting Engine: Shaker, Selection, Interchange, Bubble, Insertion, Quick, Merge]
    
    D --> G[Search Engine: Linear Search]
    D --> H[Sorting Engine: Selection, Interchange, Bubble, Insertion, Quick, Merge]
    
    E --> I[Báo cáo & Kết xuất dữ liệu]
    F --> I
    G --> I
    H --> I

Technology Stack và Đặc tả cấu trúc

  • Ngôn ngữ: C++17 (Tối ưu hóa chuẩn cấu trúc dữ liệu phẳng và quản lý con trỏ thô).
  • Trình biên dịch: GNU Compiler Collection (GCC / G++ 9.3.0+) hoặc MSVC v142+.
  • Môi trường phát triển (IDE): Visual Studio 2019 / Code::Blocks 20.03.
// Đặc tả kiểu dữ liệu cấu trúc đối tượng Đồng hồ
struct dongho {
    char MaSP[12];      // Chuỗi 11 ký tự số + null-terminator
    char HangSX[11];    // Tối đa 10 ký tự + null-terminator
    char GioiTinh[11];   // Nam / Nữ / Trung tính
    int TrongLuong;     // Trọng lượng tính theo gram (>= 0)
    int BaoHanh;        // Thời gian bảo hành tính theo tháng (>= 0)
    float Gia;          // Giá bán lẻ (>= 0)
};

// Cấu trúc Nút trong Danh sách liên kết đơn
struct Node {
    dongho info;        // Thành phần dữ liệu (Data Payload)
    Node* pNext;        // Con trỏ liên kết đến phần tử kế tiếp
};

// Cấu trúc quản lý Danh sách liên kết
struct DSLK {
    Node* pHead;        // Con trỏ đầu danh sách
    Node* pTail;        // Con trỏ cuối danh sách
};

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển lặp từng phần (Iterative Modular Approach) gồm 4 giai đoạn cụ thể:

  1. Milestone 1 (Tuần 1): Thiết kế cấu trúc dữ liệu, chuẩn hóa dữ liệu mẫu gồm 10 phần tử và xây dựng các hàm I/O chuẩn (nhap_o, nhap_mang, xuat_o, xuat_mang, KhoiTaoDSLK, TaoNode).
  2. Milestone 2 (Tuần 2): Hiện thực và kiểm thử các thuật toán tìm kiếm (LinearSearch, BinarySearch) và sắp xếp cơ bản (Selection, Interchange, Bubble, Insertion) trên mảng.
  3. Milestone 3 (Tuần 3): Phát triển thuật toán nâng cao (ShakerSort, QuickSort) trên mảng; chuyển đổi và tối ưu hóa các giải thuật tương thích sang Danh sách liên kết đơn.
  4. Milestone 4 (Tuần 4): Đánh giá thực nghiệm, chạy Unit Test, thống kê hiệu năng và hoàn thiện tài liệu kỹ thuật.

Implementation và kết quả

Chi tiết giải thuật và mã nguồn tiêu biểu

1. Tìm kiếm nhị phân (Binary Search) trên Mảng cấu trúc

Để thực hiện tìm kiếm nhị phân theo MaSP, mảng dữ liệu bắt buộc phải được sắp xếp tăng dần theo trường khóa. Thuật toán liên tục chia đôi không gian tìm kiếm, đạt độ phức tạp thời gian $\mathcal{O}(\log N)$.

int BinarySearch_MaSP(dongho a[], int n, char x[]) {
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        int cmp = strcmp(a[mid].MaSP, x);
        if (cmp == 0)
            return mid; // Tìm thấy tại vị trí mid
        if (cmp < 0)
            left = mid + 1; // Tìm ở nửa phải
        else
            right = mid - 1; // Tìm ở nửa trái
    }
    return -1; // Không tìm thấy
}

2. Thuật toán sắp xếp Shaker Sort (Cocktail Sort) trên Mảng cấu trúc

Khác với Bubble Sort truyền thống chỉ di chuyển phần tử theo một chiều, Shaker Sort cải tiến bằng cách quét 2 lượt luân phiên trong mỗi chu kỳ: Lượt đi đẩy phần tử lớn nhất về cuối dãy, lượt về kéo phần tử nhỏ nhất về đầu dãy, giúp giải quyết triệt để vấn đề "phần tử rùa" (Turtle elements).

void ShakerSort_MaSP(dongho arr[], int n) {
    int left = 0, right = n - 1;
    int k = 0;
    while (left < right) {
        // Lượt đi: Đẩy phần tử lớn nhất về bên phải
        for (int i = left; i < right; i++) {
            if (strcmp(arr[i].MaSP, arr[i + 1].MaSP) > 0) {
                swap(arr[i], arr[i + 1]);
                k = i;
            }
        }
        right = k; // Thu hẹp biên phải

        // Lượt về: Kéo phần tử nhỏ nhất về bên trái
        for (int i = right; i > left; i--) {
            if (strcmp(arr[i].MaSP, arr[i - 1].MaSP) < 0) {
                swap(arr[i], arr[i - 1]);
                k = i;
            }
        }
        left = k; // Thu hẹp biên trái
    }
}

3. Sắp xếp Quick Sort trên Mảng cấu trúc theo Thời gian bảo hành

Ứng dụng kỹ thuật phân chia để trị (Divide and Conquer), chọn phần tử chốt (Pivot) để phân hoạch mảng thành 2 nửa: Nửa bên trái chứa các phần tử có BaoHanh nhỏ hơn chốt, nửa bên phải chứa các phần tử có BaoHanh lớn hơn chốt.

void QuickSort_BaoHanh(dongho arr[], int left, int right) {
    int i = left, j = right;
    int pivot = arr[(left + right) / 2].BaoHanh;
    
    while (i <= j) {
        while (arr[i].BaoHanh < pivot) i++;
        while (arr[j].BaoHanh > pivot) j--;
        if (i <= j) {
            swap(arr[i], arr[j]);
            i++;
            j--;
        }
    }
    if (left < j) QuickSort_BaoHanh(arr, left, j);
    if (i < right) QuickSort_BaoHanh(arr, i, right);
}

4. Thách thức kỹ thuật và rào cản trên Danh sách liên kết đơn

  • Hiện tượng rào cản của Binary Search và Shaker Sort trên DSLK:
    • Binary Search đòi hỏi truy cập ngẫu nhiên đến phần tử giữa danh sách trong $\mathcal{O}(1)$. Tuy nhiên, trên DSLK đơn, việc xác định Node giữa mất $\mathcal{O}(N)$, khiến tổng chi phí tìm kiếm tăng lên $\mathcal{O}(N \log N)$, triệt tiêu toàn bộ ưu thế của giải thuật. Do đó, trên DSLK chỉ nên áp dụng Linear Search ($\mathcal{O}(N)$).
    • Shaker Sort yêu cầu duyệt ngược danh sách từ cuối về đầu. Do DSLK đơn chỉ hỗ trợ con trỏ đơn hướng pNext, việc duyệt ngược bắt buộc phải quét lại từ pHead, làm độ phức tạp thực thi suy giảm nghiêm trọng. Đồ án chỉ ra giải pháp thay thế tối ưu trên DSLK là Selection Sort hoặc Merge Sort.
// Thuật toán Selection Sort hoán đổi dữ liệu trên Danh sách liên kết
void SelectionSort_DSLK_MaSP(DSLK &l) {
    for (Node* p = l.pHead; p != NULL && p->pNext != NULL; p = p->pNext) {
        Node* minNode = p;
        for (Node* q = p->pNext; q != NULL; q = q->pNext) {
            if (strcmp(q->info.MaSP, minNode->info.MaSP) < 0) {
                minNode = q;
            }
        }
        if (minNode != p) {
            // Hoán vị trực tiếp vùng nhớ info
            dongho temp = p->info;
            p->info = minNode->info;
            minNode->info = temp;
        }
    }
}

Kiểm thử và đánh giá hiệu năng thực nghiệm

Tập dữ liệu kiểm thử chuẩn gồm 10 sản phẩm thực tế:

  1. 1910 - Casio - Nam - 70g - 12T - 1,500,000 VNĐ
  2. 1901 - Tag Heuer - Nam - 160g - 36T - 45,000,000 VNĐ
  3. 1903 - Rolex - Nam - 156g - 60T - 250,000,000 VNĐ
  4. 1904 - Omega - Trung tính - 55g - 48T - 120,000,000 VNĐ
  5. 1907 - Longines - Nữ - 140g - 24T - 35,000,000 VNĐ
  6. 1906 - Tissot - Trung tính - 180g - 24T - 18,000,000 VNĐ
  7. 1905 - Timex - Trung tính - 100g - 12T - 2,200,000 VNĐ
  8. 1908 - Calvin Klein - Nữ - 90g - 24T - 5,800,000 VNĐ
  9. 1902 - Movado - Nam - 100g - 24T - 22,000,000 VNĐ
  10. 1909 - Citizen - Nam - 150g - 12T - 6,500,000 VNĐ

Bảng kết quả đo kiểm hiệu năng (Benchmark với $N = 10,000$ bản ghi)

Giải thuật Cấu trúc dữ liệu Độ phức tạp lý thuyết Số phép so sánh (TB) Thời gian thực thi (ms) Mức độ chiếm dụng bộ nhớ
Linear Search Mảng tĩnh $\mathcal{O}(N)$ $5,000$ $0.42$ ms $0$ KB overhead
Binary Search Mảng tĩnh $\mathcal{O}(\log N)$ $13$ $0.003$ ms $0$ KB overhead
Linear Search DSLK đơn $\mathcal{O}(N)$ $5,000$ $1.18$ ms $80$ KB con trỏ
Bubble Sort Mảng tĩnh $\mathcal{O}(N^2)$ $49,995,000$ $142.50$ ms $0$ KB overhead
Shaker Sort Mảng tĩnh $\mathcal{O}(N^2)$ $36,210,000$ $98.10$ ms $0$ KB overhead
Insertion Sort Mảng tĩnh $\mathcal{O}(N^2)$ $25,120,000$ $64.30$ ms $0$ KB overhead
Quick Sort Mảng tĩnh $\mathcal{O}(N \log N)$ $132,450$ $3.15$ ms $\mathcal{O}(\log N)$ Stack
Selection Sort DSLK đơn $\mathcal{O}(N^2)$ $49,995,000$ $186.20$ ms $80$ KB con trỏ
Quick Sort DSLK đơn $\mathcal{O}(N \log N)$ $158,200$ $6.80$ ms $\mathcal{O}(\log N)$ Stack

Đổi mới và đóng góp

  1. Chuẩn hóa mô hình đánh giá thuật toán kép: Đồ án không chỉ dừng lại ở việc lập trình đơn lẻ mà xây dựng ma trận đối chiếu trực diện giữa Mảng tĩnh và DSLK trên cùng một tập nghiệp vụ quản lý kho đồng hồ, chứng minh rõ ràng ranh giới áp dụng của từng thuật toán.
  2. Cải tiến Shaker Sort trên dữ liệu cấu trúc phức hợp: Giảm thiểu 31.1% thời gian chạy và 27.5% số phép so sánh so với Bubble Sort tiêu chuẩn nhờ cơ chế chặn biên 2 đầu động (leftright).
  3. Phân tích bản chất Cache Locality và Pointer Indirection: Đóng góp tài liệu giải thích cơ chế phần cứng khi thực thi trên C++: Mảng tĩnh đạt thông lượng cao hơn 2.8 lần so với DSLK khi duyệt tuần tự do dữ liệu nằm liền kề trong bộ nhớ đệm Cache Line (64 bytes).

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng (Use Cases)

  • Hệ thống POS nhúng tại quầy thu ngân: Ứng dụng mảng cấu trúc kết hợp Binary SearchQuick Sort cho phép nhân viên tra cứu tức thời thông tin sản phẩm, thời hạn bảo hành và giá tiền theo mã vạch chỉ trong vài micro giây.
  • Hệ thống giỏ hàng và danh mục động trực tuyến: Ứng dụng Danh sách liên kết đơn cho phép bổ sung, xóa sửa các sản phẩm người dùng chọn mua theo thời gian thực mà không cần cấp phát lại toàn bộ mảng dữ liệu.

Yêu cầu phần cứng và triển khai

  • Hệ điều hành: Linux (Ubuntu 18.04+), Windows 7/10/11, macOS.
  • Phần cứng tối thiểu: CPU 1.0 GHz, RAM 64 MB, dung lượng lưu trữ 5 MB.
  • Lệnh biên dịch và thực thi chuẩn:
g++ -O3 -std=c++17 main.cpp -o QuanLyDongHo
./QuanLyDongHo

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Dữ liệu hiện tại chỉ lưu trữ tạm thời trên bộ nhớ RAM (In-Memory), mất toàn bộ trạng thái khi chương trình kết thúc.
  • Danh sách liên kết đơn chưa hỗ trợ tìm kiếm phân đoạn nhanh hoặc duyệt ngược hiệu quả.

Hướng phát triển mở rộng

  1. Lưu trữ bền vững (Persistence): Tích hợp đọc/ghi file nhị phân (.dat, .bin) hoặc định dạng JSON/CSV để đồng bộ hóa cơ sở dữ liệu.
  2. Nâng cấp Cấu trúc dữ liệu nâng cao:
    • Triển khai Danh sách liên kết kép (Doubly Linked List) để tối ưu hóa thuật toán Shaker Sort.
    • Ứng dụng Cây Cân Bằng (AVL Tree / Red-Black Tree) hoặc B-Tree nhằm duy trì tốc độ tìm kiếm và chèn/xóa luôn ở mức $\mathcal{O}(\log N)$.
  3. Xây dựng Giao diện đồ họa & RESTful API: Phát triển giao diện người dùng trực quan bằng thư viện Qt/C++ hoặc đóng gói thành microservice bằng C++ Crow Framework.

Đối tượng hưởng lợi

  • Sinh viên ngành CNTT & Kỹ thuật phần mềm: Tài liệu tham khảo chuẩn mực, cung cấp góc nhìn thực chiến về việc chuyển đổi giải thuật từ lý thuyết sang mã nguồn C++ tối ưu.
  • Lập trình viên C/C++: Nắm vững cơ chế quản lý bộ nhớ thủ công, kỹ thuật xử lý chuỗi ký tự, ngăn ngừa lỗi tràn bộ đệm và rò rỉ vùng nhớ heap.
  • Doanh nghiệp bán lẻ nhỏ & Kỹ sư hệ thống nhúng: Giải pháp tham khảo để xây dựng module quản lý kho siêu nhẹ, hoạt động ổn định trên các vi điều khiển và thiết bị POS chuyên dụng mà không cần cài đặt các hệ quản trị CSDL cồng kềnh.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai chương trình là gì?

Hệ thống chỉ cần trình biên dịch C++ hỗ trợ chuẩn C++11 trở lên (GCC, Clang, MSVC) với tài nguyên phần cứng tối thiểu 64MB RAM và 5MB dung lượng đĩa trống.

2. Tại sao không nên sử dụng Binary Search trên Danh sách liên kết đơn?

Vì DSLK đơn không hỗ trợ truy cập trực tiếp phần tử qua chỉ số trong $\mathcal{O}(1)$. Việc tìm phần tử chính giữa danh sách đòi hỏi duyệt tuần tự tốn $\mathcal{O}(N)$, khiến tổng chi phí tìm kiếm đạt $\mathcal{O}(N \log N)$, kém hiệu quả hơn cả Linear Search ($\mathcal{O}(N)$).

3. Có thể tích hợp chương trình này vào các hệ thống phần mềm lớn hơn không?

Hoàn toàn có thể. Mã nguồn được thiết kế theo dạng các hàm thuần túy (pure functions) và kiểu dữ liệu trừu tượng (ADT), dễ dàng đóng gói thành thư viện liên kết tĩnh (.lib / .a) hoặc thư viện liên kết động (.dll / .so) để tích hợp vào các hệ sinh thái phần mềm lớn hơn.

4. Cần lưu ý gì khi bảo trì và giải phóng bộ nhớ trên Danh sách liên kết?

Khi thao tác trên DSLK đơn, cần bảo đảm mỗi lệnh cấp phát động new Node đều phải đi kèm với thao tác giải phóng delete tương ứng khi hủy danh sách. Cần đặc biệt chú ý ngắt liên kết con trỏ cẩn thận để tránh lỗi dangling pointer.

5. Chi phí triển khai và thời gian hoàn vốn (ROI) của giải pháp này?

Dự án được xây dựng hoàn toàn trên các công nghệ mã nguồn mở (C++, GCC), do đó chi phí bản quyền phần mềm là 0 đồng. Đối với các cửa hàng bán lẻ quy mô nhỏ, việc triển khai giải pháp quản lý kho siêu nhẹ này giúp tiết kiệm 100% chi phí đầu tư máy chủ và giấy phép CSDL hàng năm.


Kết luận

Đồ án môn học Cấu trúc dữ liệu và giải thuật của sinh viên Đỗ Tường Vy đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng: Chuẩn hóa cấu trúc lưu trữ thông tin sản phẩm đồng hồ, hiện thực hóa chính xác các thuật toán tìm kiếm và sắp xếp trên cả Mảng cấu trúc và Danh sách liên kết đơn, đồng thời đưa ra những phân tích thực nghiệm sâu sắc về hiệu năng tính toán.

Công trình khẳng định vai trò cốt lõi của cấu trúc dữ liệu và giải thuật trong tối ưu hóa phần mềm, mở ra tiềm năng ứng dụng lớn cho các hệ thống quản trị kho hàng thời gian thực và thiết bị nhúng hiệu năng cao. Để tìm hiểu chi tiết và khai thác toàn bộ mã nguồn của đồ án, độc giả và các nhà phát triển có thể tham khảo trực tiếp mã nguồn hoặc liên hệ tác giả để cùng phát triển các mô-đun mở rộng.