Каталог статей
тема первая
01. Настройте эффективный алгоритм для обращения всех элементов списка последовательностей L, требуя, чтобы его пространственная сложность была равна O (1).
Анализ идеи
- Прежде всего, согласно требованиям темы, пространственная сложность равна O(1), поэтому построение алгоритма с низкой временной сложностью невозможно реализовать путем замены пространства на время .
- Затем мы можем рассмотреть возможность использования идеи алгоритма двойных указателей , установить два указателя так, чтобы они указывали на элемент заголовка и элемент хвоста таблицы последовательности соответственно, а затем реализовать обмен элементами с помощью вспомогательного пространства постоянного уровня. Когда два указателя встречаются (или не совпадают), запустите алгоритм.
- В соответствии с вышеописанными этапами операции инверсия элементов может быть реализована путем перемещения элементов 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 в линейной таблице.
Анализ идеи
- Прежде всего, есть два шага для удаления указанного элемента: найти позицию указанного элемента и удалить указанный элемент.
- Затем запрос указывает, что элемент не может использовать свойство произвольного доступа упорядоченного списка, поскольку элементы в упорядоченном списке заранее неизвестны. Если один элемент найден, а затем один элемент удален, ni элементов необходимо переместить вперед на одну позицию, поэтому трудно достичь временной сложности O (n) для завершения вышеуказанной операции.
- Поэтому, обращаясь к идее алгоритма быстрой сортировки, мы делим всё на левую и правую подпоследовательности, помещаем удаляемые элементы во вторую половину таблицы последовательности, а неудаляемые элементы помещаем в первую половину. таблицу последовательности. Найдя все элементы в таблице последовательности воспроизведения, удалите вторую половину элементов, которые необходимо удалить равномерно.На этом этапе все указанные элементы в таблице последовательностей могут быть удалены, временная сложность равна 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;
}