我目前正在處理來自hackerrank的一個問題,而且我正在考慮我的問題的時間限制。我似乎無法弄清楚爲什麼。循環/方法太慢
輸出具有最小差異的數字對。如果有多個對,則按升序輸出所有對,全部在同一行(連續),每對數之間只有一個空格。如果有一對數字位於兩對中,則打印兩次(參見樣本案例#3以獲得解釋)。
輸入 數量包含所有由空格隔開的字符串的元素
樣品:
4
5 4 3 2
輸出:
2 3 3 4 4 5
測試情況下,我失敗上具有100000級的輸入。我計算了我的代碼,並且我的代碼中最慢的部分是函數closest
中的循環。我原本有一個向量,然後在列表後使用std:sort。然後我嘗試使用multiset而不是調用std :: sort來嘗試並提高我的性能。它仍然沒有通過測試。有關如何改進closest
或addPair
方法中循環的任何想法?
#include <iostream>
#include <set>
#include <utility>
#include <cmath>
#include <string>
#include <algorithm>
#include <ctime>
#define NUMBER 10000
double diffclock(clock_t clock1, clock_t clock2)
{
double diffticks = clock1 - clock2;
double diffms = (diffticks)/(CLOCKS_PER_SEC/NUMBER);
return diffms;
}
class ClosestPair
{
private:
long _distance;
const char UNSET = -1;
std::multiset<int> _list;
long getDistance(const int number1, const int number2) const;
public:
ClosestPair();
~ClosestPair();
void addPair(const int number1, const int number2);
const std::multiset<int>& getList() const;
const std::string toString() const;
void sort();
};
ClosestPair::ClosestPair()
{
_distance = UNSET;
}
ClosestPair::~ClosestPair()
{
}
void ClosestPair::addPair(const int number1, const int number2)
{
long distance = getDistance(number1, number2);
if(distance < _distance || _distance == UNSET)
{
_list.clear();
_distance = distance;
//std::pair<int, int> newPair(number1, number2);
//_list.push_back(newPair);
_list.insert(number1);
_list.insert(number2);
}
else if(distance == _distance)
{
_list.insert(number1);
_list.insert(number2);
//std::pair<int, int> newPair(number1, number2);
//_list.push_back(newPair);
}
}
inline long ClosestPair::getDistance(const int number1, const int number2) const
{
return std::abs(number1 - number2);
}
const std::multiset<int>& ClosestPair::getList() const
{
return _list;
}
const std::string ClosestPair::toString() const
{
std::string allPairs;
for(auto iterator = _list.begin(); iterator != _list.end(); iterator++)
{
allPairs += std::to_string(*iterator);
allPairs += " ";
//allPairs += std::to_string(iterator->second);
//allPairs += " ";
}
if(allPairs.size() > 0)
{
allPairs.substr(0, allPairs.size() - 1);
}
return allPairs;
}
void ClosestPair::sort()
{
//std::sort(_list.begin(), _list.end());
}
void closest(int* array, int size)
{
ClosestPair closestPairs;
clock_t begin = clock();
for(int i = 0; i < size; i++)
{
for(int j = i + 1; j < size; j++)
{
closestPairs.addPair(array[i], array[j]);
}
}
clock_t end = clock();
std::cout << "AddPair time: " << diffclock(end, begin) << " ms." << std::endl;
//closestPairs.sort();
begin = clock();
std::cout << closestPairs.toString();
std::cout << "toString time: " << diffclock(end, begin) << " ms." << std::endl;
end = clock();
}
int main()
{
int sizeOfList;
std::string allNumbers;
std::cin >> sizeOfList >> std::ws;
std::getline(std::cin, allNumbers);
size_t position = 0;
size_t nextPosition = 0;
int count = 0;
int array[sizeOfList];
clock_t begin = clock();
do
{
position = nextPosition;
nextPosition = allNumbers.find(' ', position + 1);
if(position > 0)
position++;
array[count] = atoi(allNumbers.substr(position, nextPosition - position).c_str());
count++;
}
while(nextPosition != std::string::npos);
clock_t end = clock();
std::cout << "Tokenize time: " << diffclock(end, begin) << " ms." << std::endl;
closest(array, sizeOfList);
return 0;
}
_'Any關於如何改善衣櫃中的循環,或方法addPair?'的想法_使用一個體面的分析器,並檢查你的瓶頸在哪裏? –
從你編寫代碼的方式很難說,但看起來你基本上是在做一個冒泡排序。對於100,000個項目,這將是100,000 * 100,000次迭代,這對於大多數這些編碼問題站點來說很可能會超過60秒的限制。 –
更好地解釋問題。我不知道你想解決的問題是從你的描述中得到的。 – Yakk