#include #include int lerp(float a, float b, float f) { return a + f * (b - a); } void solveHistogram(const std::vector& vals, int min, int max) { std::vector> bins; int binSize = 10; int binsTotal = ceil((max - min) / binSize); for (int i = 0; i < binsTotal; ++i) { bins.push_back(std::vector()); } for (auto& v : vals) { int bin = v / binSize; if (bin >= binsTotal) { std::cout << "Invalid value: " << bin << ", " << v << std::endl; continue; } bins[bin].push_back(v); } unsigned int smallest_val = 0; unsigned int largest_val = 0; for (size_t i = 0; i < bins.size(); ++i) { if (smallest_val == 0 || bins[i].size() < smallest_val) { smallest_val = bins[i].size(); } if (largest_val == 0 || bins[i].size() > largest_val) { largest_val = bins[i].size(); } } std::cout << "smallest bin: " << smallest_val << ", largest: " << largest_val << std::endl; int ind = 0; for (auto& v : bins) { ind++; int hashes = lerp(1, 10, v.size() / (float)largest_val); int lower = (ind-1) * binSize; int higher = ind * binSize; std::cout << lower << " - " << higher << "\t:\t"; for (int c = 0; c < hashes; c++) { std::cout << "#"; } std::cout << std::endl; } } int main(int argc, char** argv) { std::random_device rd; std::mt19937 mt(rd()); std::uniform_int_distribution dista(30, 100); std::uniform_int_distribution distb(1, 29); std::vector vals; for (int i = 0; i < 1000; ++i) { vals.push_back(dista(mt)); } for (int i = 0; i < 100; ++i) { vals.push_back(distb(mt)); } for (auto& v : vals) { std::cout << v << std::endl; } solveHistogram(vals, 1, 100); return 0; }