【Обучение алгоритмам: линейные таблицы】День 02

тема первая

01. Настройте эффективный алгоритм для обращения всех элементов списка последовательностей L, требуя, чтобы его пространственная сложность была равна O (1).

Анализ идеи

  1. Прежде всего, согласно требованиям темы, пространственная сложность равна O(1), поэтому построение алгоритма с низкой временной сложностью невозможно реализовать путем замены пространства на время .
  2. Затем мы можем рассмотреть возможность использования идеи алгоритма двойных указателей , установить два указателя так, чтобы они указывали на элемент заголовка и элемент хвоста таблицы последовательности соответственно, а затем реализовать обмен элементами с помощью вспомогательного пространства постоянного уровня. Когда два указателя встречаются (или не совпадают), запустите алгоритм.
  3. В соответствии с вышеописанными этапами операции инверсия элементов может быть реализована путем перемещения элементов n/2 раз.

Код

int LinearList::Question_02()
{
    
    
    int i = 0,j = arr.length-1;//设置两个哨兵分别指向顺序表arr的表头和表尾元素
    int temp; //辅助交换变量
    while(i < j)//结束循环条件
    {
    
    
        temp = 0;//初始化
        temp = arr.data[i];//交换元素
        arr.data[i++] = arr.data[j];
        arr.data[j--] = temp;
    }
    return 0;
}

Эффект

вставьте сюда описание изображения

Тема вторая

02. Для таблицы последовательностей L длины n напишите алгоритм с временной сложностью O(n) и пространственной сложностью O(1). Этот алгоритм удаляет все элементы данных со значением x в линейной таблице.

Анализ идеи

  1. Прежде всего, есть два шага для удаления указанного элемента: найти позицию указанного элемента и удалить указанный элемент.
  2. Затем запрос указывает, что элемент не может использовать свойство произвольного доступа упорядоченного списка, поскольку элементы в упорядоченном списке заранее неизвестны. Если один элемент найден, а затем один элемент удален, ni элементов необходимо переместить вперед на одну позицию, поэтому трудно достичь временной сложности O (n) для завершения вышеуказанной операции.
  3. Поэтому, обращаясь к идее алгоритма быстрой сортировки, мы делим всё на левую и правую подпоследовательности, помещаем удаляемые элементы во вторую половину таблицы последовательности, а неудаляемые элементы помещаем в первую половину. таблицу последовательности. Найдя все элементы в таблице последовательности воспроизведения, удалите вторую половину элементов, которые необходимо удалить равномерно.На этом этапе все указанные элементы в таблице последовательностей могут быть удалены, временная сложность равна O(n), а пространственная сложность равна O(1).

Код

int LinearList::Question_03(int x)
{
    
    
    int del = 0;//记录删除元素个数
    int i = 0,j = arr.length-1;//设置两个指针分别指向顺序表arr的表头和表尾
    int temp = 0;//辅助交换变量
    while(i < j)//将所有需删除的元素全部交换到顺序表后部,最后统一删除
    {
    
    
        if(arr.data[i] != x)
            i++;
        if(arr.data[j] == x)
        {
    
    
            del++;
            j--;
        }
        if(arr.data[i] == x && arr.data[j] != x)
        {
    
    
            del++;
            temp = arr.data[i];
            arr.data[i++] = arr.data[j];
            arr.data[j--] = temp;
        }
    }
    cout<<"del:"<<del<<endl;
    arr.length -= del;
    return 0;
}

Эффект

вставьте сюда описание изображения

Supongo que te gusta

Origin blog.csdn.net/wddkxg/article/details/131561134
Recomendado
Clasificación