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

Это мое решение:

//n is a size of array a[]
for(int i = 0; i < n ; i++){
  if (_max < a[i]) _max = a[i];
  if (_min > a[i]) _min = a[i];
}

Пусть f (n) - это номер условного оператора в этом цикле for (исключая сравнение переменной i). Так что стоит:

  • n время для сравнения _max с [i]
  • время сравнения _min с [i]

Итак, f (n) = 2n.

Мой друг написал такой код:

for(int i = 0; i < n-1; i+=2)
  if (a[i] < a[i+1]){
    if (_max < a[i+1]) _max = a[i+1];
    if (_min > a[i]) _min = a[i];
  }
  else{
    if (_max < a[i]) _max = a[i];
      if (_min > a[i+1]) _min = a[i+1];
  }
// Compare one more time if n is odd
if (n % 2 == 1){
  if (_min > a[n-1]) _min = a[n-1];
  if (_max < a[n-1]) _max = a[n-1];
}

Мы можем легко получить f '(n) = 3n / 2 + 3. Кажется, что f' (n)

Но мой учитель требует, чтобы f (n) = n или f (n) = n + a, где a является const.

Есть какие-нибудь идеи?

3
Le Duong Tuan Anh 28 Май 2017 в 12:48

2 ответа

Лучший ответ

Нет. Невозможно найти как максимальное, так и минимальное значение в точно n (или n + a) сравнениях. Для этого потребуется как минимум 3n / 2 - 2 сравнения. Смотрите это доказательство и это доказательство. Может быть, вы можете показать эти доказательства своему учителю ...

Есть ли другие намеки на последовательность? Как это равномерно распределено или такое?

1
TsReaper 28 Май 2017 в 10:23

Когда n большой, f '(n) = f (n), потому что оба имеют O (n) временную сложность.

Тем не менее, кажется, что вам нужно найти min и max один раз, поэтому ваш алгоритм со сложностью времени O (n) в порядке, так как сортировка Flash также стоит O (n), поэтому во всей сложности времени будет доминировать O (n). ) .

Другими словами:

OverallTime = FindMinMax + FlashSort
OverallTime = O(n) + O(n)
OverallTime = 2*O(n)
OverallTime = O(n)

Даже если FindMinMax был быстрее, второй термин сортировки Flash все равно доминирует в общей сложности времени.


Если вы должны сделать это быстрее, вы можете создать структуру данных, которая называется Дерево сегментов, который:

использует O (n log n) хранилище и может быть встроено за O (n log n) времени. Деревья сегментов поддерживают поиск всех интервалов, которые содержат точку запроса в O (log n + k), где k - это количество найденных интервалов или сегментов.

0
gsamaras 28 Май 2017 в 10:02