std::set
là một cây được sắp xếp. Nó cung cấp các phương thức begin
và end
để tôi có thể tối thiểu và tối đa và lower_bound
và upper_bound
để tìm kiếm nhị phân. Nhưng điều gì sẽ xảy ra nếu tôi muốn đưa trình vòng lặp trỏ đến phần tử ở giữa (hoặc một trong số chúng nếu có cả số phần tử ở đó)?Cách hiệu quả để lấy trung bình (trung bình) của một tiêu chuẩn :: set?
Có cách nào hiệu quả (O(log(size))
không O(size)
) để làm điều đó không?
{1} => 1
{1,2} => 1 or 2
{1,2,3} => 2
{1,2,3,4} => 2 or 3 (but in the same direction from middle as for {1,2})
{1,312,10000,14000,152333} => 10000
Sắp xếp nhị phân cây có thể được và thường là chi tiết thực hiện của std :: thiết lập nhưng đó là không cần thiết. Nếu bạn cần sắp xếp mảng hoặc cây nhị phân thì tốt hơn là sử dụng những gì bạn cần. –
@ ÖöTiib, tôi cần chèn động các phần tử và đặt giữa phần. Sắp xếp mảng/vectơ sẽ gây ra chèn là 'O (n)', nhưng tôi muốn cả chèn và truy vấn để làm việc 'O (lb (n))'. Tôi biết rằng cây Decart với khóa ngầm cho phép làm điều đó, nhưng tôi không muốn thực hiện nó và hy vọng rằng 'std :: set' đủ tốt để đạt được điều đó. – Qwertiy
@Qwertiy trong hầu hết các trường hợp sử dụng chèn vào một vectơ sẽ rất nhanh do địa phương bộ nhớ cache. 'std :: set', cũng như các danh sách liên kết, sử dụng con trỏ đến các phần tử con nằm rải rác ở khắp mọi nơi, vì vậy nó có thể chậm hơn trong nhiều trường hợp. Đọc [Tại sao bạn không bao giờ, bao giờ, EVER sử dụng danh sách liên kết trong mã của bạn một lần nữa] (https://kjellkod.wordpress.com/2012/02/25/why-you-should-never-ever-ever-use- liên kết-danh sách-trong-của bạn-code-một lần nữa /), [Bjarne Stroustrup: Tại sao bạn nên tránh Danh sách liên kết] (https://youtu.be/YQs6IC-vgmo), [Có danh sách điều ác?] (https: // isocpp.org/blog/2014/06/stroustrup-lists) –