Giải thuật 03/09/2026 8 phút

std::set hay bitset? Cùng một tập, chênh nhau tới 10.000 lần

Cần một tập số nguyên, cứ dùng std::set cho tiện? Tôi đo thử: với miền nhỏ dày đặc, bitset nén RAM 192 lần, phép giao nhanh 10.000 lần (AND 64 phần tử mỗi lệnh), kiểm tra thành viên nhanh 870 lần. Nhưng miền rộng tập thưa thì bitset lại phí RAM — chọn theo miền nhỏ/rộng, dày/thưa.

Giải thuật 03/09/2026 8 phút

Đổi một dòng khai báo struct, tiết kiệm 33% RAM: bí mật của padding

Thứ tự khai báo trường trong struct chỉ là chuyện phong cách? Tôi đo thử: đảo thứ tự cùng ba trường làm struct từ 24 byte xuống 16 byte — phí 33% RAM chỉ vì đệm căn lề, và duyệt mảng bản 16B nhanh hơn 1,35 lần vì nhét gấp đôi số struct mỗi cache line. Sắp trường lớn tới nhỏ.

Giải thuật 03/09/2026 8 phút

Cùng dữ liệu, đổi cách xếp: nhanh 3,6 lần hoặc chậm 2 lần (SoA vs AoS)

Bố cục struct chỉ là cách tổ chức, không đổi tốc độ? Tôi đo thử: duyệt một trường trên 15 triệu phần tử, SoA nhanh hơn AoS 3,6 lần vì cache line không bị lãng phí. Nhưng truy cập ngẫu nhiên mọi trường thì AoS lại nhanh gấp đôi. Không có bố cục nào luôn thắng — chọn theo mẫu truy cập.

Giải thuật 03/09/2026 8 phút

Hash nhanh hơn cây 32 lần — nhưng thua 7000 lần ở range query

O(1) < O(log n), nên hash luôn hơn cây? Tôi đo thử: tra cứu điểm hash nhanh hơn cây đỏ-đen 32 lần (16ns vs 518ns). Nhưng range query — tìm mọi phần tử >= x theo thứ tự — cây làm trong 7,8µs còn hash phải sort lại toàn bộ, 54,2ms. 'Cái nào nhanh hơn' là câu hỏi sai; chọn theo loại truy vấn.

Giải thuật 03/09/2026 8 phút

Chạy một lần rồi so là sai: cùng thao tác đo ra 99,8 hay 197,9 ns tùy nhiễu

Tưởng chạy một lần trước/sau là đủ biết một tinh chỉnh có tác dụng? Tôi đo thử: cùng một getpid không đổi gì, một phép đo có thể ra 99,8 hoặc 197,9 ns (chênh 2 lần) tùy nhiễu; chỉ min-của-nhiều-lần mới tái lập, và phải cô lập đúng một biến. Đây là nền của mọi con số trong sê-ri.