Tiêu chuẩn C++ yêu cầu std::partition
để có số ứng dụng vị ngữ khác nhau giữa ForwardIterator
và BidirectionalIterator
. Đối với phiên bản ForwardIterator
, số lượng các ứng dụng vị sẽ < = N, nơi N = std::distance(first, last)
, nhưng đối với các phiên bản BidirectionalIterator
, số lượng các ứng dụng vị sẽ < = N/2. Rõ ràng, cả hai phiên bản đều có độ phức tạp thời gian O (N).Tại sao tiêu chuẩn C++ yêu cầu std :: partition để đáp ứng các phức tạp khác nhau cho các loại trình lặp khác nhau?
Câu hỏi của tôi là, tại sao nó lại cung cấp các yêu cầu khác nhau cho các loại trình lặp khác nhau? Yêu cầu đó buộc phải có nhiều trình biên dịch?
ví dụ: MSVC, triển khai chức năng std::partition
theo hai cách để đáp ứng yêu cầu đó, có vẻ không quá thanh lịch.
Một câu hỏi nữa: Có bất kỳ thuật toán dựa trên hệ số này, sao cho khi N/2 trở thành N, sự phức tạp tiệm cận sẽ khác nhau? Đối với sự hiểu biết của tôi, nếu chúng tôi xem xét Master's Theorem
, đối với biểu mẫu trong T(n) = aT(n/b) + f(n)
, hệ số trong f(n)
không quan trọng nhiều.
C.f. Việc triển khai tương đương phân vùng của MSVC:
template<class BidirIt, class UnaryPred>
BidirIt partition(BidirIt first, BidirIt last, UnaryPred pred, std::bidirectional_iterator_tag)
{
while (true)
{
while ((first != last) && pred(*first))
{
++first;
}
if (first == last)
{
break;
}
--last;
while ((first != last) && !pred(*last))
{
--last;
}
if (first == last)
{
break;
}
std::iter_swap(first, last);
++first;
}
return first;
}
template<class ForwardIt, class UnaryPred>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPred pred, std::forward_iterator_tag)
{
first = std::find_if_not(first, last, pred);
if (first == last)
{
return first;
}
for (ForwardIt src = std::next(first); src != last; ++src)
{
if (pred(*src))
{
std::iter_swap(first, src);
++src;
}
}
return first;
}
template<class ForwardIt, class UnaryPred>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPred pred)
{
return partition(first, last, pred, typename std::iterator_traits<ForwardIt>::iterator_category());
}
Cảm ơn bạn rất nhiều vì đã trả lời câu hỏi của tôi. Như đã chỉ ra, tôi đã phạm sai lầm về số lượng ứng dụng vị ngữ. Cả hai phiên bản đều dành cho các ứng dụng * N *. Đó là số lần hoán đổi khác nhau. Bây giờ tôi có thể hiểu được tiêu chuẩn đòi hỏi vì nó là yêu cầu tối ưu. Cảm ơn một lần nữa cho câu trả lời của các bạn. :) –
Bạn được chào đón. Vui lòng đánh dấu câu trả lời là được chấp nhận nếu câu trả lời cho câu hỏi của bạn. – michalsrb