use overclocked_sort::{overclocked_kp_sort, KeyPtr};
use std::time::Instant;
#[derive(Clone, Eq, PartialEq)]
pub struct MonsterStruct {
pub tier: u16, pub power: u16, pub padding: [u64; 4], }
struct Lcg { seed: u64 }
impl Lcg {
fn next(&mut self) -> u32 {
self.seed = self.seed.wrapping_mul(6364136223846793005).wrapping_add(1);
(self.seed >> 32) as u32
}
}
fn main() {
let n = 5_000_000;
println!("=== SO SÁNH: HÀM CMP (CỬA TẮT O(N log N)) VÀ PACKED KEY (O(N + M)) ===\n");
let mut rng = Lcg { seed: 101010 };
let mut data = Vec::with_capacity(n);
for _ in 0..n {
data.push(MonsterStruct {
tier: (rng.next() % 500) as u16,
power: (rng.next() % 2000) as u16,
padding: [0, 0, 0, 0],
});
}
let mut d_cmp = data.clone();
let d_key = data.clone();
println!("▶ 1. Phương án CMP: Đi cửa tắt bằng PDQ-Sort O(N log N) In-place");
let start = Instant::now();
d_cmp.sort_unstable_by(|a, b| {
a.tier.cmp(&b.tier).then(a.power.cmp(&b.power))
});
let elapsed_cmp = start.elapsed();
println!("⏱ Thời gian (CMP Shortcut): {:?}", elapsed_cmp);
println!("\n▶ 2. Phương án KeyPtr: Trích xuất Packed Key -> Overclocked Sort -> Reconstruct");
let start = Instant::now();
let max_val = (500 << 16) | 2000; let mut key_pointers = Vec::with_capacity(n);
for (i, item) in d_key.iter().enumerate() {
let packed_key = ((item.tier as i32) << 16) | (item.power as i32);
key_pointers.push(KeyPtr {
key: packed_key,
ptr: i as u64, });
}
let sorted_kps = overclocked_kp_sort(&key_pointers, max_val as usize);
let mut result_ovc = Vec::with_capacity(n);
for kp in sorted_kps.iter() {
result_ovc.push(d_key[kp.ptr as usize].clone());
}
let elapsed_ovc_key = start.elapsed();
println!("⏱ Thời gian (Overclocked KeyPtr + Reconstruct): {:?}", elapsed_ovc_key);
assert_eq!(d_cmp[444].tier, result_ovc[444].tier);
assert_eq!(d_cmp[444].power, result_ovc[444].power);
println!("\n=================================");
println!("⭐ Nhận xét:");
if elapsed_cmp < elapsed_ovc_key {
println!("🚀 O(N log N) Bằng hàm CMP đã chiến thắng nhờ Không tốn chi phí Copy/Reconstruct!");
} else {
println!("🚀 Kiến trúc đếm O(N) KeyPtr đã đè bẹp CMP bất chấp chi phí Reconstruct!");
}
}