图和图的算法:
图的定义:由边的集合及顶点的集合组成。
例如地图,每个城镇是顶点,道路是边,由顶点对来定义(城镇1,城镇2)简称(v1,v2)顶点也有权重——成本。
基本概念:
有向图:图的顶点对是有序的。——有箭头(常用的流程图)
无向图:图是无序的。——无箭头指向的。
路径:图中一系列顶点构成。
路径长度:路径中第一个顶点到最后一个顶点之间的数量表示。
环:指向自身的顶点组成的路径。环的长度为0;
圈:至少有一条边的路径,且路径的第一个定点和最后一个顶点相同。
简单圈:无论是有向图还是无向图,只要是没有重复边或重复顶点的圈。
平凡圈:除了第一个和最后一个顶点以外,路径的其他顶点有重复的圈。
强连通:两个顶点之间有路径,这两个顶点之间是强连通的,反之亦然。
强连通图:有向图的所有顶点都是强连通的。
一、图类:
图和树,二叉树很像。一可以试用数的方式创建一个图,节点表示一个顶点。但用基于对象的方式去处理会产生问题,因为图会增长到非常大。这样树的结构的效率会很低下。
1.1 顶点的表示:
和二叉树的穿件基本一致,先创建一个顶点类Vertex来保存顶点和边。里面有两个成员。一个用于标识顶点label,另一个表明这个顶点是否被访问过的布尔值wasVisited.
        function Vertex(label) {
this.label = label;
}
1.2 表示边
  图的信息都保存在边上,因为他们描述了图的结构。当然不能像二叉树的表现形式那样,因为他很固定一个父节点只能有两个子节点。而图的结构要灵活得多,一个顶点可以有一条边,多条边和他相连。
1.2.1 邻接表(邻接表数组):数组与链表相结合的存储方法。
  邻接表的处理方法:
  1、图中顶点用一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
  2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。
  左边是一维数组,表示顶点,右边用链表表示图中每个顶点所有的邻接点构成的线性表。
  表示图最佳方法。江边存储为由顶点的相邻顶点列表构成的数组,并以此顶点作为索引。
1.2.2 邻接矩阵:是一个二维数组。是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。
  正对于这两种存储结构,下一篇做详细的介绍。
1.3 构建图:
        function Graph(v) {
this.vertices = v;
this.edges = 0;
this.ajd = [];
for(var i = 0;i < this.vertices;i++) {
this.ajd[i] = [];
this.ajd[i].push("");
}
this.addEdge = addEdge;
this.toString = toString;
}
图的初始化,记录了一个图表示的边上的数量。用一个长度与图的顶点相同的数组记录顶点的数量。for循环是给每一个数组中的元素(顶点)创建一个子数组来存储所有相邻的顶点(链表),并将所有元素初始化为空字符串。
        function assEdge(v,w) {
this.ajd[v].push(w);
this.ajd[w].push(v);
edges++;
}
向邻接表中添加元素。如传入A,B时。先查找顶点A的邻接表,将B添加搭配列表中,然后再查找顶点B的邻接表,将顶点A插入列表。最后边数加1。
        function showGraph() {
for(var i = 0;i < this.vertices;i++) {
console.log(i+" ->");
for(var j = 0;j < this.vertices;j++) {
if(this.adj[i][j] != undefined) {
console.log(this.adj[i][j]+"");
}
}
console.log("");
}
}
//test...
var gr = new Graph(5);
gr.addEdge(0,1);
gr.addEdge(0,2);
gr.addEdge(1,3);
gr.addEdge(2,4);
gr.showGraph();

完整代码:

        ~(function() {
function Graph(v) {
this.vertices = v;
this.edges = 0;
this.adj = [];
for(var i = 0;i < this.vertices;i++) {
this.adj[i] = [];
this.adj[i].push("");
}
//this.addEdge= addEdge;
//this.showGraph = showGraph;
}
Graph.prototype.addEdge = function(v,w) {
this.adj[v].push(w);
this.adj[w].push(v);
this.edges++;
};
Graph.prototype.showGraph = function() {
for(var i = 0;i < this.vertices;i++) {
console.log(i+"--> ");
for(var j = 0;j < this.vertices;j++) {
if(this.adj[i][j] != undefined) {
console.log(this.adj[i][j] +"");
}
}
}
};
var gr1 = new Graph(5);
gr1.addEdge(0,1);
gr1.addEdge(0,2);
gr1.addEdge(1,3);
gr1.addEdge(2,4);
gr1.showGraph();
})();
1.4 搜索图:
从一个指定的顶点到达其他的顶点。两种基础搜索:深度优先和广度优先。
1.4.1 深度优先搜索
从一条路径的顶点开始追溯,知道这条路径的最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,往复如此,直到没有路径为止。这不是在搜索特定的路径,而是通过搜索来查看在图中有哪些路径可以选择。
算法:访问一个没有被访问过的顶点,将他标记为已访问,在递归的去访问在初始顶点的邻接表中其他没有访问过的顶点。
此算法需要给Graph类添加一个数组用来存储已经访问过的顶点,将他的元素全部初始化为false。
        function Graph(v) {
this.vertices = v;
this.edges = 0;
this.adj = [];
for(var i = 0;i < this.vertices;i++) {
this.adj[i] = [];
this.adj[i].push(" ");
}
this.marked = [];
for(var j = 0;j < this.vertices;j++) {
this.marked[i] = false;
}
this.addEdge = addEdge;
this.showGraph = showGraph;
this.deepFirst = deepFirst;
}
function addEdge(v,w) {
this.adj[v].push(w);
this.adj[w].push(v);
this.edges++;
}
function showGraph(){
for(var i = 0;i < this.vertices;i++) {
console.log(i+"-->");
for(var j = 0;j < this.vertices;j++) {
if(this.adj[i][j] != undefined) {
console.log(this.adj[i][j] + " ");
}
}
}
}
function deepFirst(v) {
this.marked[v] = true;
if(this.adj[v] != undefined) {
console.log("访问的顶点:"+v);
}
for(var w in this.adj[v]) {
//alert(0);
if(!this.marked[w]) {
this.deepFirst(w);
alert(1);
}
}
}
var gr = new Graph(5);
gr.addEdge(0,1);
gr.addEdge(0,2);
gr.addEdge(1,3);
gr.addEdge(2,4);
gr.showGraph();
gr.deepFirst(4);
												

JavaScript--数据结构与算法之图的更多相关文章

  1. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  2. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  3. 前端开发周报: CSS 布局方式方式与JavaScript数据结构和算法

    前端开发周报:CSS 布局方式与JavaScript动画库 1.常见 CSS 布局方式详见: 一些常见的 CSS 布局方式梳理,涉及 Flex 布局.Grid 布局.圣杯布局.双飞翼布局等.http: ...

  4. 为什么我要放弃javaScript数据结构与算法(第十一章)—— 算法模式

    本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的 ...

  5. 为什么我要放弃javaScript数据结构与算法(第十章)—— 排序和搜索算法

    本章将会学习最常见的排序和搜索算法,如冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序,以及顺序排序和二叉搜索算法. 第十章 排序和搜索算法 排序算法 我们会从一个最慢的开始,接着是一些性能好 ...

  6. 为什么我要放弃javaScript数据结构与算法(第八章)—— 树

    之前介绍了一些顺序数据结构,介绍的第一个非顺序数据结构是散列表.本章才会学习另一种非顺序数据结构--树,它对于存储需要快速寻找的数据非常有用. 本章内容 树的相关术语 创建树数据结构 树的遍历 添加和 ...

  7. javascript数据结构与算法 零(前记+前言)

    前记 这本书Data Structure and Algorithm with Javascript 我将其翻译成<< javascript 数据结构和算法>> 为什么这么翻译 ...

  8. 重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈

    定场诗 金山竹影几千秋,云索高飞水自流: 万里长江飘玉带,一轮银月滚金球. 远自湖北三千里,近到江南十六州: 美景一时观不透,天缘有分画中游. 前言 本章是重读<学习JavaScript数据结构 ...

  9. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  10. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

随机推荐

  1. SCO Openserver、SCO Unix、SCO UnixWare、Solaris几者到底是什么关系,有什么相同或不同?

    Unix操作系统的历史漫长而曲折,它的第一个版本是1969年由Ken Thompson在AT&T贝尔实验室实现的,运行在一台DEC PDP-7计算机上.这个系统非常粗糙,与现代Unix相差很远 ...

  2. mongodb 的数据备份与恢复

    导入/导出可以操作是本地的或远程的,所以都有以下通用选项[如果是操作本地机并且没有密码的话可以省去]:                1.-h host         主机              ...

  3. Host status showing red icon in chronograph, Chronograf主机列表页显示主机状态为红色标志

    刚开始全部装好的时候主机显示的状态是绿色的,过了些日子我再打开看的时候就变成红色的了,点击主机进去查看的时候没有了图表数据,大概是这样子的, 在influxdb数据库主机上执行命令curl " ...

  4. vue组件递归的一些理解

    自己做个小项目练手,需要用到组件递归,网上查了一些资料,每个代码片段都认识,但是连起来,就一团浆糊. 既然人傻就多思考吧.不明白的点有以下: 1.组件怎么自己调用自己,函数的递归是就是在functio ...

  5. svn 学习

    svn命令在linux下的使用 svn命令在linux下的使用SVN软件版本管理 1.将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn che ...

  6. 最长回文字串 (The longest palindrome substring)

    这两天去学了一下,觉得下面那篇文章写的很好,有例子,比较容易懂,所以转一下. 以下内容来自:hihoCoder: 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  7. TortoiseGit 弹出 git@xxx.com's password 对话框

    安装完 tortoise git,用它克隆项目的时候,一直弹出git@xxx.com's password 对话框 解决的办法是,将ssh客户端默认的路径,换为git 安装目录下ssh.exe的路径就 ...

  8. CMSIS-RTOS 简介

    CMSIS-RTOS API是基于Arm®Cortex®-M处理器的设备的通用RTOS接口.CMSIS-RTOS为需要RTOS功能的软件组件提供标准化API,从而为用户和软件行业带来了巨大的好处. C ...

  9. linux 下查看二进制文件

    查看二进制有以下几种方法: 方法一:hexdump apt-get install libdata-hexdumper-perl 安装好之后就可以直接hexdump your_binary_file ...

  10. Spring-statemachine给end状态设置action

    Spring-statemachine版本:当前最新的1.2.3.RELEASE版本 builder.configureStates() .withStates() .initial(generate ...