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

Если я напишу отдельный метод, который сначала использует алгоритм сортировки для сортировки массива, а затем возвращает наименьшее значение, повлияет ли это на временную сложность алгоритма?

Вот мой код:

private static int nonSmallestElement(int[] array) {
    int smallest = smallestElement(array);
    int index = (int) (array.length * Math.random());
    System.out.println("Index = " + index);
    for (int i = index; i < array.length; i++) {
        if (array[i] != smallest) {
            return array[i];
        }
    }
    return array[1];
}

private static int smallestElement(int[] array) {
    Arrays.sort(array);
    return array[0];
}

Здесь метод Arrays.sort() использует алгоритм быстрой сортировки Dual-Pivot, который равен O (n log (n)). Означает ли это, что метод nonSmallestElement() также принимает эту временную сложность, или это O (1), потому что ему не нужно обрабатывать сортировку?

1
PumpkinBreath 7 Ноя 2018 в 03:49

1 ответ

Лучший ответ

Вы правы, вам нужно посчитать все действия, чтобы вычислить сложность алгоритма. Но вы должны знать правила, например, чем больше, тем меньше (другие примеры). В вашем случае вы вызываете smallestElement() один раз - O (nlogn), а затем имеете цикл O (n). В результате общая сложность составит O (n + nlogn). Но последняя сложность nonSmallestElement() - O (nlogn), потому что nlogn больше.

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


Обновление из комментариев:

Вот подсказка: если у вас есть два разных значения, то большее из них не должно быть наименьшим значением в массиве. Для «типичного» массива вы ожидаете найти два различных значения в любых двух элементах. @ Джеймс К. Полк

1
uli 7 Ноя 2018 в 01:25