2010-03-01 36 views
7

Xem xét kịch bản tôi có giá trị giao như thế nàybitmask hoạt động trong java

Amazon -1

Walmart -2

Target -4

Costco -8

Bjs -16

Trong DB, dữ liệu được lưu trữ bằng cách che các giá trị này dựa trên tính khả dụng của chúng cho mỗi sản phẩm. ví dụ.,

Mask mô tả sản phẩm

1 máy tính xách tay có sẵn trong Amazon

17 iPhone Có sẵn trong Amazon và BJ

24 Nệm Có sẵn trong Costco và BJ của

Giống như tất cả các sản phẩm này là maske d và được lưu trữ trong DB.

Làm cách nào để truy xuất tất cả các nhà bán lẻ dựa trên giá trị được che chắn. ví dụ: Đối với Nệm giá trị đeo mặt nạ là 24. Sau đó, tôi sẽ tìm hoặc liệt kê Costco & BJ theo cách lập trình. Mọi thuật toán/logic sẽ được đánh giá cao.

+0

Đây có phải là điều chắc chắn bạn muốn làm trong mã Java như trái ngược với việc thực hiện nó như là một phần của truy vấn cơ sở dữ liệu của bạn không? Thường thì trường hợp lọc trong truy vấn cơ sở dữ liệu hiệu quả hơn ... –

Trả lời

9
int mattress = 24; 
int mask = 1; 
for(int i = 0; i < num_stores; ++i) { 
    if(mask & mattress != 0) { 
     System.out.println("Store "+i+" has mattresses!"); 
    } 
    mask = mask << 1; 
} 

Các if dòng tuyên bố lên các bit, nếu giá trị nệm có chút giống như bộ mặt nạ, sau đó các cửa hàng có mặt nạ đó là bán nệm. Giá trị và giá trị mặt nạ và giá trị nệm sẽ chỉ bằng 0 khi cửa hàng bán nệm. Đối với mỗi lần lặp chúng ta di chuyển bit mặt nạ một vị trí sang trái.

Lưu ý rằng giá trị mặt nạ phải là số dương, không âm, nếu cần bạn có thể nhân với giá trị âm.

+0

là kết quả tương tự nếu bạn không sử dụng biến 'mặt nạ' và thay vào đó thay đổi câu lệnh 'if' thành "if (1 << i & nệm! = 0) – vedant1811

1

Giả sử bạn có nghĩa là trong cơ sở dữ liệu SQL, sau đó trong SQL truy xuất của bạn, bạn thường có thể thêm ví dụ: WHERE (MyField AND 16) = 16, WHERE (MyField VÀ 24) = 24 vv

Tuy nhiên, lưu ý rằng nếu bạn đang cố gắng tối ưu hóa các lần truy xuất đó và số lượng hàng thường phù hợp với truy vấn nhỏ hơn nhiều tổng số hàng, thì điều này có lẽ không phải là cách rất tốt để thể hiện dữ liệu này. Trong trường hợp đó, sẽ tốt hơn nếu có một bảng "ProductStore" riêng biệt chứa các cặp (ProductID, StoreID) đại diện cho thông tin này (và được lập chỉ mục trên StoreID).

1

Có tối đa hai nhà bán lẻ có hàng tồn kho tính tổng giá trị "bị che khuất" trong mỗi trường hợp không? Nếu vậy bạn sẽ vẫn phải kiểm tra tất cả các cặp để lấy chúng, sẽ mất thời gian n². Chỉ cần sử dụng một vòng lặp lồng nhau.

Nếu giá trị đại diện cho tổng của bất kỳ số lượng hàng tồn kho nào của nhà bán lẻ, thì bạn đang cố giải quyết vấn đề subset-sum, vì vậy rất tiếc bạn không thể thực hiện tốt hơn 2^n lần.

Nếu bạn có thể tăng cường cấu trúc dữ liệu ban đầu của bạn với thông tin để tra cứu các nhà bán lẻ đóng góp vào tổng, thì điều này sẽ là lý tưởng. Nhưng vì bạn đang đặt câu hỏi, tôi giả sử bạn không có quyền truy cập vào cấu trúc dữ liệu khi nó đang được xây dựng, do đó, để tạo tất cả các tập hợp con của nhà bán lẻ để kiểm tra bạn sẽ muốn xem xét Knuth's algorithm [pdf] để tạo tất cả k- kết hợp (và chạy nó cho 1 ... k) được đưa ra trong TAOCP Vol 4a Sec 7.2.1.3.

0

http://www.antiifcampaign.com/

Hãy nhớ điều này. Nếu bạn có thể loại bỏ "if" với một cấu trúc khác (bản đồ/mẫu chiến lược), đối với tôi, bạn có thể để nó ở đó, nếu không thì "nếu" thực sự nguy hiểm !! (F.Cirillo)

Trong trường hợp này, bạn có thể sử dụng bản đồ bản đồ với thao tác bitmap.

Luca.

Các vấn đề liên quan