Technology sharing

Wen Xin Yi Yan VS iFlytek Spark VS chatgpt (300) -- Introductio ad Algorithmum 22.1 4 quaestiones

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

4. Datum plures imagines G = ( V , E ) G=(V,E)G=(V,E)adiacentiis coniunctum album (multigraphum est graph est quod sinit crebras oras et sui looping oras), quaeso dare tempus O ( V + E ) O(V+E)O********************(V+E)algorithmus, "aequivalens" graphi graphi indirectae computare solebat G = ( V , E ) G^{'}=(V,E^{'})G=(V,E) per adiacentia coniunctum album.hic " E E^{'}EErit EEE In marginibus redundans et reliquae orae deletis auto-loop marginibus. Reliquias oras removere significat repositore plures oras inter nodos duos uno ore. Si codicem scribere vis, lingua utere quaeso.

Verba Wen Xin:

Adiacentia coniunctum album representation

In adiacentiis notae repraesentationis in unumquodque vertex conexum vvv Est index coniunctus, et uterque nodi in indice coniuncto servum repraesentat vvv ora incipiens.ut ratio GTG^TGT, opus est percurrere GGG pro quolibet ore , et aversa directione crepidinis, adde to GTG^TGT in album coniunctum respondentem.

Ite linguam exsecutionem

package main

import (
    "fmt"
)

// Graph 使用邻接链表表示
type Graph struct {
    vertices int
    adjList  map[int][]int
}

// NewGraph 创建一个新的图
func NewGraph(vertices int) *Graph {
    return &Graph{
        vertices: vertices,
        adjList:  make(map[int][]int),
    }
}

// AddEdge 添加一条边到图中
func (g *Graph) AddEdge(u, v int) {
    g.adjList[u] = append(g.adjList[u], v)
}

// Transpose 计算图的转置
func (g *Graph) Transpose() *Graph {
    gT := NewGraph(g.vertices)
    for u, adj := range g.adjList {
        for _, v := range adj {
            gT.AddEdge(v, u) // 反转边的方向
        }
    }
    return gT
}

func main() {
    g := NewGraph(4)
    g.AddEdge(0, 1)
    g.AddEdge(0, 2)
    g.AddEdge(1, 2)
    g.AddEdge(2, 0)
    g.AddEdge(2, 3)

    gT := g.Transpose()

    fmt.Println("Original Graph:")
    for u, adj := range g.adjList {
        fmt.Printf("%d -> %vn", u, adj)
    }

    fmt.Println("nTransposed Graph:")
    for u, adj := range gT.adjList {
        fmt.Printf("%d -> %vn", u, adj)
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

tempus complexionem

  • Tempus complexionem permensus quisque in ore est O ( E ) O(E)O********************(E),in EEE oras est numerus.
  • Pro unoquoque ore, operationem constantem temporis exhibemus (adiectis alteri graphi adiacentiis indicem).
  • ergo totum tempus complexionis est O ( E ) O(E)O********************(E)

Adiacentia matrix representation

In adiacentiis matricis repraesentatio utimur duo dimensiva ordinata ad informationem marginem reponendam, ubi matrix[u][v] Indicat an sit linea e* uu*u****** venire vvv latus.ut ratio GTG^TGTsuperiorem triangulum (seu triangulum inferiorem, secundum matrix repraesentationis habitum) percurrimus matricis, et convertimus directionem orarum, id est; matrix[u][v] De valore assignatamatrixT[v][u]

Ite linguam exsecutionem(versio simplicior, solum existentiam considerat et ora pondera non considerat);

// 假设使用二维布尔切片表示邻接矩阵
type GraphMatrix [][]bool

// Transpose 计算图的转置
func (g GraphMatrix) Transpose() GraphMatrix {
    n := len(g)
    gT := make(GraphMatrix, n)
    for i := range gT {
        gT[i] = make([]bool, n)
    }

    for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
            gT[j][i] = g[i][j] // 反转边的方向
        }
    }
    return gT
}

// 注意:这里没有完整的GraphMatrix类型实现,因为示例仅关注Transpose函数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

tempus complexionem

  • Iterans super quodlibet elementum matricis requirit O ( V 2 ) O (V^2)O********************(V2) inter quos VVV est numerus vertices.
  • ergo totum tempus complexionis est O ( V 2 ) O (V^2)O********************(V2) . Quod fieri non potest, cum numerus vertices multo major sit quam numerus marginum.

Insert imaginem descriptionis hic

Insert imaginem descriptionis hic

Insert imaginem descriptionis hic

Insert imaginem descriptionis hic

iFlytek scintilla;

Nam graphi directi per album adiacentii repraesentati, vertices cuiusque vertex adiacentes adiacenti addere possumus album vertex transpositi novi graphi percurso adiacentiis cuiusvis vertex. Imprimis gradus sunt haec:

  1. Novam accessionem album GTG^{T}GTinitialized inanis.
  2. Originali imaginem lustrare GGG omni vertice * vvv
  3. Vertices lustrare vvv adiacentii album coniunctum, verticem adiacentem uu*u****** Add to novam imaginem GTG^{T}GT medium verticem vvv in adiacentiis connexis.
  4. Redi ad novam picturam GTG^{T}GT

Tempus complexionem analysis: percurso verticem originalis graph requirit O ( V ) O (|V|)O********************(V) Tempus requiritur ad percurrendum adiacentiam index cuiusque vertex est O ( E ) O ( | E | )O********************(E) tempus, sic totum tempus complexionis est O ( V + E ) O (|V| + |E|)O********************(V+E)

Ad graphum directum, quod matrix adiacentia repraesentatum est, consequi possumus adiacentia matrix novi graphi, transponendo adiacentia matrix graphi originalis. Imprimis gradus sunt haec:

  1. Novam unam cum magnitudine V V |V|V| temporibus |V|V×V matrix GTG^{T}GTinitialized ad omnem vulvam nulla.
  2. Adiacentia matricem imaginis originalis lustrare GGG, Voluntas G [ i ] [ j ] G[i][j]G[ego][j] De valore assignata GT [j ] [i] G^{T}[j][i]GT[j][ego]
  3. Redit adiacentia matrix novae graphi GTG^{T}GT

Tempus multiplicitatis analysis: percurso adiacentia matrix graphi originalis requirit O ( V 2 ) O ( | V | ^ 2 )O********************(V2) tempus, sic totum tempus complexionis est O ( V 2 ) O ( | V | ^ 2 )O********************(V2)

Sequentia est codicem in lingua Go implendum:

// 邻接链表表示的有向图转置
func transposeAdjList(G map[int][]int) map[int][]int {
    GT := make(map[int][]int)
    for v, neighbors := range G {
        for _, u := range neighbors {
            GT[u] = append(GT[u], v)
        }
    }
    return GT
}

// 邻接矩阵表示的有向图转置
func transposeAdjMatrix(G [][]int) [][]int {
    n := len(G)
    GT := make([][]int, n)
    for i := range GT {
        GT[i] = make([]int, n)
    }
    for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
            GT[j][i] = G[i][j]
        }
    }
    return GT
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

360 Brain Argutus;

Adiacentia coniunctum album representation

In album adiacentiis repraesentatio, imaginem originalem directe percurrere possumus GGGIndicem adiacentiae cuiuslibet nodi tunc additur novo grapho post directionem cuiusque marginem convertendo. GTG^{T}GTin nodi correspondentes.

Exsequendam codicem linguarum Go:
type Graph struct {
    Vertices []*Node // 存储图中所有节点的指针
}

type Node struct {
    Value int
    Adjacent []*Node // 存储与该节点相邻的所有节点的指针
}

func (g *Graph) Transpose() *Graph {
    transposed := &Graph{make([]*Node, len(g.Vertices))}
    for i, node := range g.Vertices {
        transposed.Vertices[i] = &Node{node.Value, make([]*Node, 0)}
    }
    for _, node := range g.Vertices {
        for _, adj := range node.Adjacent {
            // 将边反向添加到转置图中
            transposed.Vertices[adj.Value].Adjacent = append(transposed.Vertices[adj.Value].Adjacent, transposed.Vertices[node.Value])
        }
    }
    return transposed
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
Tempus complexionis analysis:
  • Nodi percurre se in graph originali: O ( V ) O (|V|)O********************(V)
  • Indicem adiacentiis cujusque nodi percurre; O ( E ) O ( | E | )O********************(E)

ergo totum tempus complexionis est O ( V + E ) O (|V| + |E|)O********************(V+E)

Adiacentia matricis notatio

In notatione matricis adiacentia novam matricem adiacentiam creare possumus ac deinde imaginem originalem percurrere GGGmatrix adiacentia, quodlibet elementum in matrice ( i , j )(ego,j)assignata novae matricis ( j , i )(j,ego)situm, sicque inversionem in marginem complens.

Exsequendam codicem linguarum Go:
type MatrixGraph struct {
    Matrix [][]bool // 存储邻接矩阵
}

func (mg *MatrixGraph) Transpose() *MatrixGraph {
    transposed := &MatrixGraph{make([][]bool, len(mg.Matrix))}
    for i := range mg.Matrix {
        transposed.Matrix[i] = make([]bool, len(mg.Matrix))
        for j := range mg.Matrix[i] {
            // 将边反向赋值到转置矩阵中
            transposed.Matrix[i][j] = mg.Matrix[j][i]
        }
    }
    return transposed
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
Tempus complexionis analysis:
  • Novam adiacentiis vulvam crea; O ( V 2 ) O ( | V | ^ 2 )O********************(V2)
  • Matrix imaginis originalis adiacentia percurritur; O ( V 2 ) O ( | V | ^ 2 )O********************(V2)

ergo totum tempus complexionis est O ( V 2 ) O ( | V | ^ 2 )O********************(V2)

Summatim

Ad adiacentiam coniunctio repraesentatio indice, tempus complexionis algorithmi transpositi est O ( V + E ) O (|V| + |E|)O********************(V+E)ac pro adiacentiis matricis repraesentatio, tempus complexionis transpositi algorithmus est O ( V 2 ) O ( | V | ^ 2 )O********************(V2) .In applicationibus, si graph est sparsum (i.e. E |E|Emulto minus V 2 |V|^2V2 ), efficacius esset ut album repraesentationem adiacentiam coniunctum adhiberet.Si graph est densa (i.e. E |E|Eprope V 2 |V|^2V2), tunc repraesentatio matrix adiacentia aptior esse potest.

Sapientiae spectrum perspicua verba sunt;

In graphe repraesentatione, adiacentia connexae tabulae et adiacentia matrices sunt ambo modi communiter usi. Indices adiacentia coniunctorum adhibentur ad graphas indirectas et directas repraesentandas, cum matrices adiacentia consueverunt graphs indedirectos repraesentare. Pro transposito graphi directi, possumus operari in album adiacentia coniunctum et matrix adiacentia separatim.

Transpositio adiacentiis coniunctum album

Ad graphum directum, quod per adiacentiis coniunctum indicem repraesentatum est, graphum transponendo effici potest per singulas graphi originalis vertices permensus et modificando extremas graphi originalis in oras ineuntes.

package main
import (
	"fmt"
)
// 定义图的顶点结构
type Vertex struct {
	Name   string
	Edges  []*Vertex
	Visited bool
}
// 计算图的转置
func Transpose(g *Vertex) {
	for _, v := range g.Edges {
		// 遍历顶点v的所有出边
		for _, w := range v.Edges {
			// 在原图中查找顶点w指向顶点v的边,并反转
			for i, e := range w.Edges {
				if e == v {
					w.Edges[i] = v
					break
				}
			}
		}
	}
}
func main() {
	// 创建顶点
	a := &Vertex{Name: "A"}
	b := &Vertex{Name: "B"}
	c := &Vertex{Name: "C"}
	// 建立有向图关系
	a.Edges = []*Vertex{b, c}
	b.Edges = []*Vertex{a}
	c.Edges = []*Vertex{a}
	// 打印原图
	fmt.Println("原图:")
	PrintGraph(a)
	// 计算转置图
	Transpose(a)
	// 打印转置图
	fmt.Println("转置图:")
	PrintGraph(a)
}
// PrintGraph 用于打印图的邻接链表表示
func PrintGraph(g *Vertex) {
	g.Visited = true
	for _, v := range g.Edges {
		if !v.Visited {
			fmt.Println(g.Name, "->", v.Name)
			PrintGraph(v)
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

Adiacentia matricis

Nam graphi directi, matricis adiacentiis repraesentati, graphum transponendo effici potest, convertendo unumquemque graphi originalis in debitam columnam novi graphi.

package main
import (
	"fmt"
)
// 计算邻接矩阵的转置
func TransposeMatrix(mat [][]int) [][]int {
	transposed := make([][]int, len(mat[0]))
	for i := range transposed {
		transposed[i] = make([]int, len(mat))
	}
	for i, row := range mat {
		for j, val := range row {
			if val == 1 {
				transposed[j][i] = 1
			}
		}
	}
	return transposed
}
func main() {
	// 创建邻接矩阵
	originalMatrix := [][]int{
		{0, 1, 1},
		{0, 0, 1},
		{1, 0, 0},
	}
	// 计算转置矩阵
	transposedMatrix := TransposeMatrix(originalMatrix)
	// 打印转置矩阵
	fmt.Println("转置矩阵:")
	for _, row := range transposedMatrix {
		fmt.Println(row)
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

Algorithmus currit tempus analysis

  1. Pro transpositione adiacentis indicem coniunctum, tempus complexionis algorithmi est O(E), ubi E numerus marginum in grapho est. Hoc est, quia utraque ora semel percurri debet.

  2. Pro transposito adiacentiae matricis, tempus algorithm multiplicitas est O(V^2), ubi V est numerus verticerum in grapho. Causa est, quia unumquodque matrix elementum semel pertransiri debet, et magnitudo matricis est VOV.
    Haec algorithms sunt omnia efficientia et currunt

Tiangong:

Ad efficiendum algorithmus graph directa computare GGG transpositio GTG^{T}GT , possumus procedere duas repraesentationes adiacentiis connexas album et adiacentiae matricis respective. Sub his duobus casibus algorithmos describemus, et exempla codicis Go lingua praebent.

Adiacentia coniunctum album representation

Algorithmus gradus;
  1. Novam accessionem album newAdjList Adhibetur ad graphum transpositum reponendum.
  2. Percurre adiacentiam coniunctum album imaginis originalis adjList
  3. nam quisque in ore gladii (u, v)Adde newAdjList[v] medium.
  4. Redit novum album adiacentia newAdjList
Exemplo codicem ite linguam:
type Graph struct {
    vertices []*Vertex
}

type Vertex struct {
    key      int
    adjacent []*Vertex
}

func (g *Graph) Transpose() *Graph {
    gt := &Graph{make([]*Vertex, len(g.vertices))}
    for i := range g.vertices {
        gt.vertices[i] = &Vertex{key: i}
    }
    for _, u := range g.vertices {
        for _, v := range u.adjacent {
            // Add edge (v, u) to the transpose graph.
            gt.vertices[v.key].adjacent = append(gt.vertices[v.key].adjacent, gt.vertices[u.key])
        }
    }
    return gt
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
Currite tempus analysis:

Tempus currens algorithm huius est O(|V| + |E|), ubi |V| . est numerus verticerum et |E| Hoc est, quia omnes vertices et oras semel lustrare necesse est.

Adiacentia matricis notatio

Algorithmus gradus;
  1. Novam adiacentiis matricis newAdjMatrix Adhibetur ad graphum transpositum reponendum.
  2. Adiacentia matricem imaginis originalis lustrare adjMatrix
  3. nam quisque elementum adjMatrix[i][j]Tribue eam newAdjMatrix[j][i]
  4. Redit nova adiacentia matricis newAdjMatrix
Exemplo codicem ite linguam:
type Graph struct {
    matrix [][]bool
}

func (g *Graph) Transpose() *Graph {
    gt := &Graph{make([][]bool, len(g.matrix))}
    for i := range gt.matrix {
        gt.matrix[i] = make([]bool, len(g.matrix))
    }
    for i := range g.matrix {
        for j := range g.matrix[i] {
            // Copy the adjacency values with swapped indices.
            gt.matrix[j][i] = g.matrix[i][j]
        }
    }
    return gt
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
Currite tempus analysis:

Tempus currens algorithmus hujus est O(|V|^2), ubi |V| est numerus verticerum. Hoc est, quia necesse est totam adiantiam matricis percurrere, et magnitudo adiacentiae matricis x |V|

Exemplum supra codicem solum nucleum algorithm est. Praeterea ad simpliciorem rationem codicis, supponitur nullas in graphi margines repetitas et numeros in graphio vertex continuos numerari ab 0 incipiendo.

chatgpt:

Sequens est algorithmus in lingua Go scriptum ad G^T ex graphi G calculare, et adiacentia matrix repraesentationis album et adiacentiae correspondentia connexum methodi traduntur;

package main

import "fmt"

// 图的节点结构体
type Node struct {
    Value int       // 节点的值
    Next  *Node     // 下一个节点指针
}

// 邻接链表表示法的图结构体
type Graph struct {
    Vertices []*Node   // 图中所有节点的数组
}

// 添加有向边到邻接链表
func (g *Graph) AddEdge(u, v int) {
    newNode := &Node{Value: v}
    if g.Vertices[u] == nil {
        g.Vertices[u] = newNode
    } else {
        curr := g.Vertices[u]
        for curr.Next != nil {
            curr = curr.Next
        }
        curr.Next = newNode
    }
}

// 输出邻接链表表示的图信息
func (g *Graph) Print() {
    for i, node := range g.Vertices {
        fmt.Printf("顶点 %d:", i)
        for node != nil {
            fmt.Printf("%d ", node.Value)
            node = node.Next
        }
        fmt.Println()
    }
}

// 获取图 G 的转置图 G^T 的邻接链表表示法
func GetTranspose(g *Graph) *Graph {
    transpose := &Graph{
        Vertices: make([]*Node, len(g.Vertices)),
    }

    for i, node := range g.Vertices {
        for node != nil {
            v := node.Value

            // 在转置图中添加反向边
            transpose.AddEdge(v, i)

            node = node.Next
        }
    }

    return transpose
}

// 输出邻接链表表示的转置图信息
func PrintTranspose(g *Graph) {
    fmt.Println("转置图 G^T:")
    g.Print()
}

// 邻接矩阵表示法的图结构体
type Matrix struct {
    Vertices [][]int   // 邻接矩阵,存储边的连接关系(0 表示无边,1 表示有边)
}

// 初始化邻接矩阵表示的图
func InitMatrix(numVertices int) *Matrix {
    matrix := &Matrix{
        Vertices: make([][]int, numVertices),
    }

    for i := range matrix.Vertices {
        matrix.Vertices[i] = make([]int, numVertices)
    }

    return matrix
}

// 添加有向边到邻接矩阵
func (m *Matrix) AddEdge(u, v int) {
    m.Vertices[u][v] = 1
}

// 获取图 G 的转置图 G^T 的邻接矩阵表示法
func GetTransposeMatrix(m *Matrix) *Matrix {
    numRows := len(m.Vertices)
    numCols := len(m.Vertices[0])

    transpose := InitMatrix(numRows)

    for i := 0; i < numRows; i++ {
        for j := 0; j < numCols; j++ {
            if m.Vertices[i][j] == 1 {
                // 在转置矩阵中添加反向边
                transpose.AddEdge(j, i)
            }
        }
    }

    return transpose
}

// 输出邻接矩阵表示的转置图信息
func PrintTransposeMatrix(m *Matrix) {
    numRows := len(m.Vertices)
    numCols := len(m.Vertices[0])

    fmt.Println("转置图 G^T:")
    for i := 0; i < numRows; i++ {
        fmt.Printf("顶点 %d:", i)
        for j := 0; j < numCols; j++ {
            if m.Vertices[i][j] == 1 {
                fmt.Printf("%d ", j)
            }
        }
        fmt.Println()
    }
}

func main() {
    // 邻接链表表示的有向图 G
    g := &Graph{
        Vertices: make([]*Node, 4),
    }

    g.AddEdge(0, 1)
    g.AddEdge(1, 2)
    g.AddEdge(2, 3)
    g.AddEdge(3, 1)

    // 输出原始图 G 的邻接链表表示法
    fmt.Println("原始图 G:")
    g.Print()

    // 获取转置图 G^T 的邻接链表表示法并输出
    transpose := GetTranspose(g)
    PrintTranspose(transpose)

    
	// 邻接矩阵表示的有向图 G
	m := InitMatrix(4)

	m.AddEdge(0, 1)
	m.AddEdge(1, 2)
	m.AddEdge(2, 3)
	m.AddEdge(3, 1)

	// 输出原始图 G 的邻接矩阵表示法
	fmt.Println("原始图 G:")
	for _, row := range m.Vertices {
		fmt.Println(row)
	}

	// 获取转置图 G^T 的邻接矩阵表示法并输出
	transposeMatrix := GetTransposeMatrix(m)
	PrintTransposeMatrix(transposeMatrix)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164

Incomplexitas temporis huius algorithmi est O(V + E), ubi V est numerus verticerum et E numerus marginum. Constructio processus graphi transpositi postulat percurrendo omnes oras graphi archetypi et eas ad graphi transpositos transverso addens, ergo tota temporis complexio proportionalis est numero verticerum et orarum.

kimi:

graphi graphi directi transpositi repraesentari possunt per duas structuras principales notitiarum: adiacentia conexae tabulae et adiacentia matrices. Subter algorithms in duobus casibus hisce respectivis introducam et codicem specimen praebebo in lingua Go.

Adiacentia coniunctum album representation

Ad graphum per adiacentiis coniunctum indicem repraesentatum, graphum transponere possumus per adiacentiae uniuscuiusque verticem percurrendo, et deinde margini adiacentiis punctum cuique adiacenti addito. Huius methodi tempus intricatum est O(V + E), ubi V numerus verticerum est et E numerus marginum.

Go lingua specimen codicem:
type Vertex struct {
    Value int
    Adj []Vertex
}

func transposeGraph(graph []Vertex) []Vertex {
    transposed := make([]Vertex, len(graph))
    for _, v := range graph {
        for _, adjV := range v.Adj {
            // 为邻接点添加反向边
            found := false
            for _, tV := range transposed[adjV.Value].Adj {
                if tV.Value == v.Value {
                    found = true
                    break
                }
            }
            if !found {
                transposed[adjV.Value].Adj = append(transposed[adjV.Value].Adj, v)
            }
        }
    }
    return transposed
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

Adiacentia matrix representation

Nam lacinia, quam per adiacentia matrix repraesentata, transpositionem efficere possumus, permutando ordines et columnas matricis. Tempus complexionis huius methodi est O(V^2).

Go lingua specimen codicem:
func transposeMatrix(matrix [][]int) [][]int {
    n := len(matrix)
    transposed := make([][]int, n)
    for i := 0; i < n; i++ {
        transposed[i] = make([]int, n)
        for j := 0; j < n; j++ {
            transposed[i][j] = matrix[j][i]
        }
    }
    return transposed
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Analysis Algorithmorum

  • adiacentia album : Algorithmus opus adiacentiis cujusque verticis percurrere debet, et pro utraque ora, extrema extremitas ad adjacentiae punctum adjacentium adjungi debet. Si mediocris longitudo proximi indici est k, tempus algorithm intricatum est O (V + E * k). Pessimo in casu k prope V esse potest, et tempus complexionis prope O (V^2). In casu optimo, k prope 1 est et tempus multiplicitatis prope O (E).
  • adiacentia matrix : Algorithmus debet ire per singulas partes matricis et permuto porticus et columnas. Cum matrix sit VxV, tempus complexionis est O(V^2).

In applicationibus practicis, quae algorithmus eligendi pendet a sparsitate graphi et memoriae promptae. Pro raris graphis, adiacentia connexis, plus possunt memoriae efficiens;

Hunyuan:

Calculari Aliquam lacinia purus G = ( V , E ) G=(V,E)G=(V,E) transpositio GT = ( V , ET ) G^T=(V,E^T)GT=(V,ET)algorithms correspondentes dare possumus pro duobus modis repraesentationis adiacentiae coniunctorum album et adiacentiae matricis respective, et tempus eorum currentem resolvere.

Adiacentia coniunctum album representation

Algorithmus Description
  1. Initialise inanis adiacentiis indicem ad margines graphi transpositos repone.
  2. Originali imaginem lustrare GGG omnium nodis.
  3. nam quisque nodi uu*u******omnes nodos proximos in indice adiacentio percurre vvv
  4. Adiacentia novam addere album e vvv venire uu*u****** latus.
  5. Peracto traversalo, novus index adiacentium coniunctus est graphi transpositi GTG^TGT
Currere tempus analysis
  • temporis complexionem; O ( E ) O ( | E | )O********************(E),in E |E|E imago originalis laterum numerus est. Quia necesse est utramque partem bis percurramus (semel legere et semel scribere).

Adiacentia matricis notatio

Algorithmus Description
  1. Initialize adiacentii matrix eiusdem quantitatis ac graphi originalis ad margines graphi transpositi condo.
  2. Originali imaginem lustrare GGG adiacentia matricis.
  3. Nam omne elementum non-nulla in matrice (i.e. in margine est ( u , v )(u******,v)) , positioni respondentis in adiacentiis matricis graphi transpositi ( v , u ) (v, u)(v,u******) Ut elementum non nulla a posuere.
  4. Post peractam traversalem nova adiacentia matrix in graphe transposita est GTG^TGT
Currere tempus analysis
  • temporis complexionem; O ( V 2 ) O ( | V | ^ 2 )O********************(V2),in V |V|V Est numerus nodis in graphe originali. Quia necesse est totam adiacentie matricem lustrare.

Exsequendam linguam vade (repraesentationis adiacentium coniunctum album)

type Edge struct {
    dest int
}

type AdjacencyList struct {
    edges map[int][]Edge
}

func TransposeGraph(graph AdjacencyList) AdjacencyList {
    transposed := AdjacencyList{edges: make(map[int][]Edge)}
    for u, neighbors := range graph.edges {
        for _, edge := range neighbors {
            v := edge.dest
            transposed.edges[v] = append(transposed.edges[v], Edge{dest: u})
        }
    }
    return transposed
}

func main() {
    // 示例图的邻接链表表示
    graph := AdjacencyList{edges: map[int][]Edge{
        0: {{dest: 1}},
        1: {{dest: 2}},
        2: {{dest: 0}},
    }}

    // 计算转置图
    transposedGraph := TransposeGraph(graph)

    // 打印转置图的邻接链表
    for u, neighbors := range transposedGraph.edges {
        fmt.Printf("Node %d -> Nodes: ", u)
        for _, edge := range neighbors {
            fmt.Printf("%d ", edge.dest)
        }
        fmt.Println()
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

In hoc codice definimus a Edge structuram repraesentet in marginibus, et aAdjacencyList Structuram adiacentiam coniunctum album repraesentare.TransposeGraph Munus accipit aAdjacencyList typus modulus et adiacentia remittit coniunctum album repraesentationis graphi transpositi.existmain munus, exemplum graphi conficimus, eius graphum transpositum calculare et imprimere debemus.