sách gpt4 ai đã đi

Tìm số 0 đầu tiên trong một mảng bit

In lại Tác giả: Space Dog Thời gian cập nhật: 2023-10-29 11:05:03 30 4
mua khóa gpt4 Nike

Tôi có một bitmap

uint64_t bitmap[10000] 

Theo dõi các tài nguyên được phân bổ trong hệ thống. Bây giờ câu hỏi đặt ra là làm thế nào để tìm bit chưa đặt (bit không) đầu tiên trong bản đồ bitmap này một cách hiệu quả?

Tôi biết rằng glibc có ffsll(unsigned long long) để tìm bit thiết lập đầu tiên, tôi cho rằng nó được thực hiện bằng cách sử dụng lệnh phần cứng.

Để sử dụng hàm này trong ví dụ của tôi, trước tiên tôi cần khởi tạo mảng để đặt mọi bit thành 1, sau đó khi phân bổ tài nguyên, tôi phải tìm kiếm tuyến tính trong mảng để tìm từ đầu tiên không phải số 0. Sau đó sử dụng ffsll() để tìm bit set đầu tiên.

Tôi có thể làm nhanh hơn bằng cách nào?

Cập nhật: Tôi đang sử dụng CPU x86-64.

1 Câu trả lời

Bạn có thể duy trì bitmapCây, để tìm tập bit thấp nhất một cách hiệu quả. Trên CPU 64 bit, bạn chỉ cần đặt độ sâu của cây thành 3 để theo dõi 4096 phần tử 64 bit - điều này có nghĩa là chỉ có ba ffsll Gọi.

Về cơ bản, điều này được thực hiện bằng cách chia mảng thành các khối 64 từ và chỉ định chỉ mục 64 bit cho mỗi khối. Một bit của từ chỉ mục được thiết lập nếu và chỉ nếu từ tập bit tương ứng có tất cả các bit được thiết lập. Khi bạn thay đổi một bit trong một bitset, bạn sẽ điều chỉnh từ chỉ mục tương ứng.

Sau đó, bạn có thể xây dựng một mảng chỉ mục khác ở trên cùng để tạo thành một cây.

Phải mất thêm một chút công sức cho mỗi lần thay đổi bit, nhưng tổng lượng công sức (và dung lượng lưu trữ) phát sinh không đáng kể so với chi phí bạn tiết kiệm được khi không phải tìm kiếm tuyến tính trên bitset khi bạn cần một bit trống.

Liên quan đến c - tìm số không đầu tiên trong một mảng bit, chúng ta tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/14866848/

30 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com