算法系列 图数据结构探索(无向图搜索)

2018 年 7 月 5 日 大数据和云计算技术

算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第10篇《无向图搜索》,非常赞!希望对大家有帮助,大家会喜欢!

前面系列文章:   

归并排序

#算法基础#选择和插入排序

由快速排序到分治思想    

算法基础:优先队列

二分查找

二叉树查找

平衡查找树概述

平衡树之红黑树

算法基础9:散列表

   

  随着图数据库,图计算,知识图谱的兴起,图这种数据结构使用逐渐面向大众,更为的广泛。使用我们这个篇章会给大家介绍图的一些数据结构及其对应相关的一些算法,希望大家能够喜欢,并对大家理解知识图谱,图计算有所帮助

   本篇从无向图搜索讲起,说起无向图搜索 主要分为两块一块时深度优先,一块时广度优先。其实图搜索可以我在电脑里有一个文件夹,这个文件夹里有很多细分文件夹,而我们要便利每一个文件夹的一个过程。

而深度优先指的是,我先打开最开始的那个文件夹,之后再打开他下面的第一个文件夹,之后再打开这个子文件的子文件夹,循环往复的一个过程 ,直到所有的文件夹里的文件都便利过一遍。同理广度优先是指我先打开这个文件夹里的所有文件,然后再逐个打开他子文件的所有文件的一个循环往复的一个过程。


二话不说上代码吧 哈哈

深度优先搜索代码

public class DepthFirstPaths {
private boolean[] marked;
  private int[] edgeTo;
  private final int s;

  public DepthFirstPaths(Graph G, int s) {
marked = new boolean[G.V()];
     edgeTo = new int[G.V()];
     this.s = s;
     dfs(G, s);
  }

private void dfs(Graph G, int v) {
marked[v] = true;
     for (int w : G.adj(v)) {
if (!marked[w]) {
edgeTo[w] = v;
           dfs(G, w);
        }
}
}

public boolean hasPathTo(int v) {
return marked[v];
  }

public Iterable<Integer> pathTo(int v) {
if (!hasPathTo(v)) {
return null;
     }
Stack<Integer> path = new Stack<Integer>();
     for (int x = v; x != s; x = edgeTo[x]) {
path.push(x);
     }
path.push(s);
     return path;
  }

public static void main(String[] args) {
Graph G = new Graph(new In(args[0]));
     int s = Integer.parseInt(args[1]);
     DepthFirstPaths search = new DepthFirstPaths(G, s);
     for (int v = 0; v < G.V(); v++) {
StdOut.print(s + " to " + v + ": ");
        if (search.hasPathTo(v)) {
for (int x : search.pathTo(v)) {
if (x == s) {
StdOut.print(x);
              } else {
StdOut.print("-" + x);
              }
}
}
StdOut.println();
     }
}


广度优先搜索代码

public class BreadthFirstPaths {
private boolean[] marked;
  private int[] edgeTo;
  private int[] distTo; // Add for Exercise 4.1.13
  private final int s;

  public BreadthFirstPaths(Graph G, int s) {
marked = new boolean[G.V()];
     edgeTo = new int[G.V()];
     distTo = new int[G.V()]; // Add for Exercise 4.1.13
     this.s = s;
     bfs(G, s);
  }

private void bfs(Graph G, int s) {
Queue<Integer> queue = new Queue<Integer>();
     marked[s] = true;
     // Add for Exercise 4.1.13
     for (int v = 0; v < G.V(); v++) {
distTo[v] = Integer.MAX_VALUE;
     }
distTo[s] = 0;
     queue.enqueue(s);
     while (!queue.isEmpty()) {
int v = queue.dequeue();
        for (int w : G.adj(v)) {
if (!marked[w]) {
edgeTo[w] = v;
              marked[w] = true;
              distTo[w] = distTo[v] + 1; // Add for Exercise 4.1.13
              queue.enqueue(w);
           }
}
}
}

public boolean hasPathTo(int v) {
return marked[v];
  }

public Iterable<Integer> pathTo(int v) {
if (!hasPathTo(v)) {
return null;
     }
Stack<Integer> path = new Stack<Integer>();
     for (int x = v; x != s; x = edgeTo[x]) {
path.push(x);
     }
path.push(s);
     return path;
  }

/**
   * Exercise 4.1.13
   *
   * @param v
   * @return
   */
  public int distTo(int v) {
return distTo[v];
  }

public static void main(String[] args) {
Graph G = new Graph(new In(args[0]));
     int s = Integer.parseInt(args[1]);
     BreadthFirstPaths search = new BreadthFirstPaths(G, s);
     for (int v = 0; v < G.V(); v++) {
StdOut.print(s + " to " + v + ": ");
        if (search.hasPathTo(v)) {
for (int x : search.pathTo(v)) {
if (x == s) {
StdOut.print(x);
              } else {
StdOut.print("-" + x);
              }
}
}
StdOut.println();
     }
}
}


应用再知识图谱中风控大量的应用了无向图搜索的内容,有兴趣的同学可以自己去找找相关资料。

猜你喜欢




#大数据和云计算机技术社区#博客精选(2017)

NoSQL 还是 SQL ?这一篇讲清楚

阿里的OceanBase解密

#大数据和云计算技术#: "四有"社区介绍

大数据和云计算技术周报(第56期)

新数仓系列:Hbase周边生态梳理(1)

《大数据架构详解》第2次修订说明

简单梳理跨数据中心数据库

云观察系列:漫谈运营商公有云发展史

云观察系列:百度云的一波三折

云观察系列:阿里云战略观察

超融合方案分析系列(7)思科超融合方案分析

加入技术讨论群




《大数据和云计算技术》社区群人数已经3000+,欢迎大家加下面助手微信,拉大家进群,自由交流。


喜欢QQ群的,可以扫描下面二维码:

欢迎大家通过二维码打赏支持技术社区(英雄请留名,社区感谢您,打赏次数超过108+):



登录查看更多
0

相关内容

【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
166+阅读 · 2020年3月27日
专知会员服务
60+阅读 · 2020年3月19日
专知会员服务
53+阅读 · 2020年3月16日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
知识图谱本体结构构建论文合集
专知会员服务
106+阅读 · 2019年10月9日
学习自然语言处理路线图
专知会员服务
137+阅读 · 2019年9月24日
机器学习在材料科学中的应用综述,21页pdf
专知会员服务
48+阅读 · 2019年9月24日
从数据结构到算法:图网络方法初探
机器之心
7+阅读 · 2019年8月12日
PLANET+SAC代码实现和解读
CreateAMind
3+阅读 · 2019年7月24日
《常用算法之智能计算 (四) 》:遗传算法
数盟
4+阅读 · 2018年12月21日
【CVPR2018】物体检测中的结构推理网络
深度学习大讲堂
6+阅读 · 2018年7月30日
图解机器学习的常见算法
机器学习算法与Python学习
5+阅读 · 2018年4月2日
各厂推荐算法!
程序猿
17+阅读 · 2018年1月13日
[DLdigest-8] 每日一道算法
深度学习每日摘要
4+阅读 · 2017年11月2日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
A Survey of Deep Learning for Scientific Discovery
Arxiv
29+阅读 · 2020年3月26日
Mesh R-CNN
Arxiv
4+阅读 · 2019年6月6日
Arxiv
12+阅读 · 2018年9月5日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
166+阅读 · 2020年3月27日
专知会员服务
60+阅读 · 2020年3月19日
专知会员服务
53+阅读 · 2020年3月16日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
知识图谱本体结构构建论文合集
专知会员服务
106+阅读 · 2019年10月9日
学习自然语言处理路线图
专知会员服务
137+阅读 · 2019年9月24日
机器学习在材料科学中的应用综述,21页pdf
专知会员服务
48+阅读 · 2019年9月24日
相关资讯
从数据结构到算法:图网络方法初探
机器之心
7+阅读 · 2019年8月12日
PLANET+SAC代码实现和解读
CreateAMind
3+阅读 · 2019年7月24日
《常用算法之智能计算 (四) 》:遗传算法
数盟
4+阅读 · 2018年12月21日
【CVPR2018】物体检测中的结构推理网络
深度学习大讲堂
6+阅读 · 2018年7月30日
图解机器学习的常见算法
机器学习算法与Python学习
5+阅读 · 2018年4月2日
各厂推荐算法!
程序猿
17+阅读 · 2018年1月13日
[DLdigest-8] 每日一道算法
深度学习每日摘要
4+阅读 · 2017年11月2日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Top
微信扫码咨询专知VIP会员