图:是由边和定点的集合组成;  按照图的定点对是否有序可以分为:有向图和无向图;

 路径:所有顶点都由边连接构成;路径长度为第一个定点到最后一个顶点之间的数量;

 环:指向自身的顶点,长度为0;:至少有一条边的路径,且第一个顶点和最后一个顶点相同;

强连通:如果两个顶点之间有路径,则这两个顶点就是强连通,反之;

构建简单有向图:

利用邻接表数组表示:构建二维数组,第一个存储顶点标号,第二个存储与这个顶点相连的顶点标号;

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;
}
function addEdge(v,w) { //构建边
this.adj[v].push(w);
this.adj[w].push(v);
this.edges++;
}
function showGraph() {
var str = "";
for(var i = 0; i < this.vertices; ++i) {
str = i + "-->";
for(var j = 0; j < this.vertices; ++j) {
if(this.adj[i][j] != undefined) {
str += this.adj[i][j] + " ";
}
}
console.log(str);
}
}

 操作:demo: 

 搜索图:确定从一个指定顶点可以到达其他哪些顶点;注意:在更换顶点之后,图的树结构也要变化;

  • 深度优先搜索:从一条路径开始知道最后一个顶点,然后回溯继续下一条路径,反复直到没有路径;

    • 查找与当前顶点相邻未访问的顶点,将其值输出,并在标记数组中将相应标号标记为true;
    • 依次重复;

function init() {
for(var i = 0; i < this.vertices; ++i) {
this.adj[i] = [];
this.marked[i] = false;
}
}
function dfs(v) {
this.marked[v] = true;
var adj = this.adj[v],nextAdj;
if(adj != undefined) {
console.log("Visited vertex: " + v);
}
for(var w in adj) {
var nextAdj = this.adj[v][w];
if(!this.marked[nextAdj]) {
this.dfs(nextAdj);
} }
}

操作:demo:

  • 广度优先搜索:首先检查最靠近第一个顶点的层,然后逐层搜索;

    • 查找与当前顶点相邻未访问的顶点;将其添加到已访问列表;
    • 这一层访问之后从图中取出下一个顶点,添加到以访问列表;
    • 继续;

//在 Graph 中添加this.edgeTo = [];来记录哪个顶点访问到它,所以第一个会是undefined;

function dfs(s) {
var queue = [],adj = this.adj[s],nextAdj;
this.marked[s] = true;
queue.push(s);
while(queue.length > 0) {
var v = queue.shift();
if(v != undefined) {
console.log("Visited vertex: " + v);
}
adj = this.adj[v];
for(var w in adj) {
var nextAdj = this.adj[v][w];
if(!this.marked[nextAdj]) {
this.edgeTo[nextAdj] = v;
this.marked[nextAdj] = true;
queue.push(nextAdj);
}
} }
}

操作:demo:

 查找最短路径:

广度优先搜索对应的最短路径:

function pathTo(s,v) { //from s to v;
this.dfs(s);
if(!this.hasPathTo(v)) {
return undefined;
}
var path = [];
for(var i = v;i != s; i = this.edgeTo[i]) {
path.push(i);
}
path.push(s);
this.printPath(path);
}
function hasPathTo(v) {
return this.marked[v];
}
function printPath(paths) {
var str = "";
while(paths.length > 0) {
if(paths.length > 1) {
str += paths.pop() + "-";
} else {
str += paths.pop();
}
}
console.log(str);
}

 操作:demo:

 拓扑排序:

优先级约束调度:在进行完1的时候才能开始2,之后可以同时开始3,4,以此类推;

js:数据结构笔记10--图和图算法的更多相关文章

  1. JS学习笔记10之Math对象

    -->Math对象 常用属性和方法-->使用Math对象制作相应的效果 Math对象用于执行数学任务 一.Math对象的属性: 二.Math对象的方法: 三.常用属性和方法: Math.P ...

  2. 廖雪峰js教程笔记10 浏览器对象

    JavaScript可以获取浏览器提供的很多对象,并进行操作. window window对象不但充当全局作用域,而且表示浏览器窗口. window对象有innerWidth和innerHeight属 ...

  3. js:数据结构笔记14--高级算法

    动态规划: 递归是从顶部开始将问题分解,通过解决所有分解出小问题来解决整体问题: 动态规划从底部开始解决问题,将所有小问题解决,然后合并掉一个整体解决方案: function dynFib(n) { ...

  4. js:数据结构笔记13--检索算法

    顺序查找:也称线性查找,暴力查找的一种 基本格式: var nums = []; for(var i = 0; i < 10; ++i) { nums[i] = Math.floor(Math. ...

  5. js:数据结构笔记12--排序算法(2)

    高级排序算法:(处理大数据:百万以上) 希尔排序:是插入排序的优化版: 首先设置间隔数组,然后按照每个间隔,分别进行排序: 如第一个间隔为5,首先a[5]与a[0]进行插入排序;然后a[6]和a[0] ...

  6. js:数据结构笔记11--排序算法(1)

    基本准备: function CArray(numElems) { this.dataStore = []; this.pos = 0; this.numElems = numElems; this. ...

  7. js:数据结构笔记9--二叉树

    树:以分层的方式存储数据:节点:根节点,子节点,父节点,叶子节点(没有任何子节点的节点):层:根节点开始0层: 二叉树:每个节点子节点不超过两个:查找快(比链表),添加,删除快(比数组): BST:二 ...

  8. js:数据结构笔记7--哈希表

    哈希表(散列表):通过哈希函数将键值映射为一个字典; 哈希函数:依赖键值的数据类型来构建一个哈希函数: 一个基本的哈希表:(按字符串计算键值) function HashTable() { this. ...

  9. js:数据结构笔记5--链表

    数组: 其他语言的数组缺陷:添加/删除数组麻烦: js数组的缺点:被实现为对象,效率低: 如果要实现随机访问,数组还是更好的选择: 链表: 结构图: 基本代码: function Node (elem ...

随机推荐

  1. 模板插件aTpl.js新增功能

    摘要: aTpl.js是一款模板插件,该插件支持ie5+,chrome等浏览器以及移动端浏览器,支持for和if语法,以及表达式.最近对aTpl.js模板插件增加了新的功能,支持字符串模板,同时增加了 ...

  2. 完美串(区间dp)

    完美串 Description 爱美之心人皆有之,GG也不例外.所以GG他对于完美串有一种热衷的爱.在GG眼中完美串是一个具有无比魅力的01子串.这个子串有之其魅力之处,对它取反后水平翻转,它又和它原 ...

  3. Caesar's Legions(三维dp)

    Caesar's Legions Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...

  4. WPF 样式和行为

    样式(style):组织和重用格式化选项的重要工具,将细节如边距.字体.字号等信息封装起来,然后再需要的地方通过属性来应用样式. 行为(behavior):封装一些通用的UI行为,如拖动,缩放元素的代 ...

  5. Python socket 详解

    socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的资源.如果协议protocol未指定(等于0),则使用缺省的连接方式. 对于使用一给定地址族的某一特定套接口, ...

  6. HDOJ 1690

    Bus System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. Android 中 设置TextView垂直滚动

    布局文件 android:scrollbars="vertical" android:singleLine="false" 代码文件 ctl_tv_conten ...

  8. 【转】SQL删除重复记录,只保留其中一条

    SQL:删除重复数据,只保留一条用SQL语句,删除掉重复项只保留一条在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peop ...

  9. iOS 和 Android 中的后台运行问题

    后台机制的不同,算是iOS 和 Android的一大区别了,最近发布的iOS7又对后台处理做了一定的更改,找时间总结一下编码上的区别,先做个记录. 先看看iOS的把,首先需要仔细阅读一下Apple的官 ...

  10. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...