Решаю этот вопрос на leetcode ссылка
Это мое рабочее решение с использованием неупорядоченной карты, которая дает мне TLE, а использование вектора векторов проходит все тестовые случаи.
Они оба работают по одной и той же логике, тогда почему использование неупорядоченной карты дает мне TLE?
class Solution {
public:
int longestArithSeqLength(vector<int>& a) {
// vector of umaps
vector<unordered_map<int, int>> aux(a.size());
// iterate array
int n = a.size();
int ans = INT_MIN;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < i; ++j)
{
int currdiff = a[j] - a[i];
unordered_map<int, int> &umapj = aux[j];
unordered_map<int, int> &umapi = aux[i];
umapi[currdiff] = umapj[currdiff] + 1;
if (umapi[currdiff] > ans)
{
ans = umapi[currdiff];
}
}
}
return ans+1;
}
};
код с использованием вектора:
class Solution {
public:
int longestArithSeqLength(vector<int>& A) {
int n = A.size();
vector<vector<int>> dp(n, vector<int> (1005, 1));
int maxLen = 1;
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
int d = A[j] - A[i];
dp[i][d + 500] = dp[j][d + 500] + 1;
maxLen = max(maxLen, dp[i][d + 500]);
}
}
return maxLen;
}
};
Лучший ответ от Почему вектор быстрее, чем unordered_map?
Первое, что нужно отметить, это то, что хотя среднее время запроса unordered_map является постоянным, в худшем случае это не O(1). Как вы можете видеть здесь, он на самом деле возрастает до порядка O(N), где N обозначает размер контейнера.
Во-вторых, поскольку вектор выделяет последовательные части памяти, доступ к этой памяти очень эффективен и на самом деле является постоянным, даже в худшем случае. (т. е. простая арифметика указателя, в отличие от вычисления результата более сложной хеш-функции). Существует также возможность различных уровней кэширования последовательной памяти, которая может быть задействована (т. е. в зависимости от платформы, на которой работает ваш код), которая может сделать выполнение кода с использованием вектора еще быстрее по сравнению с тем, который использует unordered_map.
По сути, с точки зрения сложности производительность вектора в наихудшем случае более эффективна, чем у unordered_map. Кроме того, большинство аппаратных систем предлагают такие функции, как кэширование, которые дают еще большее преимущество при использовании вектора. (т.е. меньшие постоянные коэффициенты в операциях O (1))