1. 程式人生 > >算法系列 圖資料結構探索(無向圖搜尋)

算法系列 圖資料結構探索(無向圖搜尋)

演算法是基礎,小藍同學準備些總結一系列演算法分享給大家,這是第10篇《無向圖搜尋》,非常贊!希望對大家有幫助,大家會喜歡!

前面系列文章:   

歸併排序

二分查詢

二叉樹查詢

  隨著圖資料庫,圖計算,知識圖譜的興起,圖這種資料結構使用逐漸面向大眾,更為的廣泛的使用我們這個篇章會給大家介紹圖的一些資料結構及其對應相關的一些演算法,希望大家能夠喜歡,並對大家理解知識圖譜,圖計算有所幫助

   本篇從無向圖搜尋講起,說起無向圖搜尋 主要分為兩塊一塊時深度優先,一塊是廣度優先。其實圖搜尋可以我在電腦裡有一個資料夾,這個資料夾裡有很多細分資料夾,而我們要便利每一個資料夾的一個過程。

640?wx_fmt=png

而深度優先指的是,我先開啟最開始的那個資料夾,之後再開啟他下面的第一個資料夾,之後再開啟這個子檔案的子資料夾,迴圈往復的一個過程 ,直到所有的資料夾裡的檔案都便利過一遍。同理廣度優先是指我先開啟這個資料夾裡的所有檔案,然後再逐個開啟他子檔案的所有檔案的一個迴圈往復的一個過程。

640?wx_fmt=png

二話不說上程式碼吧 哈哈

深度優先搜尋程式碼

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();
}
}
}

應用再知識圖譜中風控大量的應用了無向圖搜尋的內容,有興趣的同學可以自己去找找相關資料。

猜你喜歡

大資料和雲端計算技術週報(第56期)

加入技術討論群

《大資料和雲端計算技術》社群群人數已經3000+,歡迎大家加下面助手微信,拉大家進群,自由交流。

640?wx_fmt=jpeg

喜歡QQ群的,可以掃描下面二維碼:

640?wx_fmt=jpeg

歡迎大家通過二維碼打賞支援技術社群(英雄請留名,社群感謝您,打賞次數超過108+):

640?wx_fmt=jpeg

相關推薦

系列 資料結構探索搜尋

演算法是基礎,小藍同學準備些總結一系列演算法分享給大家,這是第10篇《無向圖搜尋》,非常贊!希望

資料結構之實現的廣度優先搜尋演算法

#include <iostream>using namespace std;struct LinkNode{int data;LinkNode *next;};struct LinkQueue{LinkNode *front;LinkNode *rear;};v

資料結構系列3--複雜度分析

複雜度分析的4個概念 1.最壞情況時間複雜度:程式碼在最理想情況下執行的時間複雜度。 2.最好情況時間複雜度:程式碼在最壞情況下執行的時間複雜度。 3.平均時間複雜度:用程式碼在所有情況下執行的次數的加權平均值表示。 4.均攤時間複雜度:在程式碼執行的所有複雜度情況中絕大部分是低級別的複

資料結構系列----平衡二叉樹AVL樹

一:背景 平衡二叉樹(又稱AVL樹)是二叉查詢樹的一個進化體,由於二叉查詢樹不是嚴格的O(logN),所以引入一個具有平衡概念的二叉樹,它的查詢速度是O(logN)。所以在學習平衡二叉樹之前,讀者必須需要了解下二叉查詢樹,具體連結:二叉查詢樹 那麼平衡是什麼意思?我們要求

資料結構——帶權有最短路徑演算法Dijkstra演算法

Dijkstra演算法是由荷蘭電腦科學家艾茲格·迪科斯徹發現的。演算法解決的是有向圖中最短路徑問題。 舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離。 Dijkstra演算法可以用來找到兩個城市之間的最短路徑。 Dijkstra演算法的輸入包含了一個有權重的有向圖G,以及G中的一個

系列之遞迴函式七位數字

七對數字 今有兩個1,兩個2,兩個3,...兩個7,把它們排成一行。 要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是一個符合要求的排列: 17126425374635 當然,如果把它倒過來,也是符合要求的。 請你找出另一種符合要求的

資料結構資料結構探索 —— 二叉搜尋樹(Binary Search Tree)

二叉搜尋樹是一種有順序的二叉樹,它具有以下特徵: 1.每個元素有一個關鍵字,並且任意兩個元素的關鍵字都不同;因此所有的關鍵字都是唯一的。  2.在根節點的左子樹中,元素的關鍵字(如果有的話)都小於根節點的關鍵字。  3.在根節點的右子樹中,元素的關鍵字(如果有的話)都大

資料結構資料結構探索—— 紅黑樹R-B Tree

紅黑樹,一種二叉查詢樹,但在每個結點上增加一個儲存位表示結點的顏色,可以是Red或Black。 紅黑樹有五個性質:     性質1. 節點是紅色或黑色。     性質2. 根節點是黑色。     性質3 每個葉節點(NIL節點,空節點)是黑色的。     性質4 每

系列-大資料面試題-兩個大檔案中找出共同記錄

1.題目描述給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,讓你找出a、b檔案共同的url?2.思考過程(1)首先我們最常想到的方法是讀取檔案a,建立雜湊表(為什麼要建立hash表?因為方便後面的查詢),然後再讀取檔案b,遍歷檔案b中每個

JavaScript系列之-----------------鏈表反轉JS實現

bsp art eve ext list 通過 -- this str 題目:輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。 之前一直對JS實現鏈表理解不了,被算法大牛指點了一下豁然開朗。 function ListNode(x){ this

資料結構---棧C語言陣列實現

https://blog.csdn.net/morixinguan/article/details/51374184 資料結構---棧(C語言陣列實現)   棧的全名稱為堆疊,棧其實就是與佇列相反的過程,佇列是先進先出,而棧便是先進後出了,如下圖:  

資料結構---佇列C語言陣列實現

https://blog.csdn.net/morixinguan/article/details/51374296 資料結構---佇列(C語言陣列實現)   佇列是先進先出的過程。簡單地畫一幅畫來描述一下佇列: 一個簡單的、由陣列實現的佇列,可以由以下幾種最基本的操

資料結構與演算法——有鄰接表輸出其拓撲排序序列

  測試資料 輸入: 12 16 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c1 c4 c1 c2 c1 c3 c1 c12 c4 c5 c2 c3 c3 c5 c3 c7 c5 c7 c3 c8 c9 c12 c9 c10 c10 c12 c

用js來實現那些資料結構14樹02-AVL樹

在使用二叉搜尋樹的時候會出現 一個問題,就是樹的一條分支會有很多層,而其他的分支卻只有幾層,就像下面這樣:  如果資料量夠大,那麼我們在某條邊上進行增刪改查的操作時,就會消耗大量的時間。我們花費精力去構造一個可以提高效率的結構,反而事與願違。這不是我們想要的。所以,我們需要另

java資料結構——BinarySearchTree二叉查詢樹

package com.tig.tree; /** * 二叉查詢樹 * @author Tig * @param <E> * */ public class BinarySearchTree<E extends Comparable<?

HDU1845Jimmy’s Assignment,最大匹配

comment 最大匹配 tex dfs asc ddc repr freopen ces 題意:就是求最大匹配 #include<cstdio> #include<iostream> #include<algorit

[HDOJ6081] 度度熊的王國戰略最小割,數據水

eof printf ret pri sin %d logs ems ++ 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6081 無向圖求割點,應該是個論文題,16年有一篇SW算法+斐波那契堆優化的論文。 但是這數據怎麽這!

The Necklace UVA - 10054 的歐拉回路

n) 兩個 logs nec get dfs lap none view The Necklace UVA - 10054 題意:每個珠子有兩個顏色,給n個珠子,問能不能連成一個項鏈,使得項鏈相鄰的珠子顏色相同。 把顏色看做點,珠子內部連一條邊,無向圖求歐拉回路。 這

UVA 315 :Network 求割頂

time_t long == i++ while 只有一個 ext scu pri 題目鏈接 題意:求所給無向圖中一共有多少個割頂 用的lrj訓練指南P314的模板 #include<bits/stdc++.h> using namespace std; ty

HDU - 6311 Cover的最少路徑邊覆蓋 歐拉路徑

algorithm 奇數 detail cos log csdn puts true its 題意 給個無向圖,無重邊和自環,問最少需要多少路徑把邊覆蓋了。並輸出相應路徑 分析 首先聯通塊之間是獨立的,對於一個聯通塊內,最少路徑覆蓋就是 max(1,度數為奇數點的個