minor speedup through reused allocation
This commit is contained in:
parent
1351653c8e
commit
08fa71a591
22
2019/16.cpp
22
2019/16.cpp
|
@ -11,17 +11,15 @@ using namespace aocpp;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
auto FFT(std::size_t const start, std::vector<std::int8_t> const& prev)
|
auto FFT(std::size_t const start, std::vector<std::int32_t> & partial_sums, std::vector<std::int8_t> & signal)
|
||||||
{
|
{
|
||||||
std::vector<std::int8_t> result;
|
auto n = signal.size();
|
||||||
std::vector<std::int32_t> partial_sums;
|
|
||||||
auto n = prev.size();
|
partial_sums.clear();
|
||||||
result.reserve(n);
|
|
||||||
partial_sums.reserve(n+1);
|
partial_sums.reserve(n+1);
|
||||||
partial_sums.push_back(0);
|
partial_sums.push_back(0);
|
||||||
|
|
||||||
std::int32_t acc = 0;
|
std::int32_t acc = 0;
|
||||||
for (auto const x : prev) {
|
for (auto const x : signal) {
|
||||||
partial_sums.push_back(acc += x);
|
partial_sums.push_back(acc += x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,12 +27,11 @@ auto FFT(std::size_t const start, std::vector<std::int8_t> const& prev)
|
||||||
std::int32_t acc = 0;
|
std::int32_t acc = 0;
|
||||||
auto step = i+start+1;
|
auto step = i+start+1;
|
||||||
for (std::size_t offset = i; offset < n; offset += 4*step) {
|
for (std::size_t offset = i; offset < n; offset += 4*step) {
|
||||||
acc += partial_sums[std::min(n, offset + 1*step)] - partial_sums[std::min(n, offset )];
|
acc += partial_sums[std::min(n, offset + 1*step)] - partial_sums[std::min(n, offset + 0*step)]
|
||||||
acc -= partial_sums[std::min(n, offset + 3*step)] - partial_sums[std::min(n, offset + 2*step)];
|
+ partial_sums[std::min(n, offset + 2*step)] - partial_sums[std::min(n, offset + 3*step)];
|
||||||
}
|
}
|
||||||
result.push_back(std::abs(acc % 10));
|
signal[i] = std::abs(acc % 10);
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Parse(std::istream & in) -> std::vector<std::int8_t>
|
auto Parse(std::istream & in) -> std::vector<std::int8_t>
|
||||||
|
@ -55,8 +52,9 @@ auto Compute(
|
||||||
std::size_t offset = 0
|
std::size_t offset = 0
|
||||||
) -> std::string
|
) -> std::string
|
||||||
{
|
{
|
||||||
|
std::vector<std::int32_t> partial_sums;
|
||||||
for (std::size_t i = 0; i < iterations; i++) {
|
for (std::size_t i = 0; i < iterations; i++) {
|
||||||
signal = FFT(offset, signal);
|
FFT(offset, partial_sums, signal);
|
||||||
}
|
}
|
||||||
signal.resize(8);
|
signal.resize(8);
|
||||||
std::string result;
|
std::string result;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user