Вектор переупорядочивания использование вектора индексов

когда вы отправляете объект с помощью post, он преобразуется в строку, поэтому вы фактически отправляете конечную точку API:

JSON.stringify(JSON.stringify({ username: "username", password: "password" }))

в этом нет необходимости

[ 115] Кроме того, вы не отправляете тело как часть заголовков.

https://github.com/axios/axios#request-method-aliases

axios.post (url [, data [, config]] ])

blockquote>

в вашем случае это означает, что вы отправляете три аргумента: URL, затем данные, а затем параметры. Поскольку единственный отправляемый вами заголовок - это данные json, и axios может позаботиться об этом за вас, опции в этом случае не нужны, поэтому вы можете использовать только первые два параметра

axios
    .post(
      "http://localhost:3010/user/login",
      {
         username: "username",
         password: "password" 
      }
    )
    .then(response => {
      this.resp = response;
    })
    .catch(e => {
      console.error(e);
    });

34
задан Marc Eaddy 19 August 2009 в 23:03
поделиться

8 ответов

Я улучшил алгоритм chmike. Эта функция совпадает с его для всех 11! перестановки (0..10) передаются как вектор переупорядочения. Также он не изменяет вектор переупорядочения.

template< class T >
void reorder(vector<T> &v, vector<size_t> const &order )  {   
    for ( int s = 1, d; s < order.size(); ++ s ) {
        for ( d = order[s]; d < s; d = order[d] ) ;
        if ( d == s ) while ( d = order[d], d != s ) swap( v[s], v[d] );
    }
}

Вот версия в стиле STL, над которой я приложил немного больше усилий. Это примерно на 47% быстрее (то есть почти в два раза быстрее (0..10)!), Потому что он выполняет все свопы как можно раньше, а затем возвращается. Вектор переупорядочения состоит из ряда орбит, и каждая орбита переупорядочивается по достижении своего первого члена. Это быстрее, когда последние несколько элементов не содержат орбиты.

template< typename order_iterator, typename value_iterator >
void reorder( order_iterator order_begin, order_iterator order_end, value_iterator v )  {   
    typedef typename iterator_traits< value_iterator >::value_type value_t;
    typedef typename iterator_traits< order_iterator >::value_type index_t;
    typedef typename iterator_traits< order_iterator >::difference_type diff_t;

    diff_t remaining = order_end - 1 - order_begin;
    for ( index_t s = index_t(), d; remaining > 0; ++ s ) {
        for ( d = order_begin[s]; d > s; d = order_begin[d] ) ;
        if ( d == s ) {
            -- remaining;
            value_t temp = v[s];
            while ( d = order_begin[d], d != s ) {
                swap( temp, v[d] );
                -- remaining;
            }
            v[s] = temp;
        }
    }
}

И, наконец, чтобы ответить на вопрос раз и навсегда, вариант, который действительно уничтожает вектор переупорядочения. (Оно заполняется цифрами -1.) Это примерно на 16% быстрее, чем в предыдущей версии. Здесь используется уродливое приведение типов, но смирись с этим. Это покрывает 11! ~ = 40 миллионов перестановок 11 символов за 4,25 секунды, не считая накладных расходов, на моем ноутбуке с тактовой частотой 2,2 ГГц.

template< typename order_iterator, typename value_iterator >
void reorder_destructive( order_iterator order_begin, order_iterator order_end, value_iterator v )  {
    typedef typename iterator_traits< value_iterator >::value_type value_t;
    typedef typename iterator_traits< order_iterator >::value_type index_t;
    typedef typename iterator_traits< order_iterator >::difference_type diff_t;

    diff_t remaining = order_end - 1 - order_begin;
    for ( index_t s = index_t(); remaining > 0; ++ s ) {
        index_t d = order_begin[s];
        if ( d == (diff_t) -1 ) continue;
        -- remaining;
        value_t temp = v[s];
        for ( index_t d2; d != s; d = d2 ) {
            swap( temp, v[d] );
            swap( order_begin[d], d2 = (diff_t) -1 );
            -- remaining;
        }
        v[s] = temp;
    }
}
27
ответ дан 27 November 2019 в 17:08
поделиться

Вот правильный код

void REORDER(vector<char>& vA, vector<size_t>& vOrder)  
{   
    assert(vA.size() == vOrder.size());

    // for all elements to put in place
    for( int i = 0; i < va.size() - 1; ++i )
    { 
        // while the element i is not yet in place 
        while( i != vOrder[i] )
        {
            // swap it with the element at its final place
            int alt = vOrder[i];
            swap( vA[i], vA[alt] );
            swap( vOrder[i], vOrder[alt] );
        }
    }
}

. Обратите внимание, что вы можете сохранить один тест, потому что, если n-1 элементов на месте, последний n-й элемент наверняка на месте.

На выходе vA и vOrder правильно упорядочены.

Этот алгоритм выполняет самое большее n-1 обмен, потому что каждый обмен перемещает элемент в его окончательное положение. И нам нужно будет сделать не более 2N тестов на vOrder.

5
ответ дан 27 November 2019 в 17:08
поделиться

Никогда не оптимизировать преждевременно. Измерьте, а затем определите, где вам нужно оптимизировать и что. Вы можете закончить сложным кодом, который трудно поддерживать и подвержен ошибкам во многих местах, где производительность не является проблемой.

С учетом вышесказанного не пессимизируйте досрочно. Без изменения кода вы можете удалить половину своих копий:

    template <typename T>
    void reorder( std::vector<T> & data, std::vector<std::size_t> const & order )
    {
       std::vector<T> tmp;         // create an empty vector
       tmp.reserve( data.size() ); // ensure memory and avoid moves in the vector
       for ( std::size_t i = 0; i < order.size(); ++i ) {
          tmp.push_back( data[order[i]] );
       }
       data.swap( tmp );          // swap vector contents
    }

Этот код создает и пустой (достаточно большой) вектор, в котором одна копия выполняется по порядку. В конце упорядоченные и оригинальные векторы меняются местами. Это уменьшит количество копий, но все равно потребует дополнительной памяти.

Если вы хотите выполнить перемещения на месте, простой алгоритм может быть следующим:

template <typename T>
void reorder( std::vector<T> & data, std::vector<std::size_t> const & order )
{
   for ( std::size_t i = 0; i < order.size(); ++i ) {
      std::size_t original = order[i];
      while ( i < original )  {
         original = order[original];
      }
      std::swap( data[i], data[original] );
   }
}

Этот код должен быть проверен и отлажен. Проще говоря, алгоритм на каждом шаге размещает элемент в i-й позиции. Сначала мы определяем, где оригинальный элемент для этой позиции теперь размещен в векторе данных. Если исходная позиция уже была затронута алгоритмом (она находится перед i-й позицией), то исходный элемент менялся местами в порядке [оригинальная] позиция. Опять же, этот элемент уже может быть перемещен ...

Этот алгоритм примерно равен O (N ^ 2) по числу целочисленных операций и, следовательно, теоретически хуже по времени выполнения по сравнению с исходным алгоритмом O (N). , Но это может компенсировать, если операции подкачки N ^ 2 (в худшем случае) стоят меньше, чем операции копирования N или если вы действительно ограничены объемом памяти.

этот элемент уже может быть перемещен ...

Этот алгоритм примерно равен O (N ^ 2) по числу целочисленных операций и, следовательно, теоретически хуже по времени выполнения по сравнению с исходным алгоритмом O (N). Но это может компенсировать, если операции подкачки N ^ 2 (в худшем случае) стоят меньше, чем операции копирования N или если вы действительно ограничены объемом памяти.

этот элемент уже может быть перемещен ...

Этот алгоритм примерно равен O (N ^ 2) по числу целочисленных операций и, следовательно, теоретически хуже по времени выполнения по сравнению с исходным алгоритмом O (N). Но это может компенсировать, если операции подкачки N ^ 2 (в худшем случае) стоят меньше, чем операции копирования N или если вы действительно ограничены объемом памяти.

1
ответ дан 27 November 2019 в 17:08
поделиться

Для итерации по вектору используется O (n) операция. Это своего рода трудно победить.

0
ответ дан 27 November 2019 в 17:08
поделиться

Следует избегать копирования вектора:

void REORDER(vector<char>& vA, const vector<size_t>& vOrder)  
{   
    assert(vA.size() == vOrder.size()); 
    for(int i = 0; i < vOrder.size(); ++i)
        if (i < vOrder[i])
            swap(vA[i], vA[vOrder[i]]);
}
-1
ответ дан 27 November 2019 в 17:08
поделиться

Ваш код взломан. Вы не можете назначить vA , и вам нужно использовать параметры шаблона.

vector<char> REORDER(const vector<char>& vA, const vector<size_t>& vOrder)  
{   
    assert(vA.size() == vOrder.size());  
    vector<char> vCopy(vA.size()); 
    for(int i = 0; i < vOrder.size(); ++i)  
        vCopy[i] = vA[ vOrder[i] ];  
    return vA;
} 

Вышеуказанное немного более эффективно.

0
ответ дан 27 November 2019 в 17:08
поделиться

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

3
ответ дан 27 November 2019 в 17:08
поделиться

You could do it recursively, I guess - something like this (unchecked, but it gives the idea):

// Recursive function
template<typename T>
void REORDER(int oldPosition, vector<T>& vA, 
             const vector<int>& vecNewOrder, vector<bool>& vecVisited)
{
    // Keep a record of the value currently in that position,
    // as well as the position we're moving it to.
    // But don't move it yet, or we'll overwrite whatever's at the next
    // position. Instead, we first move what's at the next position.
    // To guard against loops, we look at vecVisited, and set it to true
    // once we've visited a position.
    T oldVal = vA[oldPosition];
    int newPos = vecNewOrder[oldPosition];
    if (vecVisited[oldPosition])
    {
        // We've hit a loop. Set it and return.
        vA[newPosition] = oldVal;
        return;
    }
    // Guard against loops:
    vecVisited[oldPosition] = true;

    // Recursively re-order the next item in the sequence.
    REORDER(newPos, vA, vecNewOrder, vecVisited);

    // And, after we've set this new value, 
    vA[newPosition] = oldVal;
}

// The "main" function
template<typename T>
void REORDER(vector<T>& vA, const vector<int>& newOrder)
{
    // Initialise vecVisited with false values
    vector<bool> vecVisited(vA.size(), false);

    for (int x = 0; x < vA.size(); x++)
    {
        REORDER(x, vA, newOrder, vecVisited);
    }
}

Of course, you do have the overhead of vecVisited. Thoughts on this approach, anyone?

0
ответ дан 27 November 2019 в 17:08
поделиться
Другие вопросы по тегам:

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