Найдите всех пар целых чисел в массиве, которые суммируют к заданному значению

Я думал, что буду использовать log4j - как упомянуто @ScArcher2, просто потому что все делают. Но после контакта с обеими опциями, я узнал, что java.util.logging достаточно далек достаточный для большинства моих потребностей - и я говорю об огромной системе со многим сотрудничеством компонентов распространения.

Так, по-моему, нет никакой потребности использовать альтернативные сервисы. Java.util.logging достаточно мощен для большинства случаев.

24
задан Dukeling 16 June 2017 в 17:30
поделиться

3 ответа

Предположим, что требуемая сумма = R

  1. отсортируйте массив
  2. для каждого числа в массиве A (n), выполните двоичный поиск, чтобы найти число A (x) такое, что A (n) + A (x) = R
5
ответ дан 28 November 2019 в 22:22
поделиться

Как насчет сортировки массива, а затем перехода с обоих концов ?

6
ответ дан 28 November 2019 в 22:22
поделиться

Я не понимаю, почему подход с хеш-таблицей неэффективен, по крайней мере, с точки зрения анализа алгоритмов - по общему признанию, с точки зрения локальности памяти, это может быть довольно плохо. В любом случае, просканируйте массив дважды ...

Первое сканирование - поместите все элементы массива в хеш-таблицу - всего O (n). Отдельные вставки амортизируются только O (1), но аккуратная вещь о том, как работает амортизированный анализ, означает, что O (n) является абсолютным, а не амортизированным.

Второе сканирование - проверка (сумма - текущий) в хеш-таблице - O (n) всего.

Это превосходит методы сортировки и поиска O (n log n), по крайней мере, теоретически.

Затем обратите внимание, что вы можете объединить два сканирования в одно. Вы можете обнаружить пару, как только встретите вторую из этой пары во время первого сканирования. В псевдокоде ...

for i in array.range
  hashset.insert (array [i])

  diff = sum - array [i]
  if hashset.includes (diff)
    output diff, array [i]

Если вам нужны позиции элементов, используйте хэш-карту и сохраните в ней позиции элементов. Если вам нужно справиться с дублированием, вам может потребоваться сохранить счетчики в хэш-карте. Для позиций и дубликатов вам может понадобиться хэш-карта начальных указателей для связанных списков позиций.

Это делает предположения о реализации хеш-таблицы, но довольно безопасные, учитывая обычные реализации на большинстве современных языков и библиотек.

BTW - объединение сканированных изображений не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

вам может потребоваться хранить счетчики в хэш-карте. Для позиций и дубликатов вам может понадобиться хэш-карта начальных указателей для связанных списков позиций.

Это делает предположения о реализации хеш-таблицы, но довольно безопасные, учитывая обычные реализации на большинстве современных языков и библиотек.

BTW - объединение сканированных изображений не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

вам может потребоваться хранить счетчики в хэш-карте. Для позиций и дубликатов вам может понадобиться хэш-карта начальных указателей для связанных списков позиций.

Это делает предположения о реализации хеш-таблицы, но довольно безопасные, учитывая обычные реализации на большинстве современных языков и библиотек.

BTW - объединение сканированных изображений не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

вам может понадобиться хэш-карта начальных указателей для связанных списков позиций.

Это делает предположения о реализации хеш-таблицы, но довольно безопасные, учитывая обычные реализации в большинстве современных языков и библиотек.

Кстати - объединение сканирований не должно не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

вам может понадобиться хэш-карта начальных указателей для связанных списков позиций.

Это делает предположения о реализации хеш-таблицы, но довольно безопасные, учитывая обычные реализации в большинстве современных языков и библиотек.

Кстати - объединение сканирований не должно не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

но довольно безопасные, учитывая обычные реализации на большинстве современных языков и библиотек.

Кстати - объединение сканирований не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

но довольно безопасные, учитывая обычные реализации на большинстве современных языков и библиотек.

Кстати - объединение сканирований не следует рассматривать как оптимизацию. Накладные расходы на итерацию должны быть незначительными. Проблемы с локализацией памяти могут сделать один проход немного более эффективным для очень больших массивов, но реальные проблемы с локализацией памяти все равно будут в поисках по хеш-таблице.

ИМО единственная реальная причина для объединения сканирований заключается в том, что вы хотите, чтобы сообщалась только каждая пара один раз - обработка этого в подходе с двумя сканированиями была бы немного сложнее.

32
ответ дан 28 November 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: