La memoria, la tabla de orden, la lista (que contiene preguntas de la entrevista)

memoria

  • El papel de la computadora

    • Almacenamiento y computaciónLos datos binarios.
  • Cómo Computer 1 + 1 =? operativo

    • 1 se carga en la memoria del ordenador, el ordenador de baseAdición de registroEspecifica los datos almacenados en la memoria de añadido.
    • Sin registro resta, + (- 1) es -1.
  • El concepto de variables

    • La naturaleza habla, la variable se refiere a un pedazo de espacio de memoria en su ordenador.
    • Hay dos propiedades inherentes de espacio de memoria
      • Dirección: Representación número hexadecimal
        • Papel: cpu conveniente abordar. Número de casa.
      • Tamaño: bits, bytes, KB, MB, GB, TB
        • Determina el rango de valores almacenados en el bloque de memoria
  • A = apreciará que la (punto de referencia) de memoria 10

    • Cita: es variableEn términos generales, la pantalla / de almacenamiento variable es un pedazo de espacio de direcciones de memoria del espacio de memoria.
    • punto:Si un bloque de almacenamiento de referencia variable / memoria representa un espacio de direcciones, o las referencias al bloque de memoria de variables.
    • por ejemplo: Stu = Student (), Stu puntos a espacio de memoria estudiantes correspondiente al objeto
      • siguiente = Nodo (), next.item, next.next
  • Para el espacio abierto tamaño de la memoria inherente mismo tipo de datos

    • Conformación de datos: 4byte
    • Float: 4,8byte
    • Carácter: 1 byte

comprensión personal

  • paraalmacenamiento persistentePorque, de acuerdo a las tiendas de la tabla de codificación:

    • ascii: 1word -> 1 byte
    • gbk1word: -> 2 bytes
    • utf-8: 1word -> 1-4 bytes (o un byte ASCII prima contenida en dos bytes en Europa, Asia, 3 bytes)
  • paraespacio de memoria pitónpara:

    • El tipo de datos de cada asignación de variable es diferente para las diferentes variables espacio reservado,tipo de datos determina el tamaño del espacio de memoria reservado para sólo los datos, mientras que el tamaño de los datos en sí no afectará el tamaño del espacio reservado

    • Memoria se puede ampliar después de más de espacio reservado,Aunque aproximadamente el tamaño de dicho espacio de memoria reservado a medida es un poco un desperdicio de recursos, PeroGuardar la CPU recursos informáticos a reservar espacio para cada elemento en diferentes tamañosY si se calcula de acuerdo con el tamaño del espacio de memoria de datos, siempre y cuando los puntos variables han cambiado, pero el espacio de reserva también recalculado, que está muy ocupada eficiencia de la CPU

    • pitón espacio de reserva:

      • Shaping: 4 bytes;

        • 1byte = 8bits,1 bit puede almacenar un número binario, Entonces un byte puede almacenar números binarios de 8 bits, es decir, puede ser almacenado 2**8(256) un número decimal (0-255)

        • De manera similar, 4 bytes pueden ser almacenados 2**32número decimal semilla

          np.iinfo('int8')  # int,相较于无符号,需要浪费第一位用来储存+-号,2**7=128,所以范围就是 -127~127
          
          iinfo(min=-128, max=127, dtype=int8)
          

          En [6]:

          np.iinfo('uint8')  # 无符号int,2**8=256,范围就是0-255
          
          iinfo(min=0, max=255, dtype=uint8)
          
      • Flotador: 4/8 bytes (precisión simple / doble precisión);

      • str: 1 1 caracteres de un byte, pero todas las cadenas tienen una final -0, tendrá un byte de una extra (por ejemplo, 'hola' -> 6 bytes)

tabla de orden

clasificación

  • elementos de estructura de datos se almacenan en secuencial, estructura de la tabla de secuencia se puede dividir en dos formas:

    • Tipo simple de datos (matriz) y múltiples tipos de datos (lista).
  • en pythonLas listas y tuplas pertenecen a varios tipos de datos de mesa fin

  • tipo de datos individual (array) de la figura memoria de tabla de secuencia (RAM continua abierto)

    • tipos de datos de matrices están unificados, por lo que el desplazamiento se fija
    • Esto puede explicar el origen del índice

Aquí Insertar imagen Descripción

  • Múltiples tipos de datos Figura memoria de tabla de secuencia (RAM discontinua abierta)

    • lista se puede almacenar en diferentes tipos de datos, de modo que offset diferente, podemos lograr una lista de índice (el mismo offset) almacenado por la dirección de memoria

Aquí Insertar imagen Descripción

Figura en la comprensión personal:

  • tabla de orden Categoría:

    • estructura de almacenamiento de datos único, múltiples estructuras de almacenamiento de datos
  • Matriz: estructura de almacenamiento de datos único

    • Se almacena en los elementos de matriz mismos
    • Dentro del tipo de datos de matriz debe ser unificada:Con el fin de facilitar la cantidad de desplazamiento de cálculo
  • Lista: estructura de almacenamiento de datos múltiples

    • La lista se almacena en la dirección de memoria! ! !
    • Una lista de los elementos no se almacenan directamente en la lista, se almacenan en la memoria en forma de almacenamiento no contiguo, y es sólo una lista de puntos Almacenar la dirección de memoria de cada elemento contenedor ordenada, también por esta razón, la lista puede ser almacenada en diferentes tipos de datos, pero el índice se mantiene sin cambios
  • tabla Order desventaja: insertar los datos, un índice de todos los elementos para ser cambiado después de la posición de inserción, hora de complejidad

  • Lista Contras: hay que encontrar un una baja eficiencia consulta

inconvenientes:

  • Estructura necesita conocer de antemano el tamaño de la tabla de datos con el fin de aplicar el espacio de almacenamiento continuo
    • ¿Cuál es el espacio de almacenamiento contiguo?
      • Es decir, cuando la memoria interna, no uno por uno en el orden de uso, pero a ver quién es, donde no es libre, esto conducirá a un nido de avispas ese caso, utilizar una gran cantidad de espacio se fragmenta, por lo que quiero encontrar unaespacio de memoria continuo, y suficientemente grandePodría retrasar la eficiencia
  • Y está el espacio tiempo y la memoria para expandir las necesidades de datos a ser reubicados, sino también para encontrar el espacio para satisfacer las condiciones

lista

  • Lista (Lista de enlaces) corresponde a estructuras básicas comunes de datos, una tabla lineal, como tabla de secuencias, pero no almacena los datos de forma continua, peroCada nodo (datos medios de almacenamiento) almacenado en la información del siguiente nodo (es decir, dirección)

ventajas:

  • tabla Order, cada lista de nodos vinculados puede ser discontinua con respecto, se puede tomar ventaja de espacio de memoria del ordenador, proporcionada por la dirección de memoria del siguiente nodo almacenado en cada nodo que puede lograrse en la búsqueda de la cadena, no hay necesidad de almacenado de forma continua. Esto permite la gestión dinámica de memoria flexibles
  • No hay datos de movimiento cuando la dirección de memoria expandida puede ser almacenada en el nodo nuevo, siempre y cuando el último nodo

Debemos poner en práctica los métodos de la lista:

  • .is_empty (): la lista está vacía
  • .length (): longitud de la cadena
  • .travel (): atravesar toda la lista
  • .add (elemento): Adición de la cabeza de los elementos de la lista
  • .Append (artículo): la cola de la lista para añadir elementos
  • .Insert (pos, artículo): Elements Añadir lugar especificado
  • .Remove (punto): el nodo Eliminar
  • .search (artículo): existe Look para el nodo

nodo

# 节点的封装
class Node(object):
    
    def __init__(self,item):
        self.item = item
        self.next = None

lista

class Link(object):
    """可以发现链表的各种方法中如果涉及第一个节点都要额外定义,因为第一个节点连接的是self._head"""
    
    def __init__(self):
        self._head = None
    
    def is_empty(self):
        return self._head == None
    
    def add(self,item):
        """三步走,实例化节点,新节点连上一个节点,self._head连新节点"""
        node = Node(item)
        node.next = self._head
        self._head = node  # 将_head指向当前节点  
    
    def append(self,item):
        node = Node(item)
        
        # 如果链表为空
        if not self._head:
            self._head = node
            return
        
        cur = self._head
        pre = None  # 用来存储cur的上一个节点,因为while循环最后会找到None为止,到时候再找上一个对象就麻烦了,所以我们手动存储
        
        while cur:
            pre = cur
            cur = cur.next
        
        pre.next = node  # 当while循环结束的时候,pre就指向了链表中最后一个节点,而不是None
    
    def travel(self):
        # cur指向了第一个节点
        # _head要永远指向第一个节点,轻易不要修改_head的指向,不然可能会导致数据丢失,
        # 因为你每个节点就只存储了下一个点的内存地址,一个点断了,后面的数据就都找不到了
        cur = self._head
        while cur:
            print(cur.item)
            cur = cur.next
    
    def length(self):
        count = 0
        
        cur = self._head
        while cur:
            count += 1
            cur = cur.next
        
        return count
    
    def search(self,item):
        """查找item对应的节点是否存在,返回Bool"""
        
        cur = self._head
        while cur:
            if cur.item == item:
                return True
            cur = cur.next

        return False
    
    def insert(self,pos,item):
        """
        插入操作核心在于pre跟cur代表两个连续的节点,根据索引进行循环得到pre跟cur后,
        pre.next连接node,node.next连接cur
        """
        node = Node(item)
        
        if pos == 0:  # 插入首位需要调整self._head值
            node.next = self._head
            self._head = node
            return
        
        # 在非首位插入元素
        cur = self._head
        pre = None
        for i in range(pos):
            pre = cur
            cur = cur.next
        
        pre.next = node
        node.next = cur
    
    def remove(self,item):
        """删除核心在于,并没有进行删除操作,只是将要删除节点的前后节点直接进行连接,跳过该节点"""
        
        if self._head.item == item:
            self._head = self._head.next
        
        pre = None
        cur = self._head
        
        while cur.next:  # 这里为了避免循环内cur.next得到的是None,下面的cur.item会报错,'NoneType' object has no attribute 'item'
            pre = cur
            cur = cur.next
            
            if cur.item == item:
                pre.next = cur.next
                return

uso:

link = Link()
#link.add(1)
#link.add(3)
#link.add(2)  # 2,3,1

link.append(4)
link.append(6)
link.append(5)  # 2,3,1,4,6,5
link.travel()

print(link.search(1))
4
6
5
False

insertar

link = Link()
link.append(4)
link.append(5)
link.append(6)
link.insert(0,7)  # 插哪个位置都可以
link.travel()
7
4
5
6

eliminar

link = Link()
link.append(4)
link.append(5)
link.append(6)
link.remove(5)  # 插哪个位置都可以
link.travel()
4
6

preguntas de la entrevista:

  • Voltear lograr su propia lista
    • 1,2,3,4,5
    • Provisión flip: 5,4,3,2,1
    • Requisitos: Punto de modificar el nodo para lograr una salida invertida de la lista!

Aquí Insertar imagen Descripción

código:

# 节点的封装
class Node(object):
    
    def __init__(self,item):
        self.item = item
        self.next = None

class Link(object):
    
    def __init__(self):
        self._head = None
    
    def is_empty(self):
        return self._head == None
    
    def add(self,item):
        """三步走,实例化节点,新节点连上一个节点,self._head连新节点"""
        node = Node(item)
        node.next = self._head
        self._head = node  # 将_head指向当前节点  
    
    def append(self,item):
        node = Node(item)
        
        # 如果链表为空
        if not self._head:
            self._head = node
            return
        
        cur = self._head
        pre = None  # 用来存储cur的上一个节点,因为while循环最后会找到None为止,到时候再找上一个对象就麻烦了,所以我们手动存储
        
        while cur:
            pre = cur
            cur = cur.next
        
        pre.next = node  # 当while循环结束的时候,pre就指向了链表中最后一个节点,而不是None
    
    def travel(self):
        # cur指向了第一个节点
        # _head要永远指向第一个节点,轻易不要修改_head的指向,不然可能会导致数据丢失,
        # 因为你每个节点就只存储了下一个点的内存地址,一个点断了,后面的数据就都找不到了
        cur = self._head
        while cur:
            print(cur.item)
            cur = cur.next
    
    def length(self):
        count = 0
        
        cur = self._head
        while cur:
            count += 1
            cur = cur.next
        
        return count
    
    def search(self,item):
        """查找item对应的节点是否存在,返回Bool"""
        
        cur = self._head
        while cur:
            if cur.item == item:
                return True
            cur = cur.next

        return False
    
    def insert(self,pos,item):
        """
        插入操作核心在于pre跟cur代表两个连续的节点,根据索引进行循环得到pre跟cur后,
        pre.next连接node,node.next连接cur
        """
        node = Node(item)
        
        if pos == 0:  # 插入首位需要调整self._head值
            node.next = self._head
            self._head = node
            return
        
        # 在非首位插入元素
        cur = self._head
        pre = None
        for i in range(pos):
            pre = cur
            cur = cur.next
        
        pre.next = node
        node.next = cur
    
    def remove(self,item):
        """删除核心在于,并没有进行删除操作,只是将要删除节点的前后节点直接进行连接,跳过该节点"""
        
        if self._head.item == item:
            self._head = self._head.next
        
        pre = None
        cur = self._head
        
        while cur.next:  # 这里为了避免循环内cur.next得到的是None,下面的cur.item会报错,'NoneType' object has no attribute 'item'
            pre = cur
            cur = cur.next
            
            if cur.item == item:
                pre.next = cur.next
                return

    def reverse(self):
        """实现链表的反转"""
        cur = self._head
        pre = None
        
        while cur:
            storage = cur.next  # 先把下一个节点存起来,不然数据周转不开
            cur.next = pre      # 下一个节点的next指向上一个节点
            pre = cur           # 老操作了
            cur = storage       # cur往前推进
        
        self._head = pre
            

uso:

li = Link()

items = [1,2,3,4,5]
for item in items:
    li.append(item)

li.travel()
li.reverse()
print('-')
li.travel()

resultados:

1
2
3
4
5
-
5
4
3
2
1

Supongo que te gusta

Origin www.cnblogs.com/Guoxing-Z/p/12670253.html
Recomendado
Clasificación