#include #include #include #include #include #include constexpr size_t length = 1048576; constexpr size_t sample_length = 1000; int main() { std::vector vector1, vector2; std::vector E; std::set set1, set2; FILE *file = fopen("normal_distribution.txt", "r"); for (long long i; fscanf(file, "%lld ", &i) != EOF; vector1.push_back(i), set1.insert(i)) ; fclose(file); assert(vector1.size() == set1.size()); assert(vector1.size() == length); auto it = vector1.begin(); for (int i = 1; i <= sample_length; i++) { auto element = *it; auto ret = set2.insert(element); if (ret.second) { vector2.push_back(element); // printf("%lld\n", element); } it++; } assert(vector2.size() == sample_length); auto it2 = set2.begin(); int cnt = 0; for (long long it1 : set1) { while (it1 > *it2 && it2 != set2.end()) it2++, cnt++; // printf("%d ", cnt); } auto it1 = set1.begin(); cnt = 0; for (it2 = set2.begin(); it2 != set2.end(); it2++) { while (*it2 > *it1 && it1 != set1.end()) it1++, cnt++; // printf("%d ", cnt); } auto ita = set2.begin(), itb = set2.begin(); itb++; long double dx = (*itb - *ita); int cnt1 = 0, cnt2 = 0; // for (auto it = set2.begin(); it != set2.end(); it++) printf("%lld ", *it); // printf("\n"); long double e = 0; for (auto iter = set1.begin(); iter != set1.end(); iter++, cnt1++) { if (*iter <= *set2.begin()) { e += fabs(0.0 - double(cnt1) / (length - 1)); printf("%.4lf ", 0.0); continue; } while (itb != set2.end() && *iter > *itb) ita++, itb++, dx = (*itb - *ita), cnt2++; if (*itb == *set2.end()) { e += fabs(1.0 - double(cnt1) / (length - 1)); printf("%.4lf ", 100.0); continue; } // printf("%lld %lld %lld ", *ita, *it, *itb); long double res = (cnt2 + (*iter - *ita) / dx) / (sample_length - 1); auto single_e = std::abs(res - (long double)cnt1 / (length - 1)); E.push_back(single_e); e += single_e; printf("%.4Lf ", res * 100); } printf("\n%.4Lf", e); for (auto element : E) { printf("%.8Lf ", element); } puts(""); return 0; }