{"componentChunkName":"component---src-components-blogpost-blogpost-jsx","path":"/blog/dt6/","result":{"data":{"site":{"siteMetadata":{"title":"K011"}},"mdx":{"id":"edd7ad0d-5aff-51e2-b974-ac1f2f10f4fc","body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Graphs\",\n  \"date\": \"2021-07-26\",\n  \"description\": \"Binary Trees,Binary Heap\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Graphs\"), mdx(\"p\", null, \"The graph is a data structure, in which different types of elements (data) that are used to process or to know for specific purposes are stored. \"), mdx(\"p\", null, \"Additionally, these nodes can be linked or connected to other nodes through elements that we call edges.\\nThis data structure is recognized and widely used because it has a great capacity to handle high volumes of data and be easily processed by search engines or database managers. One of them can be \", mdx(\"a\", {\n    href: \"https://neo4j.com/\",\n    className: \"link  white hover-white-60\",\n    target: \"_blank\"\n  }, \"Neo4j\")), mdx(\"p\", null, \"This data structure can handle very simple data such as different clothes:\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/7AacReB.png\"\n  })), mdx(\"p\", null, \"Complex data such as citys of a country:\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/M81CIls.png\"\n  })), mdx(\"p\", null, \"or even super complex data types such as the internet:\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/rTLLW5b.png\"\n  })), mdx(\"p\", null, \"for more information about this last graph, see \", mdx(\"a\", {\n    href: \"https://www.opte.org/the-internet\",\n    className: \"link  white hover-white-60\",\n    target: \"_blank\"\n  }, \"this link\")), mdx(\"p\", null, \"this makes graphs highly utilized in the computer science.\"), mdx(\"h2\", null, \"Tipos de Grafos\"), mdx(\"p\", null, \"There are several types of graph but we can classify them in categories\"), mdx(\"h3\", null, \"Directed and Undirected graphs:\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/SAeIwJV.png\"\n  })), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Directed:\"), \" The directed graphs are those that present an orientation in the connection of the graphs, mostly this is represented graphically with arrows.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"UnDirected:\"), \" These graphs the edges do not have a defined sense so they are not necessarily symmetrical.\"))), mdx(\"h3\", null, \"Weighted and unweighted graph\"), mdx(\"p\", null, \"-\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Weighted Graph\")), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/E9WX4je.png\"\n  })), mdx(\"p\", null, \"These graphs are used to represent complex social networks with valued relationships. This means that the edges have a cost, this cost can be represented by weight, lenght etc.\"), mdx(\"p\", null, \"Estos grafos se utilizan por ejemplo para representar las ciudades de un pais, relaciones sociales, etc\"), mdx(\"p\", null, \"-\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"UnWeighted Graph\")), mdx(\"p\", null, \"Este grafo cada relacion o cada arista no tiene peso. Por lo que es facil de representar\"), mdx(\"h3\", null, \"Cyclic\"), mdx(\"p\", null, \"El Grafo se le dice ciclico si los unicos vertices repetidos son el primero y el ultimo\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/03JWcDR.png\"\n  })), mdx(\"p\", null, \"UN grafo sin ciclos se le denomina Acyclic y sin ciclos dirigidos se le llama Acyclico dirigido.  \"), mdx(\"h2\", null, \"Grafos especiales:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Un grafo DAG\"), \", El cual significa Directed Acyclic Graph: y como lo dice el nombre este grafo es un grafo dirigido y acyclico. Es muy utilizado en el mundo real y en la informatica\", mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-80-l w-80\",\n    src: \"https://imgur.com/mkkuJp6.png\"\n  })), \"Por ejemplo muchas criptomonedas utilizan este tipo de grafos y tienen la particularidad de que no existe la notacion de bloques ni se requiere minar\")), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/lqAh9PB.png\"\n  })), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, \"Existen tambien los grafos \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"No-directed acyclic\"), \" estos grafos los llamamos arboles, tambien son altamente utilizados en las ciencias de la computacion\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/SI686hO.png\"\n  })), \"Este grafo puede tener un nodo root el cual desde ese punto se pueden llegar a los demas puntos -out-tree: arborescence -in-Tree:  anti-arborescence\", mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/wz56Sie.png\"\n  }))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"bipartite graps\"), \": is a graph whose vertices can be divided into two independent sets, U and V such that every edge (u, v) either connects a vertex from U to V or a vertex from V to U. In other words, for every edge (u, v), either u belongs to U and v to V, or u belongs to V and v to U. We can also say that there is no edge that connects vertices of same set\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/F8CZuA6.png\"\n  }))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Complete Graphs\"), \"\\nes un grafo donde cada vertice esta conectado con una arista\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"(is a graph thtat is ther vertices is connected with every arista)\")), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/CUvFgSR.png\"\n  })))), mdx(\"h2\", null, \"Methods to implement\"), mdx(\"h3\", null, \"Edge list\"), mdx(\"p\", null, \"esta es una forma de representar vertices adyacentes.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"edgeList = [\\n    [1,2],\\n    [2,3],\\n    [3,1]\\n]\\n\")), mdx(\"p\", null, \"Tiene pros y contras:\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Pros:\"), \" \"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"es eficiente en el espacio con sparse graphs y facil de representar cada grafo\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"iterar sobre todos los nodos es eficiente\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Es una estructura muy simple\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Contras:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Es menos eficiente en el espacio con denser graphs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Edge weight lookup is O(E)\")), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/2BZnokr.png\"\n  })), mdx(\"h3\", null, \"Adjacent list (index of the array is the value of actual graph)\"), mdx(\"p\", null, \"Es similar a una edge list, pero a diferencia de esta el tama\\xF1o de arrays el numero de listas y su tama\\xF1o es igual al numero de vertices. Esta se utiliza en los graphs weighted.\"), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/AOKChNz.png\"\n  })), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"class AdjNode:\\n    def __init__(self, data):\\n        self.vertex = data\\n        self.next = None\\n  \\n  \\nclass Graph:\\n    def __init__(self, vertices):\\n        self.V = vertices\\n        self.graph = [None] * self.V\\n \\n    def add_edge(self, src, dest):\\n        node = AdjNode(dest)\\n        node.next = self.graph[src]\\n        self.graph[src] = node\\n  \\n        node = AdjNode(src)\\n        node.next = self.graph[dest]\\n        self.graph[dest] = node\\n  \\n    def print_graph(self):\\n        for i in range(self.V):\\n            print(\\\"Adjacency list of vertex {}\\\\n head\\\".format(i), end=\\\"\\\")\\n            temp = self.graph[i]\\n            while temp:\\n                print(\\\" -> {}\\\".format(temp.vertex), end=\\\"\\\")\\n                temp = temp.next\\n            print(\\\" \\\\n\\\")\\n\")), mdx(\"p\", null, \"Esta implementacion de grafo junto a adjacent matrix son las mas utilizadas, pero esta tiene pros y contras:\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Pros:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"El espacio es eficiente para representar sparse graphs\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"iterar en todos los edges es eficiente\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Cons:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Menos espacio eficiente para grafos densos\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"edge weight lookup is O(n)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Es la representacion mas compleja de un grafo\")), mdx(\"h3\", null, \"Adjacent Matrix\"), mdx(\"p\", null, \"Una representacion de un grafo con la adjacent matrix es una matrix de booleanos en un computador, donde cada valor booleano indica si el valor que tiene cada direccion entre 2 vertices.\"), mdx(\"p\", null, \"Como cualquier representacion tiene pros y contras \"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Pros:\"), \" \"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"es eficiente para representar grafos densos\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"para ver el peso de una direccion es de complejidad O(1)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"es la representacion mas simple de un grafo\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Cons:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Requires O(n^2) de espacio\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"iterar todos los vertices va a tomar un O(n^2) de tiempo\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Implementacion:\")), mdx(\"center\", null, mdx(\"img\", {\n    className: \"w-60-l w-80\",\n    src: \"https://imgur.com/1aGWGTU.png\"\n  })), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"class Graph(object):\\n\\n    def __init__(self, size):\\n        self.adjMatrix = []\\n        for i in range(size):\\n            self.adjMatrix.append([0 for i in range(size)])\\n        self.size = size\\n\\n    def add_edge(self, v1, v2):\\n        if v1 == v2:\\n            print(\\\"Same vertex %d and %d\\\" % (v1, v2))\\n        self.adjMatrix[v1][v2] = 1\\n        self.adjMatrix[v2][v1] = 1\\n    def remove_edge(self, v1, v2):\\n        if self.adjMatrix[v1][v2] == 0:\\n            print(\\\"No edge between %d and %d\\\" % (v1, v2))\\n            return\\n        self.adjMatrix[v1][v2] = 0\\n        self.adjMatrix[v2][v1] = 0\\n\\n    def __len__(self):\\n        return self.size\\n\")));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Graphs","date":"2021-07-26","description":"Binary Trees,Binary Heap"}},"allMdx":{"edges":[{"node":{"frontmatter":{"title":"Classification","date":"2021-11-03","description":"Naive Bayes, Discriminant Analysis, Logistic Regression"},"fields":{"slug":"/blog/est4/"}}},{"node":{"frontmatter":{"title":"Regression and Prediction","date":"2021-11-02","description":"REGRESSION"},"fields":{"slug":"/blog/est3/"}}},{"node":{"frontmatter":{"title":"Distribution","date":"2021-11-01","description":"Data distributions"},"fields":{"slug":"/blog/est1/"}}},{"node":{"frontmatter":{"title":"Stats Testing","date":"2021-11-01","description":"Statistical Experiments and significance testing"},"fields":{"slug":"/blog/est2/"}}},{"node":{"frontmatter":{"title":"Recursion","date":"2021-08-26","description":"Algorithm recursion"},"fields":{"slug":"/blog/alg1/"}}}]}},"pageContext":{"slug":"/blog/dt6/","id":"edd7ad0d-5aff-51e2-b974-ac1f2f10f4fc"}},"staticQueryHashes":["63159454"]}