#include<iostream>
#include<vector>
#include<iterator>
#include<type_traits>
#include<ctime>
#include<random>
#include<functional>
template<class _Countable_Ty, class _Iterator_Ty>
class Record final {
public:
_Iterator_Ty _Estimated_Begin;
_Iterator_Ty _Estimated_End;
_Countable_Ty _Estimated_Count;
private:
_Iterator_Ty _Truth_Begin;
_Iterator_Ty _Truth_End;
_Countable_Ty _Truth_Count;
public:
Record() {}
~Record() {}
public:
void push() {
_Truth_Begin = _Estimated_Begin;
_Truth_End = _Estimated_End;
_Truth_Count = _Estimated_Count;
}
const _Iterator_Ty& cTruthBegin() const {
return _Truth_Begin;
}
const _Iterator_Ty& cTruthEnd() const {
return _Truth_End;
}
const _Countable_Ty& cTruthCount() const {
return _Truth_Count;
}
};
class MaximumSubRange {
public:
template<class iterator_type>
Record<typename std::iterator_traits<iterator_type>::value_type, iterator_type>
operator()(iterator_type BeginIter, iterator_type EndIter) {
using value_type = typename std::iterator_traits<iterator_type>::value_type;
using record_type = Record<value_type, iterator_type>;
std::function<iterator_type(iterator_type, iterator_type)> _FindValueableFirst = std::bind(
[](iterator_type BeginIter, iterator_type EndIter) -> iterator_type {
while (BeginIter != EndIter && *BeginIter < 0)
++BeginIter;
return BeginIter;
}, std::placeholders::_1, std::placeholders::_2);
record_type _Record;
_Record._Estimated_Count = 0;
if ((_Record._Estimated_Begin = _FindValueableFirst(BeginIter, EndIter)) == EndIter)
_Record._Estimated_End = EndIter;
else {
_Record._Estimated_Count += *_Record._Estimated_Begin;
_Record._Estimated_End = std::next(_Record._Estimated_Begin);
}
_Record.push();
while (_Record._Estimated_End != EndIter) {
_Record._Estimated_Count += *(_Record._Estimated_End++);
if (_Record._Estimated_Count < 0) {
if ((_Record._Estimated_Begin = _FindValueableFirst(_Record._Estimated_End, EndIter)) == EndIter)
break;
_Record._Estimated_Count = *_Record._Estimated_Begin;
_Record._Estimated_End = std::next(_Record._Estimated_Begin);
}
if (_Record.cTruthCount() <= _Record._Estimated_Count)
_Record.push();
}
return _Record;
}
};
void showAlgo(size_t Size) {
//Macro
using value_type = double;
using Container = std::vector<value_type>;
//Init Variate
Container Vector;
Vector.reserve(Size);
std::default_random_engine Seed((unsigned int)time(NULL));
std::normal_distribution<value_type> Distribution(1.0, 5.0);
auto Random = std::bind(Distribution, std::ref(Seed));
//Assign
for (size_t i = 0; i < Size; ++i)
Vector.push_back(Random());
/*//Output
std::ostream_iterator<double> OutIter(std::cout, " ");
std::copy(Vector.begin(), Vector.end(), OutIter);
std::cout << std::endl;*/
//Algorithm
clock_t BnTime, EdTime;
BnTime = clock();
auto Get = MaximumSubRange()(Vector.begin(), Vector.end());
EdTime = clock();
std::cout << R"( All Size: )" << Size << std::endl
<< R"( Count: )" << Get.cTruthCount() << std::endl
<< R"( Begin Pos: )" << std::distance(Vector.begin(), Get.cTruthBegin()) << std::endl
<< R"( End Pos: )" << std::distance(Vector.begin(), std::prev(Get.cTruthEnd(), 1)) << std::endl
<< R"( Cost Time(ms): )" << EdTime - BnTime << std::endl;
//End
return;
}
int main() {
showAlgo(100000); //10W
system("pause");
return 0;
}
下载地址: https://pan.baidu.com/s/18u6mQtt9lXjWMNQJO8AtqA 密码: yuhi
修改时间:180522;