当前位置: 首页 > news >正文

文心一言 VS 讯飞星火 VS chatgpt (357)-- 算法导论24.2 3题

三、上面描述的 PERT 图的公式有一点不太自然。在一个更自然的结构下,图中的结点代表要执行的工作,边代表工作之间的次序限制,即边 (u,v) 表示工作 u 必须在工作 v 之前执行。在这种结构的图中,我们将权重赋给结点,而不是边。请修改 DAG-SHORTEST-PATHS 过程,使得其可以在线性时间内找出这种有向无环图中一条最长的路径。如果要写代码,请用go语言。

文心一言:

在处理有向无环图(DAG)并希望找到最长路径时,如果权重被赋给节点而不是边,并且我们关注的是从源节点到任意其他节点的最长路径,我们可以使用动态规划的方法来解决这个问题。然而,如果目标是找到图中任意两点之间的最长路径,问题将变得复杂且不一定存在多项式时间解决方案(特别是如果图中存在环,尽管这里我们处理的是DAG)。

对于DAG中的最长路径问题(权重在节点上),一个常见的方法是使用拓扑排序和动态规划。我们将基于这个思路来实现Go代码。

步骤 1: 拓扑排序

首先,我们需要对图进行拓扑排序,以确保在处理每个节点时,其所有前驱节点都已经被处理。

步骤 2: 动态规划计算最长路径

在拓扑排序的基础上,我们可以从源节点开始,逐步计算到达每个节点的最长路径。

以下是用Go语言实现的示例代码:

package mainimport ("container/heap""fmt"
)type Node inttype Graph map[Node][]Nodetype IntHeap []intfunc (h IntHeap) Len() int           { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] > h[j] } // 最大堆
func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }func (h *IntHeap) Push(x interface{}) {*h = append(*h, x.(int))
}func (h *IntHeap) Pop() interface{} {old := *hn := len(old)x := old[n-1]*h = old[0 : n-1]return x
}func topologicalSort(g Graph) ([]Node, error) {inDegree := make(map[Node]int)for u := range g {inDegree[u] = 0}for u, neighbors := range g {for _, v := range neighbors {inDegree[v]++}}queue := &IntHeap{}heap.Init(queue)for u, degree := range inDegree {if degree == 0 {heap.Push(queue, int(u))}}var sorted []Nodefor queue.Len() > 0 {u := Node(heap.Pop(queue).(int))sorted = append(sorted, u)for _, v := range g[u] {inDegree[v]--if inDegree[v] == 0 {heap.Push(queue, int(v))}}}if len(sorted) != len(g) {return nil, fmt.Errorf("graph has cycles")}return sorted, nil
}func longestPath(g Graph, nodeWeights map[Node]int) (map[Node]int, error) {sorted, err := topologicalSort(g)if err != nil {return nil, err}dp := make(map[Node]int)for _, node := range sorted {dp[node] = nodeWeights[node]for _, neighbor := range g[node] {if val, ok := dp[neighbor]; ok {dp[node] = max(dp[node], val+nodeWeights[node])}}}return dp, nil
}func max(a, b int) int {if a > b {return a}return b
}func main() {g := Graph{0: []Node{1, 2},1: []Node{3},2: []Node{3},3: nil,}nodeWeights := map[Node]int{0: 2,1: 3,2: 5,3: 0,}longest, err := longestPath(g, nodeWeights)if err != nil {fmt.Println("Error:", err)return}fmt.Println("Longest Path Values:", longest)
}

注意:

  • longestPath函数中,dp[node]存储的是从源节点(这里假设为所有节点可达的起始点)到node的最长路径长度。
  • 我们需要确保图是无环的,这通过拓扑排序来检查。
  • max函数用于比较两个整数并返回较大的那个。
  • 这个实现假设图中至少有一个节点,并且所有节点都是可达的(从源节点出发)。在实际应用中,可能需要添加额外的逻辑来处理特殊情况。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

讯飞星火:

为了在有向无环图(DAG)中找到最长路径,我们可以使用拓扑排序算法。首先,我们需要对图进行拓扑排序,然后按照拓扑排序的顺序遍历结点,同时更新每个结点的最长路径。以下是使用 Go 语言实现的代码:

package mainimport ("fmt"
)type Edge struct {To   intCost int
}func longestPath(n int, edges [][]Edge) []int {// 初始化邻接表adjList := make([][]Edge, n)for _, edge := range edges {u, v, cost := edge[0].To, edge[1].To, edge[1].CostadjList[u] = append(adjList[u], Edge{v, cost})}// 拓扑排序var topoSort func(int, []bool, []int)topoSort = func(node int, visited []bool, stack []int) {visited[node] = truefor _, edge := range adjList[node] {if !visited[edge.To] {topoSort(edge.To, visited, stack)}}stack = append(stack, node)}visited := make([]bool, n)stack := make([]int, 0)for i := 0; i < n; i++ {if !visited[i] {topoSort(i, visited, stack)}}// 初始化最长路径数组longestPaths := make([]int, n)for i := 0; i < n; i++ {longestPaths[i] = -1 // 假设没有路径时为-1}// 按照拓扑排序的顺序更新最长路径for len(stack) > 0 {node := stack[len(stack)-1]stack = stack[:len(stack)-1]for _, edge := range adjList[node] {if longestPaths[edge.To] < longestPaths[node]+edge.Cost {longestPaths[edge.To] = longestPaths[node] + edge.Cost}}}return longestPaths
}func main() {n := 6edges := [][]Edge{{{1}, {2, 5}},{{3}, {2, 3}},{{4}, {3, 6}},{{5}, {3, 8}},{{6}, {4, 7}},}result := longestPath(n, edges)fmt.Println("最长路径长度:", result)
}

这段代码首先定义了一个边的结构体,包含目标节点和权重。然后,我们实现了一个名为 longestPath 的函数,该函数接受节点数 n 和边的列表作为输入,并返回一个整数数组,表示从每个节点到其他节点的最长路径长度。在这个函数中,我们首先构建了邻接表,然后使用拓扑排序算法对图进行排序。最后,我们按照拓扑排序的顺序更新每个节点的最长路径。

360智脑:

在有向无环图(DAG)中寻找最长路径的问题可以通过修改标准的DAG最短路径算法来解决。基本的思路是反转所有边的方向,然后运行标准的最短路径算法。但是,由于我们希望直接在原始图上操作,我们可以通过简单地改变距离数组的初始化和更新规则来实现这一点。

以下是一个使用Go语言实现的算法,用于在给定的有向无环图中找到一条最长路径:

package mainimport "fmt"type Edge struct {to   intcost int
}type Graph struct {nodes []intedges [][]Edge
}func NewGraph(nodes int) *Graph {return &Graph{nodes: make([]int, nodes),edges: make([][]Edge, nodes),}
}func (g *Graph) AddEdge(from, to, cost int) {g.edges[from] = append(g.edges[from], Edge{to, cost})
}func LongestPathInDag(graph *Graph, start int) ([]int, int) {// Initialize distances to negative infinitydist := make([]int, graph.nodes)for i := range dist {dist[i] = -1 << 60 // Use a large negative number as initial value}dist[start] = 0 // Distance to the start node is 0// Topological sortsortedNodes := topologicalSort(graph)// Relaxationfor _, node := range sortedNodes {for _, edge := range graph.edges[node] {if dist[edge.to] < dist[node]+edge.cost {dist[edge.to] = dist[node] + edge.cost}}}return dist, len(sortedNodes)
}func topologicalSort(graph *Graph) []int {visited := make([]bool, graph.nodes)stack := make([]int, 0)var visit func(int)visit = func(node int) {visited[node] = truefor _, edge := range graph.edges[node] {if !visited[edge.to] {visit(edge.to)}}stack = append(stack, node)}for i := 0; i < graph.nodes; i++ {if !visited[i] {visit(i)}}// Reverse the stack to get the topological orderfor i, j := 0, len(stack)-1; i < j; i, j = i+1, j-1 {stack[i], stack[j] = stack[j], stack[i]}return stack
}func main() {graph := NewGraph(6)graph.AddEdge(0, 1, 5)graph.AddEdge(0, 2, 3)graph.AddEdge(1, 3, 6)graph.AddEdge(1, 2, 2)graph.AddEdge(2, 4, 4)graph.AddEdge(2, 5, 2)graph.AddEdge(2, 3, 7)graph.AddEdge(3, 4, -1)graph.AddEdge(4, 5, -2)dist, _ := LongestPathInDag(graph, 1)fmt.Println("Longest path distances:", dist)
}

在这个代码中,我们首先定义了一个Graph结构体来存储图的信息,包括节点和边。LongestPathInDag函数实现了最长路径算法,它首先对图进行拓扑排序,然后按照拓扑顺序进行边的松弛操作。注意,我们初始化距离数组为负无穷大(除了起始节点),并且在松弛操作中更新距离时使用的是加法而不是减法,因为我们要找的是最长路径。

请注意,这个算法假设图中没有负权环,因为在存在负权环的情况下,最长路径问题是没有有限解的。此外,这个算法返回的是从起始节点到每个节点的最长路径长度,而不是具体的路径本身。如果需要找到具体的路径,还需要额外的数据结构来记录前驱节点。

智谱清言:

在这种结构下,我们想要找到的是最长路径,而不是最短路径。为了实现这一点,我们需要对 DAG-SHORTEST-PATHS 算法进行一些修改。以下是修改后的算法,适用于找到有向无环图(DAG)中的最长路径,我们将这个过程称为 DAG-LONGEST-PATHS
首先,我们需要对每个节点赋予权重,这些权重将代表执行每个工作的时间或成本。在算法中,我们将使用顶点权重而不是边权重,并且初始化所有顶点的 dist 值为负无穷大(因为我们要找最长路径),除了起始顶点(通常是源点,可以假设为0)。
下面是使用 Go 语言实现的 DAG-LONGEST-PATHS 过程:

package main
import ("fmt""math"
)
// Vertex represents a node in the graph
type Vertex struct {ID         intWeight     int   // Time or cost of the task represented by the vertexAdjacent   []*VertexDist       int // Distance (longest path length) from source to this vertexPrev       *VertexExploration int // Used to determine the order of exploration
}
// AddEdge adds a directed edge from vertex u to vertex v
func AddEdge(u, v *Vertex) {u.Adjacent = append(u.Adjacent, v)
}
// DAGLongestPaths finds the longest paths in a Directed Acyclic Graph (DAG)
func DAGLongestPaths(vertices []*Vertex) {for _, v := range vertices {v.Dist = -math.MaxInt64 // Initialize distances to negative infinity}// Topologically sort the verticestopologicalSort(vertices)// Relax edges in topological orderfor i := len(vertices) - 1; i >= 0; i-- {for _, u := range vertices[i].Adjacent {if u.Dist < vertices[i].Dist+vertices[i].Weight {u.Dist = vertices[i].Dist + vertices[i].Weightu.Prev = vertices[i]}}}
}
// TopologicalSort performs a topological sort on the vertices
func topologicalSort(vertices []*Vertex) {// Initialize all vertices as unvisitedvisited := make(map[*Vertex]bool)var visit func(v *Vertex)visit = func(v *Vertex) {if visited[v] {return}visited[v] = truefor _, u := range v.Adjacent {visit(u)}vertices = append(vertices, v) // Add vertex to the end (reverse order)}for _, v := range vertices {visit(v)}// Reverse the order of vertices to get the correct topological orderfor i, j := 0, len(vertices)-1; i < j; i, j = i+1, j-1 {vertices[i], vertices[j] = vertices[j], vertices[i]}
}
func main() {// Example usage:// Create verticesv := make([]*Vertex, 5)for i := range v {v[i] = &Vertex{i, 0, []*Vertex{}, 0, nil, 0}}// Assign weights to verticesv[0].Weight = 2v[1].Weight = 3v[2].Weight = 4v[3].Weight = 2v[4].Weight = 3// Create edges (u -> v means u must be done before v)AddEdge(v[0], v[1])AddEdge(v[0], v[2])AddEdge(v[1], v[3])AddEdge(v[2], v[3])AddEdge(v[2], v[4])// Find longest pathsDAGLongestPaths(v)// Output the longest pathsfor _, vertex := range v {fmt.Printf("Vertex %d, Longest Path Length: %d\n", vertex.ID, vertex.Dist)}
}

在这段代码中,我们首先定义了顶点结构,并为每个顶点添加了权重、距离、前驱顶点和邻接顶点的列表。然后,我们实现了 DAGLongestPaths 函数,该函数首先对顶点进行拓扑排序,然后按照拓扑顺序放松边。最后,我们在 main 函数中创建了一个示例图,并调用了 DAGLongestPaths 函数来找到最长路径。
注意,这个实现假设了图中至少有一个源点,即没有任何顶点指向它的顶点。在实际情况中,可能需要根据具体问题调整代码以处理多个源点的情况。此外,此代码没有处理图中的环,因为题目明确指出这是一个 DAG。如果在非 DAG 上使用

天工:

要修改DAG-SHORTEST-PATHS过程以找出最长路径,我们可以将原算法稍作调整,转而关注最大值而非最小值。在有向无环图(DAG)中寻找最长路径,我们依然可以采用拓扑排序,但这次我们关注的是结点的权重,且需要将路径长度的计算从求和变为求最大值。

以下是使用Go语言实现的算法:

package mainimport ("fmt"
)// GraphNode represents a node in the DAG
type GraphNode struct {id     intweight int // Node weight
}// Edge represents a directed edge in the DAG
type Edge struct {from, to int
}// Graph represents a directed acyclic graph
type Graph struct {nodes  []*GraphNodeedges  []Edgeindeg  map[int]int // In-degree of each nodemaxLen map[int]int // Max length to reach each node
}// NewGraph creates a new Graph
func NewGraph() *Graph {return &Graph{nodes:  make([]*GraphNode, 0),edges:  make([]Edge, 0),indeg:  make(map[int]int),maxLen: make(map[int]int),}
}// AddNode adds a new node to the graph
func (g *Graph) AddNode(id, weight int) {g.nodes = append(g.nodes, &GraphNode{id, weight})g.indeg[id] = 0g.maxLen[id] = weight
}// AddEdge adds a new edge to the graph
func (g *Graph) AddEdge(from, to int) {g.edges = append(g.edges, Edge{from, to})g.indeg[to]++
}// TopologicalSort returns a topological order of the nodes
func (g *Graph) TopologicalSort() []int {var order []intqueue := []int{}// Add all nodes with in-degree 0 to the queuefor id, degree := range g.indeg {if degree == 0 {queue = append(queue, id)}}// Process the queuefor len(queue) > 0 {current := queue[0]order = append(order, current)queue = queue[1:]// Update the in-degree of the neighbors and add them to the queue if their in-degree becomes 0for _, e := range g.edges {if e.from == current {g.indeg[e.to]--if g.indeg[e.to] == 0 {// Update maxLen for the nodeif currentMax, ok := g.maxLen[current]; ok {if g.maxLen[e.to] < g.maxLen[current]+currentMax {g.maxLen[e.to] = g.maxLen[current] + currentMax}}queue = append(queue, e.to)}}}}return order
}// FindLongestPath returns the longest path in the graph
func (g *Graph) FindLongestPath() int {g.TopologicalSort()maxPath := 0for _, len := range g.maxLen {if len > maxPath {maxPath = len}}return maxPath
}// main function to test the graph
func main() {g := NewGraph()g.AddNode(1, 5)g.AddNode(2, 3)g.AddNode(3, 2)g.AddNode(4, 4)g.AddNode(5, 0)g.AddEdge(1, 2)g.AddEdge(1, 3)g.AddEdge(1, 4)g.AddEdge(2, 5)g.AddEdge(3, 5)g.AddEdge(4, 5)fmt.Println("Longest Path:", g.FindLongestPath()) // Should print the longest path
}

这个代码首先定义了图、结点和边的数据结构,然后实现了拓扑排序和寻找最长路径的算法。在FindLongestPath函数中,我们利用拓扑排序的结果,遍历每个结点来更新到达该结点的最长路径长度。最后,我们遍历所有的maxLen来找到最长的路径。


## chatgpt:要在有向无环图中找出一条最长的路径,可以修改 DAG-SHORTEST-PATHS 过程为 DAG-LONGEST-PATHS 过程以实现此目的。下面是一个用 Go 语言实现的 DAG-LONGEST-PATHS 过程的示例代码:```go
package mainimport ("fmt"
)type Graph struct {vertices intadj      map[int]map[int]bool
}func NewGraph(vertices int) Graph {return Graph{vertices: vertices,adj:      make(map[int]map[int]bool),}
}func (g *Graph) AddEdge(u, v int) {if g.adj[u] == nil {g.adj[u] = make(map[int]bool)}g.adj[u][v] = true
}func DAGLongestPaths(g Graph) []int {dist := make([]int, g.vertices)for i := range dist {dist[i] = -1}dist[0] = 0var topologicalOrder []intvar visit func(int)visit = func(u int) {for v := range g.adj[u] {if dist[v] < dist[u]+1 {dist[v] = dist[u] + 1}visit(v)}topologicalOrder = append(topologicalOrder, u)}visit(0)for i := len(topologicalOrder) - 1; i >= 0; i-- {u := topologicalOrder[i]for v := range g.adj[u] {if dist[v] < dist[u]+1 {dist[v] = dist[u] + 1}}}return dist
}func main() {g := NewGraph(6)g.AddEdge(0, 1)g.AddEdge(0, 2)g.AddEdge(1, 3)g.AddEdge(2, 3)g.AddEdge(3, 4)g.AddEdge(4, 5)longestPaths := DAGLongestPaths(g)fmt.Println("Longest paths from source vertex:")for i, path := range longestPaths {fmt.Printf("Vertex %d: %d\n", i, path)}
}

这段代码实现了 DAG-LONGEST-PATHS 过程,使用拓扑排序和动态规划的方法找出有向无环图中的最长路径。你可以根据自己的实际情况修改顶点数量和边的关系来对这段代码进行测试和调整。

kimi:

在有向无环图(DAG)中寻找最长路径的问题可以通过动态规划来解决。在这种情况下,我们通常使用拓扑排序,然后反向遍历图来计算每个节点的最长路径。这里是一个使用Go语言实现的算法:

  1. 拓扑排序:首先对图进行拓扑排序,确保每个节点在其依赖的节点之后被处理。
  2. 计算最长路径:使用拓扑排序的结果,从后向前遍历节点,更新每个节点的最长路径。

下面是具体的Go语言实现:

package mainimport ("fmt"
)// 图的节点
type Node struct {Value int
}// 图的边
type Edge struct {From, To *NodeWeight   int
}// 图结构
type Graph struct {Nodes []*NodeEdges []*Edge
}// 拓扑排序
func (g *Graph) TopologicalSort() []*Node {var sorted []*Nodevisited := make(map[*Node]bool)var visit func(*Node)visit = func(n *Node) {if visited[n] {return}visited[n] = truefor _, edge := range g.Edges {if edge.From == n {visit(edge.To)}}sorted = append(sorted, n)}for _, node := range g.Nodes {if !visited[node] {visit(node)}}// 反转排序结果,因为我们需要从依赖的节点开始计算for _, node := range sorted[:len(sorted)/2] {sorted[len(sorted)-1-len(sorted)/2+1], sorted[len(sorted)/2] = sorted[len(sorted)/2], node}return sorted
}// 计算最长路径
func (g *Graph) LongestPath() int {sorted := g.TopologicalSort()longestPaths := make([]int, len(sorted))for _, node := range sorted {longestPaths[nodesIndex[node]] = node.Value // 初始化为节点自身的值for _, edge := range g.Edges {if edge.From == node {longestPaths[nodesIndex[edge.To]] = max(longestPaths[nodesIndex[edge.To]], longestPaths[nodesIndex[node]]+edge.Weight)}}}return maxLongestPath(longestPaths)
}func maxLongestPath(paths []int) int {max := paths[0]for _, path := range paths {if path > max {max = path}}return max
}func max(a, b int) int {if a > b {return a}return b
}func nodesIndex[node *Node]intfunc main() {// 示例图nodes := []*Node{{1}, {2}, {3}, {4}}edges := []*Edge{{From: nodes[0], To: nodes[1], Weight: 1},{From: nodes[0], To: nodes[2], Weight: 2},{From: nodes[1], To: nodes[3], Weight: 1},{From: nodes[2], To: nodes[3], Weight: 1},}g := &Graph{Nodes: nodes, Edges: edges}longestPath := g.LongestPath()fmt.Println("The longest path in the DAG is:", longestPath)
}

这段代码定义了一个简单的有向无环图,并实现了拓扑排序和最长路径的计算。注意,这个实现假设图中的节点是连续编号的,并且每个节点的值可以作为路径的一部分。如果节点值不是路径的一部分,你需要调整代码来适应你的具体需求。

混元:

在Go语言中,我们可以修改DAG-SHORTEST-PATHS过程来找出有向无环图(DAG)中最长路径。以下是修改后的Go代码:

package mainimport ("fmt"
)// 定义边的结构
type Edge struct {to     intweight int
}// 定义图的结构
type Graph struct {vertices intedges    [][]Edge
}// 找出最长路径
func longestPath(g *Graph, start int) []int {dist := make([]int, g.vertices)for i := range dist {dist[i] = -1 // 初始化为-1表示无穷小}dist[start] = 0 // 起点的距离为0// 拓扑排序topoOrder := topologicalSort(g)// 根据拓扑排序计算最长路径for _, u := range topoOrder {for _, e := range g.edges[u] {v := e.toif dist[v] < dist[u]+e.weight {dist[v] = dist[u] + e.weight}}}return dist
}// 拓扑排序
func topologicalSort(g *Graph) []int {inDegree := make([]int, g.vertices)for _, edges := range g.edges {for _, e := range edges {inDegree[e.to]++}}queue := []int{}for i, degree := range inDegree {if degree == 0 {queue = append(queue, i)}}topoOrder := []int{}for len(queue) > 0 {u := queue[0]queue = queue[1:]topoOrder = append(topoOrder, u)for _, e := range g.edges[u] {v := e.toinDegree[v]--if inDegree[v] == 0 {queue = append(queue, v)}}}return topoOrder
}func main() {g := &Graph{vertices: 6,edges: [][]Edge{{{to: 1, weight: 5}, {to: 2, weight: 3}},{{to: 3, weight: 6}, {to: 2, weight: 2}},{{to: 4, weight: 4}, {to: 5, weight: 2}},{{to: 5, weight: 6}, {to: 4, weight: 7}},{{to: 3, weight: 1}},{},},}start := 0dist := longestPath(g, start)fmt.Println("Longest paths from vertex", start, "to all other vertices:")for i, d := range dist {fmt.Printf("Vertex %d: %d\n", i, d)}
}

代码解释

  1. Graph 结构:定义了图的结构,包括顶点数和边的集合。
  2. longestPath 函数:计算从起点到所有其他顶点的最长路径。
    • 初始化距离数组 dist,将起点的距离设为0,其他顶点的距离设为-1(表示无穷小)。
    • 使用拓扑排序来确定顶点的处理顺序。
    • 根据拓扑排序的结果更新每个顶点的最长路径。
  3. topologicalSort 函数:对图进行拓扑排序。
    • 计算每个顶点的入度。
    • 使用队列进行拓扑排序,将入度为0的顶点加入队列,并逐步处理这些顶点,更新其邻接顶点的入度。
  4. main 函数:创建一个示例图并调用 longestPath 函数计算最长路径。

这个代码可以在O(V+E)的时间复杂度内找到DAG中的最长路径,其中V是顶点数,E是边数。

相关文章:

  • 「Python入门」vscode的安装和python插件下载
  • 【车联网安全】车端网络攻击及检测的框架/模型
  • netty之Future和Promise
  • 【STM32开发环境搭建】-3-STM32CubeMX Project Manager配置-自动生成一个Keil(MDK-ARM) 5的工程
  • docker - 镜像操作(拉取、查看、删除)
  • 报错Invalid HADOOP_HDFS_HOME
  • [深度学习]卷积神经网络CNN
  • 二分查找详解(Java版)
  • Windows 7 和 Windows 7 sp 的区别
  • 【RocketMQ】SpringBoot整合RocketMQ
  • 《向量数据库指南》——非结构化数据迁徙战:向量数据库的挑战与突破
  • 计算机网络--TCP、UDP抓包分析实验
  • 企业构建AI所需的最低可行基础设施:从数据存储到大模型集成
  • Python线程终止:如何优雅地结束一场“舞蹈”
  • 制造企业为何需要PLM系统?PLM系统解决方案对制造业重要性分析
  • SegmentFault for Android 3.0 发布
  • Android框架之Volley
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • canvas 绘制双线技巧
  • CSS盒模型深入
  • Java面向对象及其三大特征
  • Mybatis初体验
  • Redis中的lru算法实现
  • scrapy学习之路4(itemloder的使用)
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • vue总结
  • 程序员该如何有效的找工作?
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 和 || 运算
  • 聚簇索引和非聚簇索引
  • 力扣(LeetCode)357
  • 码农张的Bug人生 - 初来乍到
  • 前嗅ForeSpider教程:创建模板
  • 思否第一天
  • 微信小程序开发问题汇总
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 微信小程序实战练习(仿五洲到家微信版)
  • 系统认识JavaScript正则表达式
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​一些不规范的GTID使用场景
  • ‌JavaScript 数据类型转换
  • #《AI中文版》V3 第 1 章 概述
  • #define、const、typedef的差别
  • #职场发展#其他
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十八)SpringBoot之发送QQ邮件
  • (转)【Hibernate总结系列】使用举例
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Micro Framework初体验(二)
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net 基于IIS部署blazor webassembly或WebApi