Ребята .
У меня есть алгоритм с хорошим выбором времени, я должен изменить его, чтобы получить лучшее время, но я понятия не имею.
Ты можешь мне помочь?
Вот время:
- реальный 0m0.164s
- пользователь 0m0.021s
- sys 0m0.010s
Вот алгоритм:
def algo2(A, B):
x=0
y=0
for a in A:
m=0
for b in B:
if a == b:
m += 1
if m>y:
x = a
y = m
return x;
Вот массивы для алгоритма:
A = [1,2,3,4,5,6,7,8,9,0] B = [1,2,3,4,5,6,4,7,8,9,0]
1 ответ
Ваш алгоритм - O (n * m). Если массивы всегда сортируются, вы можете выполнить прямое слияние (O (n + m)), как показано ниже. (Обратите внимание, что код не на питоне ... Думаю, вы можете уловить идею и перевести ее)
ixA = 0
ixB = 0
maxVal = 0
maxCount = 0
workingVal = A[ixA]
workingCount = 0
while (ixA < A.length and ixB < B.length)
{
if (workingVal == B[ixB])
{
workingCount += 1
}
else if (workingCount > maxCount)
{
maxCount = workingCount
maxVal = workingVal
workingCount = 0
ixA += 1
workingVal = A[ixA]
}
ixB += 1
}
// have to check the last one
if (workingCount > maxCount)
{
maxCount = workingCount
maxVal = workingVal
}
Если массивы не отсортированы, вы можете сначала отсортировать их, а затем выполнить слияние. Это будет O (m log m) + O (n log n) + O (m + n). Это все равно лучше, чем твой O (m * n).
Похожие вопросы
Новые вопросы
arrays
Массив - это упорядоченная линейная структура данных, состоящая из набора элементов (значений, переменных или ссылок), каждый из которых идентифицируется одним или несколькими индексами. Когда вы спрашиваете о конкретных вариантах массивов, используйте вместо них следующие связанные теги: [vector], [arraylist], [matrix]. При использовании этого тега в вопросе, относящемся к языку программирования, пометьте вопрос используемым языком программирования.