2011-01-14 61 views
8

Tôi đã tìm kiếm xung quanh và không thể tìm thấy thông số thời gian hiệu suất cho bitset :: count(). Có ai biết nó là gì (O (n) hoặc tốt hơn) và nơi để tìm thấy nó?Hiệu suất của phương thức STL bitset :: count() là gì?

EDIT Bởi STL tôi chỉ tham chiếu đến Thư viện mẫu chuẩn.

+1

Những gì Tomalak đã đề cập (nhưng không giải thích được * vì anh ấy dường như không an toàn và cần phải khẳng định kiến ​​thức của mình đối với người khác) là STL (Thư viện mẫu chuẩn) là một thuật ngữ không rõ ràng. Một số người trong cộng đồng C++ đã mở rộng về điều này trong [info-wiki cho thẻ] (http://stackoverflow.com/tags/stl/info), nên làm rõ nhận xét của Tomalak. Tóm lại, bạn chỉ nên nói "thư viện chuẩn" hoặc "stdlib", nhưng chúng tôi sẽ biết ý bạn là gì khi bạn nói STL. – GManNickG

+1

@GMan: Không cần tấn công cá nhân. Chúng không được chào đón ở đây trên StackOverflow. Vui lòng điều chỉnh âm thanh của bạn trong tương lai. –

Trả lời

7

Tôi đọc tệp này (C: \ cygwin \ lib \ gcc \ i686-pc-cygwin \ 3.4.4 \ include \ C++ \ bitset) trên máy tính của tôi.
Xem những

/// Returns the number of bits which are set. 
size_t 
count() const { return this->_M_do_count(); }  

size_t 
_M_do_count() const 
{ 
    size_t __result = 0; 
    for (size_t __i = 0; __i < _Nw; __i++) 
    __result += __builtin_popcountl(_M_w[__i]); 
    return __result; 
} 

BTW, đây là nơi _Nw được quy định:

template<size_t _Nw> 
    struct _Base_bitset 

Vì vậy nó là O (n) trong việc thực hiện gcc. Chúng tôi kết luận đặc điểm kỹ thuật không yêu cầu nó tốt hơn O (n). Và không ai trong tâm trí của họ sẽ thực hiện nó theo cách tồi tệ hơn thế. Sau đó chúng ta có thể giả định rằng nó là tồi tệ nhất O (n). Có thể tốt hơn nhưng bạn không bao giờ có thể tin tưởng vào điều đó.

+2

Đó không phải là đặc điểm kỹ thuật! : P –

+3

@ tomalak-geretkal Trong triển khai gcc, đây là O (n). Chúng tôi kết luận đặc điểm kỹ thuật không yêu cầu nó tốt hơn O (n). Và không ai sẽ quá ngu ngốc để thực hiện nó theo cách tồi tệ hơn thế. Sau đó chúng ta có thể giả định rằng nó luôn luôn là ít nhất O (n). Có thể tốt hơn nhưng bạn không bao giờ có thể tin tưởng vào điều đó. – Haozhun

+1

@Gene: Trong khi trong trường hợp này tôi tình cờ đồng ý, điều này không trả lời đúng câu hỏi ban đầu về thông số kỹ thuật hiệu suất là gì. Tuy nhiên, đó là một khoản khấu trừ tốt. –

0

"thực hiện tham chiếu của SGI chạy trong thời gian tuyến tính đối với số byte cần thiết để lưu trữ các bit với. Nó làm điều này bằng cách tạo ra một mảng tĩnh 256 số nguyên. Giá trị bảo quản ở chỉ số thứ i trong mảng là số bit được đặt trong giá trị i. "

http://www.cplusplus.com/forum/general/12486/

+2

Điều này cũng có thể chính xác, nhưng chỉ là một cảnh báo ở đây là cplusplus.com nổi tiếng là bị lỗi. –

+2

Hơn nữa, đó sẽ là mô tả về một triển khai nhất định. –

+0

@DavidThornley: Thật vậy, cplusplus.com rất khó hiểu (tôi dám nói, nhầm lẫn?) Về thư viện nói chung. Nó sử dụng thuật ngữ "STL" rõ ràng insinuating rằng nó thực sự có nghĩa là thư viện chuẩn C++, nhưng sau đó mọi người trên diễn đàn nói về STL thực tế. –

0

Tôi không chắc chắn bạn sẽ tìm thấy một đặc điểm kỹ thuật cho rằng, kể từ khi STL không thường đòi hỏi một mức độ nhất định về hiệu suất. Tôi đã nhìn thấy gợi ý rằng nó "nhanh", khoảng 1 chu kỳ mỗi bit trong kích thước của bộ. Tất nhiên bạn có thể đọc mã thực hiện cụ thể của bạn để tìm hiểu những gì mong đợi.

+2

STL thường yêu cầu mức độ nhất định của hiệu suất tiệm cận (big-O). –

1

Tôi không thể chắc chắn những gì bạn thực sự có nghĩa là "STL" ở đây, do lạm dụng phổ biến của thuật ngữ trong cộng đồng C++.

  • C++ Standard (2003) làm cho không có nhiệm vụ để thực hiện các std::bitset::count() (hoặc, trên thực tế, bất kỳ thành viên của std::bitset như xa như tôi có thể nhìn thấy).

  • Tôi không thể tìm thấy bất kỳ tham chiếu nào đề xuất ủy quyền cho hiệu suất của STL's bitset::count().

Tôi nghĩ rằng bất kỳ việc triển khai nào sẽ cung cấp điều này theo thời gian liên tục (hoặc ở thời điểm tồi tệ nhất). Tuy nhiên, đây chỉ là một cảm giác. Kiểm tra của bạn để tìm hiểu những gì bạn sẽ thực sự nhận được.

+0

Bạn có thể chia sẻ những thứ khác mà STL tham chiếu trong ngữ cảnh của C++ không? – yasouser

+4

Nhận xét giống như tôi đã cung cấp cho bạn [ở đây] (http://stackoverflow.com/questions/2297164/stl-deque-accessing-by-index-is-o1/4694218#4694218). Có một thời gian cho người đi bộ, đây không phải là nó. Bình luận về câu hỏi nếu bạn muốn làm rõ việc OP sử dụng "STL", nhưng đừng làm cho nó trở thành một phần của câu trả lời của bạn và giả vờ rằng bạn bằng cách nào đó không hiểu được ý của anh ấy, nó kiêu ngạo và kiêu ngạo. * Giải thích * mọi thứ cho OP, không chỉ nói "Tôi không thể có được cái này, nó không được định nghĩa đúng!" – GManNickG

+1

@GMan Tôi đã có thể nghĩ rằng chỉ ra rằng câu hỏi của ông là mơ hồ và sau đó cung cấp một câu trả lời cho cả hai trong số hai điều mà ông có thể đã được yêu cầu về sẽ đủ. Tôi không thấy làm thế nào tuyên bố rằng tôi không thể làm điều gì đó là "kiêu ngạo"; đọc một từ điển. Và không phải là toàn bộ câu trả lời của tôi là "Tôi không biết ý bạn là gì, hãy thử lại". –

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