Массивы и связанные списки часто используемых структур данных

1 Обзор

           Программа, запущенная на компьютере, на самом деле представляет собой поток данных. Проще говоря, из одного контейнера в другой есть две операции для хранения и извлечения данных, соответствующих данным. Итак, при выборе структуры данных нашим основным требованием является то, чтобы ее можно было установить, и тогда к ней было бы удобнее получить доступ. Например, нам нужно использовать корзину, чтобы покупать овощи, и ведро, чтобы принести воду. Не менее важно выбрать правильный контейнер для наших данных. Структуру данных и алгоритм можно рассматривать как причину, по которой программисты являются программистами. Я стараюсь сделать эту структуру данных более простой, чтобы сказать, давай! Олли дает.

2. Временная сложность

           Сложность времени - это упрощенное представление частоты выполнения программы, а не строго времени, и обычно частоты в наихудших условиях. Здесь используется нотация Big O, и основные шаги:

           1. Вычислить частотную функцию T (n)

           2. Сохраните элементы высшего порядка и удалите коэффициенты.

           3. Константа равна 1

           Обычно используемая временная сложность: постоянный порядок O (1), логарифмический порядок O (logn), линейный порядок O (n), линейный логарифмический порядок O (nlogn), квадратный порядок O (n ^ 2), кубический порядок O (n ^ 3), k квадратного порядка O (n ^ k), экспоненциального порядка O (2 ^ n)

1. Линейный стол

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

                

2. Массив

          Массив - это непрерывное пространство в памяти, после того как размер пространства определен, его нельзя изменить. Как видите, массив можно использовать для реализации последовательной структуры хранения линейной таблицы. Как показано на рисунке ниже, если вы хотите извлечь элемент из массива, сложность составит O (N).

                         

3. Связанный список

     1. Единый связанный список

             Связанный список представляет собой прерывистое пространство для хранения, поэтому его размер можно динамически изменять. Итак, как связать элементы в связанном списке? Таким образом, каждое из наших местоположений должно содержать две переменные: одна для хранения значения текущего элемента, а другая для хранения адреса следующего элемента. Таким образом, каждый узел достигает следующего узла, и все узлы могут быть соединены как единое целое. Связанный список очень гибкий, а сложность доступа к элементам составляет O (N / 2). Далее используется код Python для реализации одностороннего списка, который реализует базовую проверку добавления, удаления и модификации.

class Node(object):
    def __init__(self,elem):
        self.elem = elem
        self.next = None
class SingleLinkList(object):
    def __init__(self,node=None):
        #双下划线开头表示私有成员,不可以直接访问,必须通过class进行访问
        self.__head = None
    #计算长度
    def length(self):
        cur = self.__head
        count = 0
        while cur.next != None:
            cur = cur.next
            count += 1
        return count
    #判断是否为空
    def is_empty(self):
        return self.__head == None
    #头部添加,将链表的头部设置为该元素,元素的next为原来的头部
    def add(self,item):
        node = Node(item)
        node.next = self.__head
        self.__head = node
    #遍历
    def travel(self):
        cur = self.__head
        while cur != None:
            print(cur.elem,end=' ')
            cur = cur.next  
    #尾部添加,直接将最后一个元素的next指向新的元素
    def append(self,item):
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            cur.next = node
    #固定位置添加,找到插入的前一个位置元素
    #将该元素next设置值为新元素 新元素的next设置为该元素原来的next
    def inert(self,pos,item):
        if pos<0:
            self.add(item)
        elif pos >  self.length()-1:
            self.append(item)
        else:
            per = self.__head
            count = 0
            while count <  pos-1:
                count += 1
                per = per.next
            node = Node(item)
            node.next = per.next
            per.next = node   
    #删除方法 
    #如果是头部,则删除,将头部指向下一个元素
    #如果不是头部,删除,然后将上一个元素的next指向该元素的next
    def remove(self,item):
        cur = self.__head
        per = None
        while cur != None:
            if cur.elem == item:
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    per.next = cur.next
                break
            else:
                per = cur
                cur = cur.next
    #查找方法
    def search(self,item):
        cur = self.__head
        while cur:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return  False
li = SingleLinkList()
li.append(3)
li.append(4)
li.append(5)
li.append(6)
li.append(7)
li.inert(2,100)
li.remove(5)
print(li.search(100))
li.travel()

2. Циркулярно связанный список

       Циклический связанный список является расширением одностороннего списка.Если мы сравним односторонний список с группой детей, держащихся за руки и стоящих в очереди вперед. Тогда двусторонний связанный список - это группа детей, играющих в игры в кругу. Конкретная реализация также очень проста, мы можем указать следующий атрибут хвостового элемента на головной элемент связанного списка.

       

3. Двусвязный список

       Как следует из названия, двусвязный список имеет два направления, то есть для каждого элемента есть два указателя. Один элемент указывает вперед, а один элемент - назад. В конкретной реализации в каждом элементе есть три переменные: одна для записи предыдущего элемента, а другая для записи заднего элемента.

               

 

4. Резюме

          Эта статья - моя новаторская работа над структурой данных.Структуру данных можно понимать как контейнер для данных, соответствующий различным методам хранения данных в памяти. Мы представили концепцию линейных таблиц, использующих линейные структуры для хранения данных. Один из них - последовательное линейное хранилище, то есть данные используют непрерывное пространство памяти. Один из них - это связанный линейный метод хранения, который использует прерывистое пространство памяти. Этот способ хранения более гибкий и не требует заранее знать размер занимаемого пространства. Наконец, мы ввели связанные списки, включая односвязные списки, двусвязные списки и циклические связанные списки. Этот линейный метод хранения относительно прост для понимания и относительно прост. Это мой первый день, и я все еще не смею сказать, что понял правду. Что касается даосизма и шушу, он все еще находится на академической стадии. Текущая структура данных для меня похожа на кровь, текущую в кровеносном сосуде, в компьютерном трубопроводе. Они координировали и распределяли друг друга, и они текли красиво, как танцы, что волновало людей!

5. Ерунда

          Мне очень нравятся мои друзья, и мне также нравится неопределенная жизнь. В каждой жизни есть свои прелести, и, возможно, я до сих пор не могу себе представить радость от вождения спортивного автомобиля. Но что я знаю, так это то, что способность каждого чувствовать себя счастливым очень мала. Каждый должен тосковать по тому, чего нет в наличии. Чем менее доступно, тем мы счастливее. Так что вместо того, чтобы зацикливаться на скучном счастье, лучше просто выбросить их. Некоторые люди говорят, что отсутствие учебы или прогресса - пустая трата времени, но скучная учеба тратит впустую нашу жизнь. Вы исчерпали всю свою жизнь и встали на вершину пирамиды в определенном поле. Оглядываясь назад, я все еще чувствую себя никчемным. По сравнению с нашей бесценной юностью, что это за сломанные вещи? Самая трагичная вещь в жизни - это то, что у нас есть жизнь, источник энергии и фонтан мудрости, составляющий сущность всего в мире, но мы не знаем, что с этим делать. Если декаданс и лень попадают в собственную ловушку, то неужели самодисциплина и упорный труд попадают в ловушку неба и земли? Я твердо верю, что однажды найду что-то достойное моей жизни. Пока я становлюсь на шаг ближе к этому, я не трачу свою жизнь зря.

[MAD / Ran Xiang] Сцена морского сражения Ран Сян смешанная версия музыкальной темы «Пираты Карибского моря» Редактирование рекламного видео World of Warships

 

рекомендация

отblog.csdn.net/gaobing1993/article/details/108666410