Блог пользователя Easy_

Автор Easy_, 10 лет назад, По-русски

Господа, есть отсортированный вектор V из 10^7 элементов.

Например:

0 0 1 1 1 2 3 4 4 5 ...

Далее первый элемент вектора увеличивается на K, после чего вектор должен быть отсортирован.

Хотел бы узнать, какой из следующий методов является быстрее:

1)

V[0] += K;
sort(V.begin(), V.end());

2)

V[0] += K; i = 0;
while(A[i] > A[i + 1] && i < N - 1)
        swap(A[i], A[i + 1]), i++;

3)

V[0] += K;
Через модифицированный бинарный поиск найти индекс **ind** куда можно вставить наш элемент
V.insert(ind, V[0]);
V.erase(V.begin());

4) Ваш вариант.

Буду благодарен.

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

»
10 лет назад, # |
Rev. 4   Проголосовать: нравится +8 Проголосовать: не нравится

1) 2) O(n) 3) 4) использовать список

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо, а как вы хотите со списком? можно пожалуйста пример?

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Да ступил, список будет за O(n).

      Можно multiset использовать, тогда удаление и вставка будет за

      tmp = *mst.begin() + K;

      mst.erase(mst.begin());

      mst.insert (tmp);

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        так как мы увеличиваем только первый элемент, достаточно очереди с приоритетами:

        priority_queue<int, vector<int>, greater<int>> q;
        //...
        q.push(q.top() + K);
        q.pop();
        
      • »
        »
        »
        »
        10 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

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

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Обычно черно-красное (самобалансирующееся бинарное) дерево

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Если все время нужно получать только самый большой элемент, лучше всего реализовывать двоичную кучу. Она же (скорее всего) реализована в priority_queue. Можете посмотреть ее реализацию вручную: 7099319, задча 446B - DZY любит модификации.