我想使用最少量的for循环输出我的直方图
cout << "0|";
for (int j = 0; j < bin[0]; j++)
cout << "*";
cout << endl;
目前我正在输出这样的直方图:
import os
myfile = open("ticker.csv", "r")
lines = myfile.readlines()
for line in lines:
ticker = line.strip();
cmd = "python get_quote_history.py --symbol=%s --from=2017-01-01 --to=2017-05-25 -o %s.csv" %(ticker,ticker)
os.system(cmd)
但这很漫长而烦人。有没有办法以更少的方式实现相同的输出 for loops?
答案 0 :(得分:0)
我将忽略直方图代码中的错误,因为它与优化直方图输出的问题无关。 有关错误(返回本地变量)的信息,请查看this Stack Overflow question。 而且,你错过了大括号。在发布之前,请务必检查您的代码是否以最极简的形式编译并运行。
您声明问题在于您使用的方法“冗长而烦人”,但您不清楚是指代码的设计还是代码的执行速度。
您可以读取直方图的最快速度是O(n),其中n是直方图中的区间数。从这个意义上说,你的代码可以在没有微观优化的情况下快速获得。
如果您的直方图中包含打印,那么您有O(n * m),其中m是每个bin的平均条目数。
写直方图也是O(n * k),其中k是数组中的条目数,因为你必须弄清楚每个值属于哪个bin。
如果您遇到的问题是代码臃肿且难以处理,那么请使用较少的幻数并为函数添加更多参数,如下所示:
#include <iostream>
void histogram(int const size, int const * const arr, unsigned int const number_of_bins, float const bin_min, float const bin_max, int * output)
{
float const binsize = (bin_max - bin_min)/number_of_bins;
for (int i = 0; i < size; i++)
{
for(int j = 0; j < number_of_bins; ++j)
{
if (arr[i] >= bin_min + binsize*j && arr[i] < bin_min + binsize*(j+1))
{
output[j]++;
}
}
}
}
int main(){
int const number_of_bins = 10;
float const bin_min = 0;
float const bin_max = 100;
int const size = 20;
int const array[size] = {5,6,20,40,44,50,110,6,-1,51,55,56,20,50,60,80,81,0,32,3};
int bin[number_of_bins] = {};
histogram(size, array, number_of_bins, bin_min, bin_max, bin);
for(int i = 0; i < number_of_bins; ++i)
{
std::cout << i << "|";
for (int j = 0; j < bin[i]; j++)
{
std::cout << "*";
}
std::cout << std::endl;
}
}
编译:
g++ main.cc -o Output
输出:
0|*****
1|
2|**
3|*
4|**
5|*****
6|*
7|
8|**
9|
(奖金,你的错误是固定的)
答案 1 :(得分:0)
首先你的程序是不正确的,因为正如所指出的那样,你从一个函数返回一个指向局部变量的指针。要解决此问题,您应使用std::array<Type, Size>
或std::vector<Type>
。
关于你的问题,如果你想要简短的代码,试试这个:
#include <string>
#include <algorithm>
#include <iostream>
#include <array>
std::array<int, 10> bin;
// Fill your array here
int i = 0;
std::for_each(bin.begin(), bin.end(), [&i](auto x)
{
std::cout << i++ << "|" << std::string(x, '*') << std::endl;
});
此代码利用std::string
的填充构造函数来避免您的循环。但是,由于您想要遍历数组,您需要以某种方式执行此操作。通过显式或通过调用另一个函数。
注意:此代码的效率低于循环标准,但您的问题是如何避免这些。