Какова будет сложность операции по удалению элемента из конца односвязного списка? - PullRequest
2 голосов
/ 10 августа 2010

Какова будет сложность операции по удалению элемента из конца односвязного списка?Я реализовал связанный список в C. Вот код для удаления элемента из конца связанного списка.Теперь мой вопрос заключается в том, как рассчитать сложность этого фрагмента.Какие факторы участвуют.Есть и другие операции, такие как

  1. Вставка в начале
  2. Вставка в середине
  3. Вставка в конце
  4. Удаление в начале, середине, конце
  5. Перевернуть список

Как я смогу их вычислить?

struct node {
       int val;
       struct node * next;
    };

    typedef struct node item;
    item * head = NULL;

 /* DELETION AT THE END OF THE LIST */     
        deleteatend() {
        item * temp, * curr;
        if(head == NULL) {
            printf("\n Linked list is Empty ");
            return;
          }
        temp = head;
        if(head->next == NULL) { /* When There is atleast 1 NODE */
            head=NULL;
         } 
        else {
            while(temp->next != NULL) { /* Traversing the list upto second-last NODE */ 
              curr=temp;
              temp=temp->next;
              } 
            curr->next =NULL;  /* When TEMP points to last NODE */ 
        }
        free(temp);
       }    

код для Перевернуть список:

 /* Reverse Printing of list */
      reverselist() {
          item * curr, * nextnode, * prev;
          curr = head;
          nextnode = curr-> next; /* NEXTNODE traverses till the end of the list */
          prev = NULL;
          curr-> next = NULL; /* Making the first Node as Last node */
          while(nextnode != NULL) {
            prev = curr; /* Generally holding the last element of the reversed list */
            curr = nextnode; 
            nextnode = curr-> next;
            curr-> next = prev;
           } /* End of WHILE */
          head = curr;
        }  

Ответы [ 3 ]

5 голосов
/ 10 августа 2010

Я дам несколько рецептов кухни, чтобы выяснить (кажущуюся) сложность алгоритма. Это не является математически строгим, для этого вам придется консультироваться со своими учебниками.

  1. Найдите параметры, от которых зависит ваш анализируемый код. N для количества элементов вашего списка. Другие алгоритмы имеют другие параметры, количество символов, количество элементов в массиве.

  2. Найдите петли. Посмотрите, от какого параметра они зависят.

    1. Чтобы вставить первый элемент списка, цикл не требуется, поэтому эта же операция выполняется, если ваш список содержит 1 или 1 миллиард элементов.

    2. Чтобы вставить в середину, вам нужно один раз полностью пройти цикл по списку, и в зависимости от того, как вы его реализуете, вы должны сделать второй цикл до середины, чтобы у вас было 1,5 раза N итераций. Сложность зависит только от длины списка, поэтому его сложность составляет O (N). Если вы реализуете его только одним циклом, у вас будет N итераций и сложность O (N). Выбор способа его реализации может зависеть от индивидуального времени каждой итерации (и времени для его реализации).

    3. То же, что и выше, вы должны пройти весь список один раз, поэтому сложность O (N).

    4. То же, что и для вставки.

    5. Чтобы перевернуть список, вам нужно всего лишь один раз пройти по списку, чтобы снова сложность O (N).

    6. Просто для примера другой сложности. Если вы хотите исключить все двойные записи из вашего списка. Вы должны проверить для каждого элемента, равен ли он любому другому элементу списка, это означает, что вы должны пройтись по всем элементам, взять элемент и сравнить его с любым другим элементом в списке. В худшем случае в списке нет двойников, то есть список не сжимается, поэтому вы, скорее всего, будете иметь N * (N-1) сравнений. В нотации O(N*(N-1)) = O(N²-N) доминирует, поэтому мы имеем сложность O(N²) квадратичного алгоритма.

PS: я написал в начале apparent, потому что иногда в зависимости от N есть термины, которые не видны в самой программе, но являются частью абстракции, над которой вы работаете. В случае с вашим списком, если он становится настолько большим, что ваша система начинает обмениваться, вы сталкиваетесь с одним из тех скрытых терминов реальной сложности, который был похоронен в абстракции виртуальной памяти вашей операционной системы.

0 голосов
/ 10 августа 2010

Со списком оно линейно длине списка, поэтому Θ (n), а прямой доступ, как и массив, равен Θ (1).

0 голосов
/ 10 августа 2010

Сложность операции простого связанного списка постоянна, если она реализована без цикла или рекурсии, и линейна, если реализована с помощью цикла.

...