Matrices y listas enlazadas de estructuras de datos de uso común

1. Información general

           El programa que se ejecuta en la computadora es en realidad el flujo de datos. En pocas palabras, de un contenedor a otro, hay dos operaciones para almacenar y recuperar los datos correspondientes a los datos. Entonces, para la elección de la estructura de datos, nuestro requisito más básico es que se pueda instalar y luego sea más conveniente acceder. Por ejemplo, necesitamos usar una canasta para comprar verduras y un balde para traer agua. Es igualmente importante elegir el contenedor adecuado para nuestros datos. La estructura de datos y el algoritmo pueden considerarse como la razón por la que los programadores son programadores. Intento hacer que esta estructura de datos sea más fácil de decir, ¡vamos! Ollie da.

2. Complejidad del tiempo

           La complejidad del tiempo es una representación simplificada de la frecuencia de ejecución del programa, no estrictamente el tiempo y, por lo general, la frecuencia en las peores condiciones. Aquí se usa la notación Big O, y los pasos básicos son:

           1. Calcule la función de frecuencia T (n)

           2. Mantenga los elementos de mayor orden y elimine los coeficientes

           3. La constante es 1

           La complejidad de tiempo comúnmente utilizada son: orden constante O (1), orden logarítmico O (logn), orden lineal O (n), orden logarítmica lineal O (nlogn), orden cuadrada O (n ^ 2), orden cúbica O (n ^ 3), k orden cuadrado O (n ^ k), orden exponencial O (2 ^ n)

1. Mesa lineal

               La tabla lineal es un concepto de almacenamiento de datos cuya idea central es unir elementos uno por uno, como hacer cola. Puede ser un espacio de memoria continuo (estructura de almacenamiento secuencial) o un espacio de memoria discontinuo (estructura de almacenamiento en cadena)

                

2. Matriz

          La matriz es un espacio continuo en la memoria, una vez que se determina el tamaño del espacio, no se puede cambiar. Como puede ver, la matriz se puede utilizar para implementar la estructura de almacenamiento secuencial de la tabla lineal. Como se muestra en la figura siguiente, si desea eliminar un elemento de la matriz, la complejidad es O (N)

                         

3. Lista vinculada

     1. Lista única vinculada

             La lista vinculada es un espacio de almacenamiento discontinuo, por lo que su tamaño se puede cambiar dinámicamente. Entonces, ¿cómo hacer que los elementos de la lista vinculada se encadenen juntos? Entonces, cada una de nuestras ubicaciones debe contener dos variables, una para almacenar el valor del elemento actual y otra para almacenar la dirección del siguiente elemento. De esta manera, cada nodo alcanza el siguiente nodo y todos los nodos se pueden conectar como un todo. La lista enlazada tiene una gran flexibilidad y la complejidad de los elementos de acceso es O (N / 2). A continuación, se usa código Python para implementar una lista unidireccional, que implementa la comprobación básica de adición, eliminación y modificación.

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. Lista circular vinculada

       La lista enlazada circular es una extensión de la lista unidireccional, si comparamos la lista unidireccional con un grupo de niños tomados de la mano y haciendo cola hacia adelante. Entonces, la lista enlazada de dos vías es el grupo de niños que juegan en un círculo. La implementación específica también es muy simple, podemos apuntar el siguiente atributo del elemento de cola al elemento de cabeza de la lista vinculada.

       

3. Lista doblemente vinculada

       Como su nombre lo indica, una lista doblemente enlazada tiene dos direcciones, es decir, para cada elemento, hay dos punteros. Un elemento apunta hacia el frente y un elemento apunta hacia atrás. En la implementación específica, hay tres variables en cada elemento, una para registrar el elemento anterior y otra para registrar el elemento posterior.

               

 

4. Resumen

          Este artículo es mi trabajo pionero sobre la estructura de datos, que puede entenderse como un contenedor de datos, correspondiente a varios métodos de almacenamiento de datos en la memoria. Introdujimos el concepto de tablas lineales, utilizando estructuras lineales para almacenar datos. Uno es el almacenamiento lineal secuencial, es decir, los datos utilizan un espacio de memoria continuo. Uno es un método de almacenamiento lineal encadenado que utiliza espacio de memoria discontinuo. Este método de almacenamiento es más flexible y no necesita conocer el tamaño del espacio ocupado de antemano. Finalmente, presentamos listas enlazadas, incluidas listas enlazadas individualmente, listas enlazadas doblemente y listas enlazadas circulares. Este método de almacenamiento lineal es relativamente fácil de entender y relativamente simple. Este es mi primer día y todavía no me atrevo a decir que me he dado cuenta de la verdad. En términos de taoísmo y shushu, todavía se encuentra en la etapa académica. Para mí, la estructura de datos actual es como la sangre que fluye en un vaso sanguíneo, una tubería de computadora. Se coordinaron y despacharon, y fluyeron maravillosamente como bailando, ¡lo que emocionó a la gente!

5. Tonterías

          Me gustan mucho mis amigos y también me gusta la vida incierta. Cada tipo de vida tiene sus encantos, y quizás todavía no puedo imaginar la alegría de conducir un automóvil deportivo. Pero lo que sé es que la capacidad de todos para sentirse felices es muy pequeña. Todo el mundo tiene que añorar aquellos que no están disponibles, cuanto menos disponibles, más felices somos. Entonces, en lugar de entrar en el ciclo interminable de aburrida felicidad, es mejor simplemente tirarlos a la basura. Algunas personas dicen que no estudiar o progresar es una pérdida de tiempo, pero el estudio aburrido realmente desperdicia nuestras vidas. Agotaste toda tu vida y estuviste en la cima de la pirámide en cierto campo. Mirando hacia atrás, todavía me siento inútil. Comparado con nuestros invaluables años de juventud, ¿qué son estas cosas rotas? Lo más trágico de la vida es que tenemos la vida, la fuente de energía y la fuente de la sabiduría de la esencia de todas las cosas del mundo, pero no sabemos qué hacer con ella. Si la decadencia y la pereza caen en la propia trampa, ¿entonces la autodisciplina y el trabajo duro caen en la trampa del cielo y la tierra? Creo firmemente que algún día encontraré algo digno de mi vida. Mientras me acerque un paso más, lo que hago es no desperdiciar mi vida.

[MAD / Ran Xiang] Escena de batalla naval Ran Xiang corte mixto Canción temática de Piratas del Caribe Edición de video promocional de World of Warships

 

Supongo que te gusta

Origin blog.csdn.net/gaobing1993/article/details/108666410
Recomendado
Clasificación