Thierry  Perret

Thierry Perret

1656686160

Résoudre Un Problème De Graphe Avec Go

Dans ce tutoriel, nous allons apprendre à résoudre un problème de graphe avec Go. 

Au cours des deux derniers jours, j'ai regardé des interviews moqueuses en direct et même si je ne suis pas à la recherche d'un nouvel emploi (je suis très heureux chez Google), il est intéressant pour moi que tant de personnes luttent avec le même problème caché derrière des ornements compliqués.

L'un des exemples de questions fictives disait quelque chose comme ceci :

Imaginez que vous avez des images et que vous pouvez dupliquer n'importe quelle image que vous voulez, en créant une autre image. La nouvelle image (le doublon) peut également être copiée, et ainsi de suite. Bien que la nouvelle image ait la même apparence, le nom est différent et vous pouvez également la retracer jusqu'à l'image parente.

Maintenant, nous voulons supprimer toutes les images, mais nous ne pouvons pas supprimer une image si elle a des doublons. Vous devez implémenter une fonction qui renvoie l'ordre dans lequel les images peuvent être supprimées.

La fonction à implémenter est la suivante (nous utilisons Go pour tout le code dans ce 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.
}

La fonction reçoit une liste d'images, et les opérations de copie entre elles, puis elle doit renvoyer l'ordre que nous devons suivre pour supprimer toutes les images en fonction de la règle ci-dessus.

Prenons un exemple :

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

Cela signifie que A était l'image originale, et nous avons fait deux copies, B et C. Ensuite, nous avons fait une copie de B dans D. La sortie de notre fonction deleteOrderdevrait être [D, B, C, A] ou [D, C, B, A] ou [C, D, B, A]. Notez que plusieurs solutions sont possibles, mais toutes sont telles que chaque image n'est supprimée qu'après la suppression de ses copies.

Résoudre le problème.

Ce problème est un algorithme de tri topologique classique où une sorte de dépendances entre les objets est établie. Le même problème avec une formulation différente a été présenté aux candidats des entretiens fictifs, mais dans tous les cas, le problème a pu être réduit à un Tri Topologique.

La solution que nous présentons dans cet article est écrite de manière à ce que chaque pièce puisse être expliquée indépendamment. Cependant, dans une interview, il est acceptable d'écrire un code moins lisible pour des raisons de temps.

Construire le graphique

J'espère que maintenant, le lecteur peut se rendre compte qu'il s'agit d'un problème de graphique, qui à son tour devrait être le premier signal à l'intervieweur que le candidat comprend ce qui se passe.

Si nous construisons le graphique en utilisant l'exemple ci-dessus, nous devrions obtenir quelque chose comme :

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

Maintenant, créons une fonction qui, compte tenu de l'entrée, nous pouvons construire un graphique qui peut être utilisé pour résoudre le problème.

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
}

Construire le graphique

Notez que nous ajoutons d'abord tous les nœuds (images) au graphique, c'est important car il peut y avoir des images qui n'ont jamais été copiées, par conséquent, elles ne seront jamais dans les relations données. Ensuite, nous établissons les dépendances entre les nœuds.

Maintenant, nous pouvons implémenter la partie principale de l'algorithme, le tri topologique.

Tri topologique

Le tri topologique est un simple DFS qui parcourt le graphe en utilisant les dépendances comme arêtes dirigées et renvoie l'ordre inverse. Dans notre cas, nous nous intéressons à l'ordre inverse des dépendances puisque A — > B, nous devons d'abord supprimer B, puis 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 pour parcourir le graphe étant donné un nœud initial.

Le DFS parcourt le graphe à partir d'un nœud initial et renvoie les dépendances dans l'ordre inverse. La visitedvariable garde la trace des nœuds que nous avons déjà visités dans le graphe (pour ne pas les répéter), et la variable pathgarde la trace des dépendances inversées.

Maintenant que nous avons un moyen de construire le graphe et de le parcourir, nous devons tout assembler en même temps.

// 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
}

La DeletionOrderfonction construit le graphique avec l'entrée donnée, pour chaque nœud qui n'a pas été visité, il dfsest exécuté. La resultvariable contiendra les noms d'image dans l'ordre de suppression correct.

Le reste de la DeleteOrderfonction (ligne 14 et suivantes) s'assure simplement que nous sélectionnons les images à partir des noms d'images (en dehors de l'algorithme du graphe).

 

La majeure partie de l'algorithme n'a pas l'air si complexe, et pourtant tant de gens ne parviennent pas à résoudre ce problème, ce qui, à mon avis, est faisable en 45 minutes d'entretien. Mon observation est que la plupart des gens ne parviennent pas à identifier ce problème de graphe assez rapidement pour avoir le temps de mettre en œuvre une solution de travail.

autres considérations

Le même problème peut être pris dans des directions différentes selon la façon dont l'intervieweur veut le regarder.

Par exemple, la question de la mise à l'échelle de l'algorithme, lorsque le graphe a des milliers de nœuds, est intéressante. Bien qu'ils puissent sembler simples, certains cas délicats doivent être pris en compte.

Le problème de la détection si l'entrée donnée est correcte pourrait également être intéressant. Pour que le graphe soit triable, donc le tri topologique fonctionne correctement, le graphe ne doit pas avoir de cycles. La détection des cycles n'est pas un problème particulièrement complexe, mais le faire à grande échelle pourrait être un peu plus problématique.

Ce sont des questions intéressantes et le lecteur devrait prendre un moment pour y réfléchir et les implications de chacune.

Au final, dans un entretien de 45 minutes, il n'y a de temps disponible pour résoudre quelques-uns de ces points d'interrogation qu'après que le problème principal a été codé correctement. Cependant, nous espérons qu'après cet article, le lecteur pourra examiner certains problèmes et les réduire facilement dans cette catégorie graphique de problèmes résolubles à l'aide du tri topologique.

 

Bonne chance pour l'entretien.

Source : https://itnext.io/solver-a-graph-problem-with-go-f1049de33856

#go #graph 

What is GEEK

Buddha Community

Résoudre Un Problème De Graphe Avec Go
Thierry  Perret

Thierry Perret

1656686160

Résoudre Un Problème De Graphe Avec Go

Dans ce tutoriel, nous allons apprendre à résoudre un problème de graphe avec Go. 

Au cours des deux derniers jours, j'ai regardé des interviews moqueuses en direct et même si je ne suis pas à la recherche d'un nouvel emploi (je suis très heureux chez Google), il est intéressant pour moi que tant de personnes luttent avec le même problème caché derrière des ornements compliqués.

L'un des exemples de questions fictives disait quelque chose comme ceci :

Imaginez que vous avez des images et que vous pouvez dupliquer n'importe quelle image que vous voulez, en créant une autre image. La nouvelle image (le doublon) peut également être copiée, et ainsi de suite. Bien que la nouvelle image ait la même apparence, le nom est différent et vous pouvez également la retracer jusqu'à l'image parente.

Maintenant, nous voulons supprimer toutes les images, mais nous ne pouvons pas supprimer une image si elle a des doublons. Vous devez implémenter une fonction qui renvoie l'ordre dans lequel les images peuvent être supprimées.

La fonction à implémenter est la suivante (nous utilisons Go pour tout le code dans ce 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.
}

La fonction reçoit une liste d'images, et les opérations de copie entre elles, puis elle doit renvoyer l'ordre que nous devons suivre pour supprimer toutes les images en fonction de la règle ci-dessus.

Prenons un exemple :

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

Cela signifie que A était l'image originale, et nous avons fait deux copies, B et C. Ensuite, nous avons fait une copie de B dans D. La sortie de notre fonction deleteOrderdevrait être [D, B, C, A] ou [D, C, B, A] ou [C, D, B, A]. Notez que plusieurs solutions sont possibles, mais toutes sont telles que chaque image n'est supprimée qu'après la suppression de ses copies.

Résoudre le problème.

Ce problème est un algorithme de tri topologique classique où une sorte de dépendances entre les objets est établie. Le même problème avec une formulation différente a été présenté aux candidats des entretiens fictifs, mais dans tous les cas, le problème a pu être réduit à un Tri Topologique.

La solution que nous présentons dans cet article est écrite de manière à ce que chaque pièce puisse être expliquée indépendamment. Cependant, dans une interview, il est acceptable d'écrire un code moins lisible pour des raisons de temps.

Construire le graphique

J'espère que maintenant, le lecteur peut se rendre compte qu'il s'agit d'un problème de graphique, qui à son tour devrait être le premier signal à l'intervieweur que le candidat comprend ce qui se passe.

Si nous construisons le graphique en utilisant l'exemple ci-dessus, nous devrions obtenir quelque chose comme :

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

Maintenant, créons une fonction qui, compte tenu de l'entrée, nous pouvons construire un graphique qui peut être utilisé pour résoudre le problème.

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
}

Construire le graphique

Notez que nous ajoutons d'abord tous les nœuds (images) au graphique, c'est important car il peut y avoir des images qui n'ont jamais été copiées, par conséquent, elles ne seront jamais dans les relations données. Ensuite, nous établissons les dépendances entre les nœuds.

Maintenant, nous pouvons implémenter la partie principale de l'algorithme, le tri topologique.

Tri topologique

Le tri topologique est un simple DFS qui parcourt le graphe en utilisant les dépendances comme arêtes dirigées et renvoie l'ordre inverse. Dans notre cas, nous nous intéressons à l'ordre inverse des dépendances puisque A — > B, nous devons d'abord supprimer B, puis 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 pour parcourir le graphe étant donné un nœud initial.

Le DFS parcourt le graphe à partir d'un nœud initial et renvoie les dépendances dans l'ordre inverse. La visitedvariable garde la trace des nœuds que nous avons déjà visités dans le graphe (pour ne pas les répéter), et la variable pathgarde la trace des dépendances inversées.

Maintenant que nous avons un moyen de construire le graphe et de le parcourir, nous devons tout assembler en même temps.

// 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
}

La DeletionOrderfonction construit le graphique avec l'entrée donnée, pour chaque nœud qui n'a pas été visité, il dfsest exécuté. La resultvariable contiendra les noms d'image dans l'ordre de suppression correct.

Le reste de la DeleteOrderfonction (ligne 14 et suivantes) s'assure simplement que nous sélectionnons les images à partir des noms d'images (en dehors de l'algorithme du graphe).

 

La majeure partie de l'algorithme n'a pas l'air si complexe, et pourtant tant de gens ne parviennent pas à résoudre ce problème, ce qui, à mon avis, est faisable en 45 minutes d'entretien. Mon observation est que la plupart des gens ne parviennent pas à identifier ce problème de graphe assez rapidement pour avoir le temps de mettre en œuvre une solution de travail.

autres considérations

Le même problème peut être pris dans des directions différentes selon la façon dont l'intervieweur veut le regarder.

Par exemple, la question de la mise à l'échelle de l'algorithme, lorsque le graphe a des milliers de nœuds, est intéressante. Bien qu'ils puissent sembler simples, certains cas délicats doivent être pris en compte.

Le problème de la détection si l'entrée donnée est correcte pourrait également être intéressant. Pour que le graphe soit triable, donc le tri topologique fonctionne correctement, le graphe ne doit pas avoir de cycles. La détection des cycles n'est pas un problème particulièrement complexe, mais le faire à grande échelle pourrait être un peu plus problématique.

Ce sont des questions intéressantes et le lecteur devrait prendre un moment pour y réfléchir et les implications de chacune.

Au final, dans un entretien de 45 minutes, il n'y a de temps disponible pour résoudre quelques-uns de ces points d'interrogation qu'après que le problème principal a été codé correctement. Cependant, nous espérons qu'après cet article, le lecteur pourra examiner certains problèmes et les réduire facilement dans cette catégorie graphique de problèmes résolubles à l'aide du tri topologique.

 

Bonne chance pour l'entretien.

Source : https://itnext.io/solver-a-graph-problem-with-go-f1049de33856

#go #graph 

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

Reid  Rohan

Reid Rohan

1656899776

Graph-scroll: Simple Scrolling Events for D3 Graphs

graph-scroll.js

Simple scrolling events for d3 graphs. Based on stack

Demo/Documentation

graph-scroll takes a selection of explanatory text sections and dispatches active events as different sections are scrolled into to view. These active events can be used to update a chart's state.

d3.graphScroll()
    .sections(d3.selectAll('#sections > div'))
    .on('active', function(i){ console.log(i + 'th section active') })

The top most element scrolled fully into view is classed graph-scroll-active. This makes it easy to highlight the active section with css:

#sections > div{
	opacity: .3
} 

#sections div.graph-scroll-active{
	opacity: 1;
}

To support headers and intro images/text, we use a container element containing the explanatory text and graph.

<h1>Page Title</div>
<div id='container'>
  <div id='graph'></div>
  <div id='sections'>
    <div>Section 0</div>
    <div>Section 1</div>
    <div>Section 2</div>
  </div>
</div>
<h1>Footer</h1>

If these elements are passed to graphScroll as selections with container and graph, every element in the graph selection will be classed graph-scroll-graph if the top of the container is out of view.

d3.graphScroll()
	.graph(d3.selectAll('#graph'))
	.container(d3.select('#container'))
  .sections(d3.selectAll('#sections > div'))
  .on('active', function(i){ console.log(i + 'th section active') })

When the graph starts to scroll out of view, position: sticky keeps the graph element stuck to the top of the page while the text scrolls by.

#container{
  position: relative;
}

#sections{
  width: 340px;
}

#graph{
  margin-left: 40px;
  width: 500px;
  position: sticky;
  top: 0px;
  float: right;
}

On mobile centering the graph and sections while adding a some padding for the first slide is a good option:

@media (max-width: 925px)  {
  #graph{
    width: 100%;
    margin-left: 0px;
    float: none;
  }

  #sections{
    position: relative;
    margin: 0px auto;
    padding-top: 400px;
  }
}

Adjust the amount of pixels before a new section is triggered is also helpful on mobile (Defaults to 200 pixels):

graphScroll.offset(300)

To update or replace a graphScroll instance, pass a string to eventId to remove the old event listeners:

graphScroll.eventId('uniqueId1')

Author: 1wheel
Source Code: https://github.com/1wheel/graph-scroll 
License: MIT license

#javascript #d3 #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

Solving a Graph Problem with Go

In this tutorial, we will learn how to solve a Graph Problem with Go. 

During the last couple of days, I have been watching live mocking interviews and even though I am not in the market for a new job (I am very happy at Google), it results interesting to me that so many people struggle with the same problem hidden behind some complicated adornments.

See more at: https://itnext.io/solving-a-graph-problem-with-go-f1049de33856

#go #graph