Resolvendo Um Problema De Gráfico Com Go

Neste tutorial, aprenderemos como resolver um problema de gráfico com Go. 

Nos últimos dias, tenho assistido a entrevistas de simulação ao vivo e, embora não esteja no mercado para um novo emprego (estou muito feliz no Google), é interessante para mim que tantas pessoas lutam com o mesmo problema escondido atrás de alguns adornos complicados.

Uma das perguntas simuladas de exemplo dizia algo assim:

Imagine que você tem imagens e pode duplicar qualquer imagem que desejar, criando outra imagem. A nova imagem (a duplicata) também pode ser copiada e assim por diante. Embora a nova imagem pareça a mesma, o nome é diferente e você também pode rastreá-la até a imagem pai.

Agora, queremos excluir todas as imagens, mas não podemos excluir uma imagem se ela tiver duplicatas. Você deve implementar uma função que retorne a ordem em que as imagens podem ser excluídas.

A função a ser implementada é a seguinte (estamos usando Go para todo o código neste post):

func deleteOrder(imgs []*Image, cps []*CPOps) []*Image {...}

type Image struct {
  Name string
}// CPOps represent a copy operation. 
type CPOps struct {
  ParentImage *Image //Original images being copied. 
  CpImages []*Image  //Copies of the original image.
}

A função recebe uma lista de imagens, e as operações de cópia entre elas, então ela deve retornar a ordem que devemos seguir para deletar todas as imagens com base na regra acima.

Vejamos um exemplo:

Images = [A, B, C, D]
CPOps = [
  {ParentImage:A, CPImages:[B, C]},
  {ParentImage:B, CPImages:[D]},
]

Isso está dizendo que A era a imagem original, e fizemos duas cópias, B e C. Então fizemos uma cópia de B em D. A saída de nossa função deleteOrderdeve ser [D, B, C, A] ou [D, C, B, A] ou [C, D, B, A]. Observe que várias soluções são possíveis, mas todas elas são tais que cada imagem é excluída somente depois que suas cópias são excluídas.

Resolvendo o problema.

Este problema é um algoritmo clássico de Classificação Topológica onde algum tipo de dependência entre objetos é estabelecido. O mesmo problema com um fraseado diferente foi apresentado aos candidatos das entrevistas simuladas, mas em todos os casos, o problema pôde ser reduzido a uma Classificação Topológica.

A solução que apresentamos neste post foi escrita para que cada peça possa ser explicada de forma independente. No entanto, em uma entrevista é aceitável escrever um código menos legível por uma questão de tempo.

Construindo o gráfico

Espero que a esta altura, o leitor possa perceber que se trata de um problema de grafo, que por sua vez deve ser o primeiro sinal para o entrevistador de que o candidato entende o que está acontecendo.

Se construirmos o gráfico usando o exemplo acima, devemos obter algo como:

A --> B --> D
 \  
  --> C

Agora, vamos criar uma função que dada a entrada, podemos construir um gráfico que pode ser usado para resolver o problema.

type Graph map[string][]string

func buildGraph(imgs []*Image, copos []*CPOps) Graph {
	graph := make(Graph)

	// Add all images to the graph.
	for _, img := range imgs {
		if _, ok := graph[img.Name]; !ok {
			graph[img.Name] = []string{}
		}
	}

	// Add dependencies between images.
	for _, cp := range cpops {
		if _, ok := graph[cp.ParentImage.Name]; !ok {
			graph[cp.ParentImage.Name] = []string{}
		}
		for _, child := range cp.CPImages {
			graph[cp.ParentImage.Name] = append(graph[cp.ParentImage.Name], child.Name)
		}
	}

	return graph
}

Construindo o gráfico

Observe que estamos adicionando todos os nós (imagens) ao gráfico primeiro, isso é importante, pois pode haver imagens que nunca foram copiadas, portanto, elas nunca estarão nas relações dadas. Em seguida, estabelecemos as dependências entre os nós.

Agora, podemos implementar a parte principal do algoritmo, o Topological Sort.

Classificação topológica

A ordenação topológica é um DFS simples que percorre o grafo usando as dependências como arestas direcionadas e retorna a ordem inversa. No nosso caso, estamos interessados ​​na ordem inversa das dependências, pois A — > B, precisamos excluir B primeiro, depois A.

func dfs(n string, graph Graph, visited map[string]bool, path []string) []string {
	for _, child := range graph[n] {
		if _, ok := visited[child]; ok {
			continue
		}
		visited[child] = true
		path = dfs(child, graph, visited, path)
	}
	return append(path, n)
}

DFS para percorrer o gráfico dado um nó inicial.

O DFS percorre o gráfico dado um nó inicial e retorna as dependências em ordem inversa. A visitedvariável acompanha os nós que já visitamos no gráfico (para não repeti-los), e a variável pathacompanha as dependências invertidas.

Agora que temos uma maneira de construir o gráfico e percorrê-lo, devemos juntar tudo de uma vez.

// DeletionOrder returns the order the images should be deleted. 
func DeletionOrder((imgs []*Image, cps []*CPOps) []*Image {
	graph := buildGraph(imgs, cps)

	visited := map[string]bool{}
	result := []string{}
	for k := range graph {
		if _, ok := visited[k]; !ok {
			visited[k] = true
			result = dfs(k, graph, visited, result)
		}
	}

	imgsMap := map[string]*Image{}
	for _, img := range imgs {
		imgsMap[img.Name] = img
	}
	imgsOrder := []*Image{}
	for _, name := range result {
		imgsOrder = append(imgsOrder, imgsMap[name])
	}
	return imgsOrder
}

A DeletionOrderfunção constrói o gráfico com a entrada dada, para cada nó que não foi visitado dfsé executado. A resultvariável conterá os nomes das imagens na ordem de exclusão correta.

O resto da DeleteOrderfunção (linha 14 em diante) é apenas certificar-se de que selecionamos as imagens dos nomes das imagens (fora do algoritmo do gráfico).

 

A maior parte do algoritmo não parece tão complexa e, no entanto, muitas pessoas não conseguem resolver esse problema, o que, na minha opinião, é factível em uma entrevista de 45 minutos. Minha observação é que a maioria das pessoas não consegue identificar esse problema gráfico com rapidez suficiente para ter tempo de implementar uma solução funcional.

outras considerações

O mesmo problema pode ser levado em direções diferentes, dependendo de como o entrevistador quer enxergá-lo.

Por exemplo, a questão de escalar o algoritmo, quando o gráfico tem milhares de nós, é interessante. Embora possam parecer simples, existem alguns casos complicados a serem considerados.

O problema de detectar se a entrada fornecida está correta também pode ser interessante. Para que o grafo seja classificável e, portanto, a ordenação topológica funcione corretamente, o grafo não deve ter ciclos. Detectar ciclos não é um problema particularmente complexo, mas fazê-lo em escala pode ser um pouco mais problemático.

Estas são questões interessantes e o leitor deve ter um momento para pensar sobre elas e as implicações de cada uma.

No final, em uma entrevista de 45 minutos, só há tempo disponível para resolver alguns desses pontos de interrogação somente após o problema principal ter sido codificado corretamente. No entanto, esperamos que após este post, o leitor possa olhar para alguns problemas e facilmente reduzi-los a esta categoria de gráficos de problemas solucionáveis ​​usando ordenação topológica.

 

Boa sorte na entrevista.

Fonte: https://itnext.io/solving-a-graph-problem-with-go-f1049de33856

#go #graph 

What is GEEK

Buddha Community

Resolvendo Um Problema De Gráfico Com Go
Fannie  Zemlak

Fannie Zemlak

1599854400

What's new in the go 1.15

Go announced Go 1.15 version on 11 Aug 2020. Highlighted updates and features include Substantial improvements to the Go linker, Improved allocation for small objects at high core counts, X.509 CommonName deprecation, GOPROXY supports skipping proxies that return errors, New embedded tzdata package, Several Core Library improvements and more.

As Go promise for maintaining backward compatibility. After upgrading to the latest Go 1.15 version, almost all existing Golang applications or programs continue to compile and run as older Golang version.

#go #golang #go 1.15 #go features #go improvement #go package #go new features

Resolvendo Um Problema De Gráfico Com Go

Neste tutorial, aprenderemos como resolver um problema de gráfico com Go. 

Nos últimos dias, tenho assistido a entrevistas de simulação ao vivo e, embora não esteja no mercado para um novo emprego (estou muito feliz no Google), é interessante para mim que tantas pessoas lutam com o mesmo problema escondido atrás de alguns adornos complicados.

Uma das perguntas simuladas de exemplo dizia algo assim:

Imagine que você tem imagens e pode duplicar qualquer imagem que desejar, criando outra imagem. A nova imagem (a duplicata) também pode ser copiada e assim por diante. Embora a nova imagem pareça a mesma, o nome é diferente e você também pode rastreá-la até a imagem pai.

Agora, queremos excluir todas as imagens, mas não podemos excluir uma imagem se ela tiver duplicatas. Você deve implementar uma função que retorne a ordem em que as imagens podem ser excluídas.

A função a ser implementada é a seguinte (estamos usando Go para todo o código neste post):

func deleteOrder(imgs []*Image, cps []*CPOps) []*Image {...}

type Image struct {
  Name string
}// CPOps represent a copy operation. 
type CPOps struct {
  ParentImage *Image //Original images being copied. 
  CpImages []*Image  //Copies of the original image.
}

A função recebe uma lista de imagens, e as operações de cópia entre elas, então ela deve retornar a ordem que devemos seguir para deletar todas as imagens com base na regra acima.

Vejamos um exemplo:

Images = [A, B, C, D]
CPOps = [
  {ParentImage:A, CPImages:[B, C]},
  {ParentImage:B, CPImages:[D]},
]

Isso está dizendo que A era a imagem original, e fizemos duas cópias, B e C. Então fizemos uma cópia de B em D. A saída de nossa função deleteOrderdeve ser [D, B, C, A] ou [D, C, B, A] ou [C, D, B, A]. Observe que várias soluções são possíveis, mas todas elas são tais que cada imagem é excluída somente depois que suas cópias são excluídas.

Resolvendo o problema.

Este problema é um algoritmo clássico de Classificação Topológica onde algum tipo de dependência entre objetos é estabelecido. O mesmo problema com um fraseado diferente foi apresentado aos candidatos das entrevistas simuladas, mas em todos os casos, o problema pôde ser reduzido a uma Classificação Topológica.

A solução que apresentamos neste post foi escrita para que cada peça possa ser explicada de forma independente. No entanto, em uma entrevista é aceitável escrever um código menos legível por uma questão de tempo.

Construindo o gráfico

Espero que a esta altura, o leitor possa perceber que se trata de um problema de grafo, que por sua vez deve ser o primeiro sinal para o entrevistador de que o candidato entende o que está acontecendo.

Se construirmos o gráfico usando o exemplo acima, devemos obter algo como:

A --> B --> D
 \  
  --> C

Agora, vamos criar uma função que dada a entrada, podemos construir um gráfico que pode ser usado para resolver o problema.

type Graph map[string][]string

func buildGraph(imgs []*Image, copos []*CPOps) Graph {
	graph := make(Graph)

	// Add all images to the graph.
	for _, img := range imgs {
		if _, ok := graph[img.Name]; !ok {
			graph[img.Name] = []string{}
		}
	}

	// Add dependencies between images.
	for _, cp := range cpops {
		if _, ok := graph[cp.ParentImage.Name]; !ok {
			graph[cp.ParentImage.Name] = []string{}
		}
		for _, child := range cp.CPImages {
			graph[cp.ParentImage.Name] = append(graph[cp.ParentImage.Name], child.Name)
		}
	}

	return graph
}

Construindo o gráfico

Observe que estamos adicionando todos os nós (imagens) ao gráfico primeiro, isso é importante, pois pode haver imagens que nunca foram copiadas, portanto, elas nunca estarão nas relações dadas. Em seguida, estabelecemos as dependências entre os nós.

Agora, podemos implementar a parte principal do algoritmo, o Topological Sort.

Classificação topológica

A ordenação topológica é um DFS simples que percorre o grafo usando as dependências como arestas direcionadas e retorna a ordem inversa. No nosso caso, estamos interessados ​​na ordem inversa das dependências, pois A — > B, precisamos excluir B primeiro, depois A.

func dfs(n string, graph Graph, visited map[string]bool, path []string) []string {
	for _, child := range graph[n] {
		if _, ok := visited[child]; ok {
			continue
		}
		visited[child] = true
		path = dfs(child, graph, visited, path)
	}
	return append(path, n)
}

DFS para percorrer o gráfico dado um nó inicial.

O DFS percorre o gráfico dado um nó inicial e retorna as dependências em ordem inversa. A visitedvariável acompanha os nós que já visitamos no gráfico (para não repeti-los), e a variável pathacompanha as dependências invertidas.

Agora que temos uma maneira de construir o gráfico e percorrê-lo, devemos juntar tudo de uma vez.

// DeletionOrder returns the order the images should be deleted. 
func DeletionOrder((imgs []*Image, cps []*CPOps) []*Image {
	graph := buildGraph(imgs, cps)

	visited := map[string]bool{}
	result := []string{}
	for k := range graph {
		if _, ok := visited[k]; !ok {
			visited[k] = true
			result = dfs(k, graph, visited, result)
		}
	}

	imgsMap := map[string]*Image{}
	for _, img := range imgs {
		imgsMap[img.Name] = img
	}
	imgsOrder := []*Image{}
	for _, name := range result {
		imgsOrder = append(imgsOrder, imgsMap[name])
	}
	return imgsOrder
}

A DeletionOrderfunção constrói o gráfico com a entrada dada, para cada nó que não foi visitado dfsé executado. A resultvariável conterá os nomes das imagens na ordem de exclusão correta.

O resto da DeleteOrderfunção (linha 14 em diante) é apenas certificar-se de que selecionamos as imagens dos nomes das imagens (fora do algoritmo do gráfico).

 

A maior parte do algoritmo não parece tão complexa e, no entanto, muitas pessoas não conseguem resolver esse problema, o que, na minha opinião, é factível em uma entrevista de 45 minutos. Minha observação é que a maioria das pessoas não consegue identificar esse problema gráfico com rapidez suficiente para ter tempo de implementar uma solução funcional.

outras considerações

O mesmo problema pode ser levado em direções diferentes, dependendo de como o entrevistador quer enxergá-lo.

Por exemplo, a questão de escalar o algoritmo, quando o gráfico tem milhares de nós, é interessante. Embora possam parecer simples, existem alguns casos complicados a serem considerados.

O problema de detectar se a entrada fornecida está correta também pode ser interessante. Para que o grafo seja classificável e, portanto, a ordenação topológica funcione corretamente, o grafo não deve ter ciclos. Detectar ciclos não é um problema particularmente complexo, mas fazê-lo em escala pode ser um pouco mais problemático.

Estas são questões interessantes e o leitor deve ter um momento para pensar sobre elas e as implicações de cada uma.

No final, em uma entrevista de 45 minutos, só há tempo disponível para resolver alguns desses pontos de interrogação somente após o problema principal ter sido codificado corretamente. No entanto, esperamos que após este post, o leitor possa olhar para alguns problemas e facilmente reduzi-los a esta categoria de gráficos de problemas solucionáveis ​​usando ordenação topológica.

 

Boa sorte na entrevista.

Fonte: https://itnext.io/solving-a-graph-problem-with-go-f1049de33856

#go #graph 

joe biden

1617257581

Software de restauración de Exchange para restaurar sin problemas PST en Exchange Server

¿Quiere restaurar los buzones de correo de PST a Exchange Server? Entonces, estás en la página correcta. Aquí, lo guiaremos sobre cómo puede restaurar fácilmente mensajes y otros elementos de PST a MS Exchange Server.

Muchas veces, los usuarios necesitan restaurar los elementos de datos de PST en Exchange Server, pero debido a la falta de disponibilidad de una solución confiable, los usuarios no pueden obtener la solución. Háganos saber primero sobre el archivo PST y MS Exchange Server.

Conozca PST y Exchange Server

PST es un formato de archivo utilizado por MS Outlook, un cliente de correo electrónico de Windows y muy popular entre los usuarios domésticos y comerciales.

Por otro lado, Exchange Server es un poderoso servidor de correo electrónico donde todos los datos se almacenan en un archivo EDB. Los usuarios generalmente guardan la copia de seguridad de los buzones de correo de Exchange en el archivo PST, pero muchas veces, los usuarios deben restaurar los datos del archivo PST en Exchange. Para resolver este problema, estamos aquí con una solución profesional que discutiremos en la siguiente sección de esta publicación.

Un método profesional para restaurar PST a Exchange Server

No le recomendamos que elija una solución al azar para restaurar los datos de PST en Exchange Server. Por lo tanto, al realizar varias investigaciones, estamos aquí con una solución inteligente y conveniente, es decir, Exchange Restore Software. Es demasiado fácil de manejar por todos los usuarios y restaurar cómodamente todos los datos del archivo PST a Exchange Server.

Funciones principales ofrecidas por Exchange Restore Software

El software es demasiado simple de usar y se puede instalar fácilmente en todas las versiones de Windows. Con unos pocos clics, la herramienta puede restaurar los elementos del buzón de Exchange.

No es necesario que MS Outlook restaure los datos PST en Exchange. Todos los correos electrónicos, contactos, notas, calendarios, etc. se restauran desde el archivo PST a Exchange Server.

Todas las versiones de Outlook son compatibles con la herramienta, como Outlook 2019, 2016, 2013, 2010, 2007, etc. La herramienta proporciona varios filtros mediante los cuales se pueden restaurar los datos deseados desde un archivo PST a Exchange Server. El programa se puede instalar en todas las versiones de Windows como Windows 10, 8.1, 8, 7, XP, Vista, etc.

Descargue la versión de demostración del software de restauración de Exchange y analice el funcionamiento del software restaurando los primeros 50 elementos por carpeta.

Líneas finales

No existe una solución manual para restaurar los buzones de correo de Exchange desde el archivo PST. Por lo tanto, hemos explicado una solución fácil e inteligente para restaurar datos de archivos PST en Exchange Server. Simplemente puede usar este software y restaurar todos los datos de PST a Exchange Server.

Más información:- https://www.datavare.com/software/exchange-restore.html

#intercambio de software de restauración #intercambio de restauración #buzón del servidor de intercambio #herramienta de restauración de intercambio

james allen

1611609121

Quick Pay Portal | www.quickpayportal.com | www.quickpayportal.com

Pay Medical Bills your bills @https://sites.google.com/view/www-quickpayportal-com/

It is really very easy to pay your bills at [priviabillpay.com](https://sites.google.com/view/www-quickpayportal-com/ "priviabillpay.com"). First of all, patients will have to go to the official Privia Medical Community Online portal . Patients can use the quick pay code of priviabillpay.com to make a one-time payment. On the first page of your statement, the QuickPay code is found. Using Priviabillpay to follow a few steps to get paid.

First of all, you must visit the official portal at [www.priviabillpay.com](https://sites.google.com/view/www-quickpayportal-com/ "www.priviabillpay.com")

In the box, fill out the QuickPay Code and tap Make a Payment.

You will be redirected to a page showing all your current rates.

Now select the fees you want to pay and click the check box that you want to accept quickly.

Finally, click on the payment option button.

Your payment details will be asked on the screen.

Fill out the field required and submit your payment.

Our Official Website : https://sites.google.com/view/www-quickpayportal-com/

#www.priviabillpay.com #www-quickpayportal-com #quickpayportal.com #www.quickpayportal.com. #quickpayportal.com.