Меня спросили в интервью, какой самый короткий или быстрый способ найти дубликат в массиве n элементов, которые могут быть целыми или поплавками. Хотя при поиске в переполнении стека есть решение, в частности, с использованием python, но если бы я хотел реализовать то же самое на некоторых языках программирования, таких как C или C++, какой алгоритм я могу использовать или есть ли способ, которым я мог бы это сделать в O (Н)?Самый быстрый способ найти дубликат в массиве
ответ
Хотя это может быть не самый эффективный с точки зрения пространства алгоритм, вы можете использовать хэш-карту для хранения каждого значения (ключа), с которым вы столкнулись при перемещении массива. Затем для каждого шага по вашему массиву вы будете выполнять поиск O (1) в своей хеш-таблице, чтобы увидеть, видели ли вы это значение раньше. Это решение - O (N), потому что вы перемещаете массив размера N только один раз, и на каждом шаге вы выполняете поиск хэша O (1).
Вот метод в C++, который реализует это:
#include <map>
bool hasDupicate(int* input, int size) {
std::map<int, int> m;
for (int i=0; i < size; ++i) {
if (m.find(input[i]) != m.end()) {
return true;
} else {
// record the element you just saw in the map
m.insert(std::pair<int, int>(input[i], 1));
}
}
// could not find any duplicate
return false;
}
Большинство языков поддерживают также структуру данных HashSet. Кроме того, в качестве небольшой детали амортизированный поиск O (1) предполагает, что элементы хэшируются в ведрах «хорошо». Большинство API-интерфейсов позволяют дать начальную оценку размера/размера, чтобы убедиться, что поиск равен O (1). – uberwach
@Tim будет программа займет много времени, чтобы сохранить данный массив снова в hashmap? –
И теперь, в качестве эксперимента, попробуйте сравнить производительность этой проверки на основе карты с простой реализацией, которая просто: a) сортирует массив на месте b) проверяет смежные элементы, равные Во многих случаях во многих случаях накладные расходы создания элементов хэш-карты (особенно для std :: map, которая действительно является деревом RB) будет доминировать над затратами, а простая сортировка и проверка (хотя и асимптотически хуже) будут иметь лучшую производительность. – Krystian
Поскольку Тим спросил о решении с сортировкой, здесь
bool hasDuplicate(std::vector<int> & input)
{
std::sort(input.begin(), input.end());
return std::adjacent_find(input.begin(), input.end()) != input.end();
}
int main() {
std::vector<int> A { 2, 4, 9, 3, 8, 4, 5, 1 };
std::cout << hasDuplicate(A) ? "has duplicates" : "no duplicates";
return 0;
}
Это время сложность O (N журнал N) и переупорядочивает элементы входной последовательности, но не требует дополнительных распределений памяти, поэтому во многих практических случаях она может быть быстрее, чем асимптотически быстрый алгоритм O (n) с использованием хеш-таблиц, приведенных выше Тимом.
- 1. Самый быстрый способ поиска результата в массиве
- 2. Самый быстрый способ определения смещения в массиве
- 3. Самый быстрый способ найти товар в списке?
- 4. Самый быстрый способ найти, существует ли элемент в несортированном массиве?
- 5. Самый быстрый способ найти индексы состояния в массиве numpy
- 6. Быстрый способ найти самый большой массив в многомерном массиве?
- 7. Самый быстрый способ найти 2 недостающих числа в массиве
- 8. Самый быстрый способ найти уникальные значения в массиве
- 9. Самый быстрый способ найти NSManagedObject в NSSet
- 10. Самый быстрый способ найти строку в C#?
- 11. Самый быстрый способ найти подстроку в JAVA
- 12. Самый быстрый способ найти отличные совпадающие записи
- 13. Самый быстрый способ найти следующий дневной список
- 14. Самый быстрый способ найти ближайший пункт назначения
- 15. MongoDB найти и удалить - самый быстрый способ
- 16. Самый быстрый способ найти источник компонента?
- 17. Самый быстрый способ найти время разности
- 18. Самый быстрый способ найти строку внутри файла
- 19. Самый быстрый способ найти поворот вектора
- 20. Самый быстрый способ найти знак разного квадрата
- 21. Самый быстрый способ найти факторы заданного числа
- 22. Самый быстрый способ найти двоичную базу
- 23. Самый быстрый способ Алгоритм
- 24. Самый быстрый способ нахождения числа различных элементов в массиве
- 25. Самый быстрый способ хранения и доступа к строкам в массиве
- 26. Самый быстрый способ получить количество уникальных элементов в массиве javascript
- 27. Самый быстрый способ найти совпадающее значение в массивах 2d
- 28. Самый быстрый способ найти строку в массив строк
- 29. Самый быстрый способ поиска массива для совпадений в другом массиве
- 30. Objective-C Самый быстрый способ найти ближайший NSDate в NSArray
Самый быстрый способ, который я могу сделать, - сделать один проход, бросив каждый элемент в кучу и проверив, как вы идете. Это будет N * log (N) – stark
Дубликат или все дубликаты? –
один ... но я хочу, как это сделать для всех ... –