Я читал это question. Выбранный ответ содержит следующие два алгоритма. Я не мог понять, почему первая сложность времени - O (ln (n)). В худшем случае, если массив не содержит никаких дубликатов, он будет циклически n раз, а второй. Я ошибаюсь или что-то не хватает? СпасибоПочему следующие два дублирующих алгоритма поиска имеют разную временную сложность?
1) быстрее (в пределе) способ
Вот подход, основанный хэш. Вы должны платить за автобоксинг, но это O (ln (n)) вместо O (n2). Предприимчивый душа бы найти примитивный ИНТ на основе хэш-набор (Apache или Google Collections имеет такую вещь, мне кажется.)
boolean duplicates(final int[] zipcodelist)
{
Set<Integer> lump = new HashSet<Integer>();
for (int i : zipcodelist)
{
if (lump.contains(i)) return true;
lump.add(i);
}
return false;
}
2) Поклон HuyLe
ответзнакомства HuyLe для более или менее O (п) решение, которое я думаю, потребности пару из add'l шагов:
static boolean duplicates(final int[] zipcodelist) {
final int MAXZIP = 99999;
boolean[] bitmap = new boolean[MAXZIP+1];
java.util.Arrays.fill(bitmap, false);
for (int item : zipcodeList)
if (!bitmap[item]) bitmap[item] = true;
else return true;
}
return false;
}
Я думаю, что для «более быстрого (предельного) пути» автор опечатал и должен был написать «O (n * log (n))», то есть то, что вы получили от, например. набор, поддерживаемый сбалансированным двоичным деревом поиска. Совершенно очевидно, что не может быть пути быстрее, чем «O (n)». –
Я не получил часть журнала (n). – WowBow
В сбалансированном BST вставка и поиск - 'O (log (size))', поэтому, если вы выполняете 'n' поиск и вставки, вы выполняете операции' O (n * log n) '. Я предполагаю, что здесь выходит журнал. –