文心一言 VS 讯飞星火 VS chatgpt (297)-- 算法导论22.1 1题

一、给定有向图的邻接链表,需要多长时间才能计算出每个结点的出度(发出的边的条数)?多长时间才能计算出每个结点的入度(进入的边的条数)?如果要写代码,请用go语言。

文心一言:

计算出度

对于有向图的邻接链表表示,每个节点通常存储为一个结构体,其中包含一个指向其所有邻接节点的链表的指针(或切片)。计算每个节点的出度非常简单,因为出度直接对应于该节点指向的邻接链表(或切片)的长度。

时间复杂度:O(V + E),其中V是节点数,E是边数。虽然这个复杂度看起来似乎与边的数量有关,但在实际计算过程中,我们只需遍历每个节点及其邻接链表一次,因此总体上是线性的,因为每个节点和每条边都被访问一次。

Go代码示例

package main

import "fmt"

// 定义图的节点
type Node struct {
   
   
    ID   int
    Out  []*Node // 指向的节点列表,即出度
}

// 计算每个节点的出度
func calculateOutDegrees(nodes []*Node) map[int]int {
   
   
    outDegrees := make(map[int]int)
    for _, node := range nodes {
   
   
        outDegrees[node.ID] = len(node.Out)
    }
    return outDegrees
}

func main() {
   
   
    // 示例图
    nodes := []*Node{
   
   
        {
   
   ID: 1, Out: []*Node{
   
   {
   
   ID: 2}, {
   
   ID: 3}}},
        {
   
   ID: 2, Out: []*Node{
   
   {
   
   ID: 4}}},
        {
   
   ID: 3, Out: []*Node{
   
   }},
        {
   
   ID: 4, Out: []*Node{
   
   {
   
   ID: 1}}}, // 创建一个环
    }

    outDegrees := calculateOutDegrees(nodes)
    for id, degree := range outDegrees {
   
   
        fmt.Printf("Node %d has out-degree %d\n", id, degree)
    }
}

计算入度

计算入度稍微复杂一些,因为我们需要知道有多少条边指向了某个节点。在邻接链表表示中,这通常不是直接可用的信息。一种常见的方法是使用一个额外的数据结构(如map)来跟踪每个节点的入度。

时间复杂度:O(E),因为我们需要遍历每条边一次来更新每个节点的入度。

Go代码示例

package main

import "fmt"

// 假设Node定义与上面相同

// 计算每个节点的入度
func calculateInDegrees(nodes []*Node) map[int]int {
   
   
    inDegrees := make(map[int]int)
    for _, node := range nodes {
   
   
        for _, outNode := range node.Out {
   
   
            inDegrees[outNode.ID]++
        }
    }
    return inDegrees
}

func main() {
   
   
    // 使用与上面相同的nodes定义

    inDegrees := calculateInDegrees(nodes)
    for id, degree := range inDegrees {
   
   
        fmt.Printf("Node %d has in-degree %d\n", id, degree)
    }
}

在上面的calculateInDegrees函数中,我们遍历了每个节点的邻接链表,并对每个邻接节点的入度进行了加一操作。这样,在遍历完成后,我们就得到了每个节点的入度。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

讯飞星火:

计算每个节点的出度和入度的复杂度都是O(V+E),其中V是顶点的数量,E是边的数量。这是因为我们需要遍历所有的边来计算每个节点的出度和入度。

以下是使用Go语言编写的代码:

package main

import (
	"fmt"
)

type Graph struct {
   
   
	vertices int
	adjList  [][]int
}

func NewGraph(vertices int) *Graph {
   
   
	g := &Graph{
   
   
		vertices: vertices,
		adjList:  make([][]int, vertices),
	}
	return g
}

func (g *Graph) AddEdge(src, dest int) {
   
   
	g.adjList[src] = append(g.adjList[src], dest)
}

func (g *Graph) OutDegree() []int {
   
   
	outDegrees := make([]int, g.vertices)
	for src := 0; src < g.vertices; src++ {
   
   
		outDegrees[src] = len(g.adjList[src])
	}
	return outDegrees
}

func (g *Graph) InDegree() []int {
   
   
	inDegrees := make([]int, g.vertices)
	for src := 0; src < g
### 如何在微信中集成和使用 ChatGPT 或百度的文心一言服务 目前,官方并没有直接支持通过微信内置浏览器访问 ChatGPT 的网页版[^1]。然而,对于希望在微信环境中体验类似功能的用户来说,存在几种替代方案: #### 使用第三方小程序或公众号 一些开发者创建了专门的小程序或微信公众账号来间接接入这些AI服务平台。例如,“通义千问”已经上线了微信小程序版本,允许用户更便捷地与其交互。 #### 浏览器内嵌方式 如果想要尝试像文心一言这样的国内产品,在微信内部打开其官方网站也是可行的方法之一。只需点击下方链接即可进入相应页面: - 文心一言:[https://yiyan.baidu.com/](https://yiyan.baidu.com/) 需要注意的是,由于网络环境的不同以及各平台政策的变化,具体可用性和稳定性可能会有所差异。建议定期关注目标平台最新公告获取最准确的信息。 ```python # 示例代码用于说明如何通过Python脚本调用API接口(仅作概念展示) import requests def get_response_from_api(prompt, api_url="http://example.com/api"): response = requests.post(api_url, json={"message": prompt}) return response.json() prompt_text = "你好" result = get_response_from_api(prompt_text) print(result['reply']) ``` 此段代码展示了理论上可以通过编程手段实现与某些开放API对接的方式,但实际上要在微信生态里做到这一点还需要遵循特定的安全指引和技术文档指导[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福大大架构师每日一题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值