Árbol del espacio: bloqueo y desbloqueo del árbol N-Ary

Dado un mapa mundial en forma de Generic M-ary Tree que consta de N Nodes y una array queries[] , la tarea es implementar las funciones Lock , Unlock y Upgrade para el árbol dado. Para cada consulta en queries[] , las funciones devuelven verdadero cuando la operación se realiza correctamente; de ​​lo contrario, devuelve falso . Las funciones se definen como: 

X: Nombre del Node en el árbol y será único
uid: ID de usuario de la persona que accede al Node X

1. Lock(X, uid): Lock tiene acceso exclusivo al subárbol enraizado.

  • Una vez que Lock(X, uid) tiene éxito, lock(A, cualquier usuario) debería fallar, donde A es descendiente de X .
  • Lock (B. cualquier usuario) debería fallar donde X es un descendiente de B.
  • La operación de bloqueo no se puede realizar en un Node que ya está bloqueado.

2. Desbloquear (X, uid): para desbloquear el Node bloqueado.

  • El desbloqueo revierte lo que se hizo con la operación de bloqueo .
  • Solo se puede invocar y desbloquear con el mismo uid .

3. UpgradeLock(X, uid): el usuario uid puede actualizar su bloqueo a un Node antepasado.

  • Solo es posible si cualquier Node antepasado solo está bloqueado por el mismo uid de usuario .
  • La actualización debería fallar si hay algún Node bloqueado por algún otro uid Y a continuación.

Ejemplos:

Entrada: N = 7, M = 2, Nodes = [‘Mundo’, ‘Asia’, ‘África’, ‘China’, ‘India’, ‘Sudáfrica’, ‘Egipto’],  
consultas = [‘1 China 9’ , ‘1 India 9’, ‘3 Asia 9’, ‘2 India 9’, ‘2 Asia 9’]
Salida: verdadero verdadero verdadero falso verdadero

Entrada: N = 3, M = 2, Nodes = [‘Mundo’, ‘China’, ‘India’],  
consultas = [‘3 India 1’, ‘1 Mundo 9’]
Salida: falso verdadero

A continuación se muestra la implementación del enfoque anterior:

Python3

# Python Implementation
 
# Locking function
def lock(name):
    ind = nodes.index(name)+1
    c1 = ind * 2
    c2 = ind * 2 + 1
    if status[name] == 'lock' \
            or status[name] == 'fail':
        return 'false'
    else:
        p = ind//2
        status[nodes[p-1]] = 'fail'
        status[name] = 'lock'
        return 'true'
 
# Unlocking function
def unlock(name):
    if status[name] == 'lock':
        status[name] = 'unlock'
        return 'true'
    else:
        return 'false'
 
# Upgrade function
def upgrade(name):
    ind = nodes.index(name)+1
 
    # left child of ind
    c1 = ind * 2
 
    # right child of ind
    c2 = ind * 2 + 1
    if c1 in range(1, n) and c2 in range(1, n):
        if status[nodes[c1-1]] == 'lock' \
            and status[nodes[c2-1]] == 'lock':
            status[nodes[c1-1]] = 'unlock'
            status[nodes[c2-1]] = 'unlock'
            status[nodes[ind-1]] = 'lock'
            return 'true'
        else:
            return 'false'
 
# Precomputation
def precompute(queries):
  d = []
   
  # Traversing the queries
  for j in queries:
      i = j.split()
      d.append(i[1])
      d.append(int(i[0]))
 
  status = {}
  for j in range(0, len(d)-1, 2):
      status[d[j]] = 0
  return status, d
 
# Function to perform operations
def operation(name, code):
    result = 'false'
     
    # Choose operation to perform
    if code == 1:
        result = lock(name)
    elif code == 2:
        result = unlock(name)
    elif code == 3:
        result = upgrade(name)
    return result
   
   
# Driver Code
if __name__ == '__main__':
   
      # Given Input
    n = 7;m = 2
    apis = 5
    nodes = ['World', 'Asia', \
            'Africa', 'China', \
            'India', 'SouthAfrica', 'Egypt']
    queries = ['1 China 9', '1 India 9', \
             '3 Asia 9', '2 India 9', '2 Asia 9']
     
    # Precomputation
    status, d = precompute(queries)
 
    # Function Call
    for j in range(0, len(d) - 1, 2):
        print(operation(d[j], d[j + 1]), end = ' ')
Producción: 

true true true false true

 

Complejidad temporal: O(LogN)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por jelonmusk y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *