Averages/Median: Difference between revisions
Content added Content deleted
Line 862: | Line 862: | ||
return 0; |
return 0; |
||
}</lang> |
}</lang> |
||
===Order Statistic Tree=== |
|||
Uses a GNU C++ policy-based data structure to compute median in O(log n) time. |
|||
{{libheader|gnu_pbds}} |
|||
<lang cpp>#include <bits/stdc++.h> |
|||
#include <ext/pb_ds/assoc_container.hpp> |
|||
#include <ext/pb_ds/tree_policy.hpp> |
|||
// the std::less_equal<> comparator allows the tree to support duplicates |
|||
typedef __gnu_pbds::tree<double, __gnu_pbds::null_type, std::less_equal<double>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> ost_t; |
|||
// The lookup method, find_by_order (aka Select), is O(log n) for this data structure, much faster than std::nth_element() |
|||
double median(ost_t &OST) |
|||
{ |
|||
int n = OST.size(); |
|||
int m = n/2; |
|||
if (n == 1) |
|||
return *OST.find_by_order(0); |
|||
if (n == 2) |
|||
return (*OST.find_by_order(0) + *OST.find_by_order(1)) / 2; |
|||
if (n & 1) // odd number of elements |
|||
return *OST.find_by_order(m); |
|||
else // even number of elements |
|||
return (*OST.find_by_order(m) + *OST.find_by_order(m-1)) / 2; |
|||
} |
|||
int main(int argc, char* argv[]) |
|||
{ |
|||
ost_t ostree; |
|||
// insertion is also O(log n) for OSTs |
|||
ostree.insert(4.1); |
|||
ostree.insert(7.2); |
|||
ostree.insert(1.7); |
|||
ostree.insert(9.3); |
|||
ostree.insert(4.4); |
|||
ostree.insert(3.2); |
|||
printf("%.3f\n", median(ostree)); // 4.250 |
|||
return 0; |
|||
} |
|||
</lang> |
|||
=={{header|Clojure}}== |
=={{header|Clojure}}== |