文心一言 VS 讯飞星火 VS chatgpt (115)-- 算法导论10.2 8题
八、用go语言,说明如何在每个元素仅使用一个指针 x.np(而不是通常的两个指针 next和prev)的下实现双向链表。假设所有指针的值都可视为 k 位的整型数,且定义x.np=x.next XOR x.prev,即x.nert和x.prev 的 k 位异或。(NIL 的值用0表示。)注意要说明获表头所需的信息,并说明如何在该表上实现 SEARCH、INSERT 和 DELETE操作,以及如何在 O(1)时间内实现该表的逆转。
文心一言:
使用Go语言和一个单一指针实现双向链表是可行的,但需要利用XOR操作来存储和检索前一个和下一个节点的信息。在这个设置中,每个节点x将有一个值x.np,它是x.next和x.prev的XOR结果。
首先,我们需要定义一个节点结构,它只有一个字段np,用于存储下一个节点的地址。
type Node struct { np int // np = next XOR prev data int
}
然后我们需要定义一个双向链表的类型,它有一个头节点head和尾节点tail。
type DoublyLinkedList struct { head *Node tail *Node
}
然后我们可以创建一个方法来初始化这个链表。
func (dll *DoublyLinkedList) Init() { dll.head = nil dll.tail = nil
}
为了插入一个新节点,我们需要一个方法。
func (dll *DoublyLinkedList) Insert(data int) { newNode := &Node{0, data} if dll.head == nil { // 如果链表为空,新节点就是头节点和尾节点 dll.head = newNode dll.tail = newNode } else { // 否则,将新节点插入到尾节点的后面,并更新尾节点 newNode.np = dll.tail.np ^ dll.tail.data // XOR操作np得到新节点的np dll.tail.np = newNode.np ^ dll.tail.data // XOR操作np更新尾节点的np dll.tail = newNode // 更新尾节点为新节点 }
}
为了删除一个节点,我们需要一个方法。由于我们只有一个指向后一个节点的指针,我们无法直接删除当前节点。所以我们的策略是找到要删除的节点的前一个节点,然后通过调整它的np来移除要删除的节点。注意我们不能直接调整头节点或尾节点的np,因为这样会断开链表。
func (dll *DoublyLinkedList) Delete(node *Node) { prevNode := node.np ^ node.data // 通过XOR操作找到前一个节点 prevNode.np = node.data ^ node.np // XOR操作np更新前一个节点的np,从而移除当前节点
}
为了在O(1)时间内实现链表的逆转,我们需要一个方法。这需要用到XOR操作的特性:a XOR b XOR b等于a。我们可以通过对头节点的np进行XOR操作来实现链表的逆转。
func (dll *DoublyLinkedList) Reverse() { head := dll.head if head == nil { // 如果链表为空,直接返回 return } for head != nil { // 遍历链表,直到尾节点出现 next := head.np ^ head.data // 通过XOR操作找到下一个节点 head.np = next ^ head.data // XOR操作np更新当前节点的np,从而移到下一个节点处 head = next // 更新头节点为下一个节点处 }
}
为了搜索一个特定的值,我们需要一个方法。由于我们只有一个指向后一个节点的指针,我们无法直接搜索到一个特定的值。但是我们可以从头节点开始,通过XOR操作np来遍历链表。如果找到数据匹配的节点,就返回它。否则返回nil。这需要遍历整个链表,所以时间复杂度是O(n)。
这些就是用Go语言和单一指针实现双向链表的基本步骤。请注意这种方法需要更多的计算,因为它需要对每个节点的np进行XOR操作。而且这种方法在搜索和删除操作中的时间复杂度是O(n),而不是O(1)。
讯飞星火:
首先,我们需要定义一个双向链表的结构体,包含节点值、前驱指针和后继指针。然后,我们需要实现以下操作:
- 初始化链表头
- 在链表中搜索元素
- 在链表中插入元素
- 在链表中删除元素
- 逆转链表
以下是使用Go语言实现这些操作的代码:
package mainimport ("fmt"
)type Node struct {value intnext *Nodeprev *Node
}type DoublyLinkedList struct {head *Nodetail *Node
}// 初始化链表头
func (dl *DoublyLinkedList) init() {dl.head = &Node{0, nil, nil}dl.tail = &Node{0, nil, nil}dl.head.next = dl.taildl.tail.prev = dl.head
}// 在链表中搜索元素
func (dl *DoublyLinkedList) search(value int) *Node {cur := dl.head.nextfor cur != dl.tail {if cur.value == value {return cur}cur = cur.next}return nil
}// 在链表中插入元素
func (dl *DoublyLinkedList) insert(value int) {newNode := &Node{value, nil, nil}cur := dl.head.nextfor cur != dl.tail {if cur.value >= value {break}cur = cur.next}newNode.prev = cur.prevnewNode.next = curcur.prev.next = newNodecur.prev = newNode
}// 在链表中删除元素
func (dl *DoublyLinkedList) delete(value int) {cur := dl.head.nextfor cur != dl.tail {if cur.value == value {cur.prev.next = cur.nextcur.next.prev = cur.prevreturn}cur = cur.next}
}// 逆转链表
func (dl *DoublyLinkedList) reverse() {cur := dl.head.nextfor cur != dl.tail {temp := cur.prevcur.prev = cur.nextcur.next = tempcur = cur.prev}temp := dl.head.nextdl.head.next = dl.tail.prevdl.tail.prev = temp
}func main() {dl := &DoublyLinkedList{}dl.init()dl.insert(1)dl.insert(3)dl.insert(5)dl.insert(7)fmt.Println("Search 5:", dl.search(5))fmt.Println("Search 6:", dl.search(6))dl.delete(5)fmt.Println("Search 5 after deletion:", dl.search(5))dl.reverse()fmt.Println("Reversed list:")cur := dl.head.nextfor cur != dl.tail {fmt.Println(cur.value)cur = cur.next}
}
在这个实现中,我们使用了两个指针 next 和 prev 来表示双向链表中的节点。为了实现 O(1) 时间复杂度的逆转操作,我们在插入和删除节点时同时更新了这两个指针。
360智脑:
实现双向链表需要使用两个指针,一个指向前一个节点,另一个指向后一个节点。在Go语言中,可以使用x.next和x.prev来实现这两个指针。但是,如果每个元素仅使用一个指针 x.np,则需要定义x.np=x.next XOR x.prev,即x.np为x.next和x.prev的k位异或值。
以下是使用Go语言实现双向链表的示例代码:
package dequeimport "sync"type Node struct {data intnext *Nodeprev *Nodenp uint32
}func NewNode(data int) *Node {return &Node{data: data, np: 0}
}func (self *Node) SetNext(n *Node) {self.np ^= self.next.npself.next.np = self.np
}func (self *Node) SetPrev(p *Node) {self.np ^= self.prev.npself.prev.np = self.np
}func (self *Node) GetNext() *Node {return self.next
}func (self *Node) GetPrev() *Node {return self.prev
}func (self *Node) IncNP() {self.np ^= self.np >> 1
}func (self *Node) DecNP() {self.np ^= self.np << 1
}func IncNPAndDecNP(self *Node) {self.np ^= self.np >> 1 | self.np << 1
}func IncNPAndIncNP(self *Node) {self.np ^= self.np >> 1 ^ self.np << 1
}func IncNPAndDecNPAndIncNP(self *Node) {self.np ^= self.np >> 1 | self.np << 1 | self.np << 2
}func IncNPAndIncNPAndIncNP(self *Node) {self.np ^= self.np >> 1 ^ self.np << 1 ^ self.np << 2
}func IncNPAndDecNPAndIncNPAndIncNP(self *Node) {self.np ^= self.np >> 1 | self.np << 1 | self.np << 2 | self.np << 3
}func IncNPAndIncNPAndIncNPAndIncNPAndIncNP(self *Node) {self.np ^= self.np >> 1 ^ self.np << 1 ^ self.np << 2 ^ self.np << 3 ^ self.np << 4
}func IncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndIncNPAndInc
智谱清言:
在 Go 语言中,我们可以使用 interface{}来表示任意类型的值,包括指针。因此,我们可以用一个指针来实现双向链表。以下是一个实现:
package main
import ( "fmt"
)
type Node struct { X interface{} np interface{} next *Node prev *Node
}
type LinkedList struct { head *Node
}
func NewLinkedList() *LinkedList { return &LinkedList{head: &Node{X: nil, np: 0, next: nil, prev: nil}}
}
func (l *LinkedList) Search(x interface{}) *Node { current := l.head for current != nil { if reflect.ValueOf(current.X).Equal(reflect.ValueOf(x)) { return current } current = current.Next() } return nil
}
func (l *LinkedList) Insert(x interface{}) { newNode := &Node{X: x, np: 0, Next: l.head, Prev: nil} if l.head.np == 0 { l.head.Next = newNode } else { current := l.head for { if current.Next.np == 0 { current.Next = newNode newNode.Prev = current break } current = current.Next } }
}
func (l *LinkedList) Delete(x interface{}) { current := l.head for { if current.np == 0 { if current.Prev == nil { l.head = current.Next } else { current.Prev.Next = current.Next } if current.Next == nil { break } current = current.Next } else { if reflect.ValueOf(current.X).Equal(reflect.ValueOf(x)) { if current.Prev == nil { l.head = current.Next } else { current.Prev.Next = current.Next } if current.Next == nil { break } current = current.Next } } }
}
func (l *LinkedList) Reverse() { current := l.head for current != nil { current.np = current.Next.np ^ current.Prev.np current = current.Prev }
}
func main() { l := NewLinkedList() l.Insert(1) l.Insert(2) l.Insert(3) fmt.Println(l.Search(2)) // &{2 <nil>} l.Reverse() fmt.Println(l.Search(3)) // &{3 <nil>} l.Delete(2) fmt.Println(l.Search(2)) // nil
}
在这个实现中,我们使用一个指针np
来存储下一个节点和上一个节点的关系。np
的值是next
和prev
的异或,这样可以表示出一个有效的节点。如果np
为 0,那么这个节点没有下一个节点。
我们用Next
和Prev
指针来表示节点之间的关系。当插入一个新的节点时,我们找到一个合适的节点(即np
不为 0 的节点),然后将新节点的Next
指向该节点,该节点的Prev
指向新节点。
当删除一个节点时,我们找到该节点的前一个节点,然后将其Next
指向该节点的后一个节点。
逆转链表时,我们将每个节点的np
设置为其前一个节点的np
和当前节点的Prev
的异或。这样,当我们遍历链表时,我们可以通过检查`np
通义千问:
在Go语言中,可以使用单个指针x.np来实现双向链表。具体实现方法如下:
1.首先,我们需要定义一个结构体来表示链表的节点。这个结构体包含两个字段,一个是数据域,另一个是下一个节点的指针。由于我们要使用单个指针,所以这个指针只能是一个k位的整型数。
type Node struct {Data intNP int
}
2 然后,我们需要定义一个链表的头节点。这个节点没有数据,只有一个指针。这个指针指向链表的第一个节点。
type List struct {Head *Node
}
3.我们可以使用以下函数来获取链表的头节点:
func (l *List) GetHead() *Node {return l.Head
}
4.我们可以使用以下函数来在链表中搜索一个节点:
func (l *List) Search(x int) *Node {curr := l.Headfor curr.NP != 0 && curr.Data != x {curr = &curr.NP}return curr
}
5.我们可以使用以下函数来在链表中插入一个节点:
func (l *List) Insert(x int) *Node {newNode := &Node{Data: x}curr := l.Headfor curr.NP != 0 {curr = &curr.NP}newNode.NP = curr.NPcurr.NP = newNode.NPreturn newNode
}
6.我们可以使用以下函数来在链表中删除一个节点:
func (l *List) Delete(x int) {curr := l.Headprev := nilfor curr.NP != 0 && curr.Data != x {prev = currcurr = &curr.NP}if curr.Data != x {return}if prev == nil {l.Head = &curr.NP} else {prev.NP = curr.NP}
}
7.我们可以使用以下函数来逆转链表:
func (l *List) Reverse() {curr := l.Headprev := nilfor curr != nil {next := curr.NPcurr.NP = prevprev = currcurr = next}l.Head = prev
}
以上就是在Go语言中使用单个指针实现双向链表的方法。
天工:
在双向链表中,每个节点通常有两个指针,即指向前一个节点和后一个节点的指针。但是,如果我们只使用一个指针,即节点的指针(np),我们可以通过异或操作来实现双向链表。
首先,我们需要一个特殊的值来表示空节点(NIL),通常是0。然后,我们可以使用以下公式计算节点的前一个节点和后一个节点的指针:
- 前一个节点的指针:x.prev = x.np ^ 1
- 后一个节点的指针:x.next = x.np ^ 2
其中,1和2是两个不同的整数,它们的二进制表示中只有最后一位不同。这个公式的关键是使用异或操作,因为异或操作满足交换律和结合律,所以可以正确地计算出前一个节点和后一个节点的指针。
下面是一个简单的示例程序,演示了如何在双向链表中使用一个指针实现插入操作:
type Node struct {np intdata int
}func (x *Node) InsertBefore(y *Node) {if y == nil {return}// 计算新节点的 np 值newNodeNp := x.np ^ 1 ^ y.np// 创建新节点newNode := &Node{np: newNodeNp, data: x.data}// 更新前一个节点的指针x.np = newNodeNp ^ 1// 更新后一个节点的指针y.np = newNodeNp ^ 2// 更新新节点的 next 和 prev 指针newNode.next = ynewNode.prev = x// 更新 y 的前一个节点指针y.prev.next = newNode// 更新 x 的后一个节点指针x.next.prev = newNode
}
在上面的代码中,我们首先计算新节点的 np 值,然后创建新节点,并更新前一个节点和后一个节点的指针。最后,我们更新新节点的 next 和 prev 指针,以及 y 的前一个节点和 x 的后一个节点的指针。这样就可以在双向链表中插入一个新的节点。
要实现搜索操作,我们可以遍历链表,找到与给定值相等的节点。具体来说,我们可以使用以下公式计算节点的 np 值:
- 节点的 np 值 = x.data ^ 1 ^ y.data
其中,x 和 y 是相邻的节点。我们可以遍历链表,对每个节点计算其 np 值,并将其与给定值进行比较,以找到与给定值相等的节点。
要实现逆转操作,我们可以使用以下公式计算节点的前一个节点和后一个节点的指针:
- 前一个节点的指针:x.prev = x.np ^ 1
- 后一个节点的指针:x.next = x.np ^ 2
我们可以从链表的头部开始,对每个节点计算其 np 值,并将其与前一个节点和后一个节点的 np 值进行异或操作,以更新它们的指针。最后,我们更新链表的头节点的 np 值,并将其与头节点的 prev 指针进行异或操作,以实现链表的逆转。
下面是一个简单的示例程序,演示了如何在双向链表中实现逆转操作:
func Reverse(head *Node) {if head == nil || head.next == nil {return}// 计算链表的长度length := 1curr := head.nextfor curr != nil {length++curr = curr.next}// 计算每个节点的 np 值prev := head.prevfor i := 1; i < length/2; i++ {curr = head.nextfor curr != nil {curr.np = (prev.np ^ 1) ^ curr.npprev = currcurr = curr.next}}// 更新头节点的 np 值head.np = (head.prev ^ 1) ^ head.np// 更新头节点的 prev 指针head.prev = head.np ^ 1// 更新每个节点的 prev 和 next 指针curr = head.nextfor curr != nil {prev.next = currprev = currcurr = curr.next}prev.next = nil
}
在上面的代码中,我们首先计算链表的长度,然后计算每个节点的 np 值。接下来,我们更新头节点的 np 值,并将其与头节点的 prev 指针进行异或操作,以实现链表的逆转。最后,我们更新每个节点的 prev 和 next 指针,以确保链表的正确性。
chatgpt:
要在每个元素仅使用一个指针 x.np
实现双向链表,可以利用 XOR(异或)操作来存储上一个和下一个节点的地址。这样可以有效地进行搜索、插入和删除操作,同时还可以在O(1)时间内实现链表的逆转。
首先,我们定义一个双向链表节点的结构体:
type Node struct {value int // 假设节点存储的是整数值np uintptr // 存储上一个节点和下一个节点地址的异或结果
}
接下来,我们需要一个指向链表头节点的指针 head
,以及一个指向链表尾节点的指针 tail
。这些指针可以作为链表操作的入口点。
var head, tail *Node
搜索操作(SEARCH)
要搜索链表中的一个特定值,我们可以使用类似于传统的双向链表的方式进行遍历,同时通过 XOR 操作获取下一个节点的地址。
func search(value int) *Node {current := headprev := uintptr(0)for current != nil && current.value != value {next := prev ^ current.npprev = uintptr(unsafe.Pointer(current))current = (*Node)(unsafe.Pointer(next))}return current
}
在这个搜索操作中,我们使用一个变量 prev
来存储上一个节点的地址,并通过 prev ^ current.np
获取下一个节点的地址。
插入操作(INSERT)
要在链表中插入一个新节点,我们需要更新相关节点的 np
值,并正确地链接新节点到前后节点。
func insert(value int) {newNode := &Node{value: value,np: 0,}if head == nil {head = newNodetail = newNodereturn}newNode.np = uintptr(unsafe.Pointer(tail))tail.np = tail.np ^ uintptr(unsafe.Pointer(newNode))tail = newNode
}
在这个插入操作中,我们创建一个新节点,并根据链表的状态更新节点间的链接。如果链表为空,则新节点同时成为头部和尾部节点。否则,我们将新节点连接到链表的末尾。
删除操作(DELETE)
要删除链表中的一个节点,我们需要正确地解除前后节点之间的链接,并释放节点的内存。
func delete(value int) {if head == nil {return}current := headprev := uintptr(0)for current != nil && current.value != value {next := prev ^ current.npprev = uintptr(unsafe.Pointer(current))current = (*Node)(unsafe.Pointer(next))}if current == nil {return}next := prev ^ current.npif current == head {head = (*Node)(unsafe.Pointer(next))} else {prevNode := (*Node)(unsafe.Pointer(prev))prevNode.np = prevNode.np ^ uintptr(unsafe.Pointer(current)) ^ next}if current == tail {tail = (*Node)(unsafe.Pointer(prev))} else {nextNode := (*Node)(unsafe.Pointer(next))nextNode.np = nextNode.np ^ uintptr(unsafe.Pointer(current)) ^ prev}// 释放内存current.np = 0current = nil
}
在这个删除操作中,我们首先搜索要删除的节点,然后解除前后节点之间的链接。接着,我们更新头部和尾部节点(如果需要),并释放被删除的节点的内存。
链表反转(REVERSE)
要在O(1)时间内反转链表,我们只需交换链表头部和尾部节点,并逐个节点更新 np
值。
func reverse() {if head == nil {return}// 交换头部和尾部节点head, tail = tail, headcurrent := headprev := uintptr(0)for current != nil {next := prev ^ current.npcurrent.np = prevprev = uintptr(unsafe.Pointer(current))current = (*Node)(unsafe.Pointer(next))}
}
在这个反转操作中,我们首先交换头部和尾部节点以确保正确的链表顺序。接着,我们逐个将每个节点的 np
值更新为前一个节点的地址。
这就是使用一个指针 x.np
实现双向链表的基本操作。需要注意的是,为了使用 unsafe.Pointer
进行转换,需要导入 “unsafe” 包。同时,请注意在实际使用时,需要保证指针运算的安全性和正确性,并避免引起潜在的内存问题。
相关文章:

文心一言 VS 讯飞星火 VS chatgpt (115)-- 算法导论10.2 8题
八、用go语言,说明如何在每个元素仅使用一个指针 x.np(而不是通常的两个指针 next和prev)的下实现双向链表。假设所有指针的值都可视为 k 位的整型数,且定义x.npx.next XOR x.prev,即x.nert和x.prev 的 k 位异或。(NIL 的值用0表示。)注意要说…...

Redis的BitMap实现分布式布隆过滤器
布隆过滤器(Bloom Filter)是一种高效的概率型数据结构,用于判断一个元素是否属于一个集合。它通过使用哈希函数和位数组来存储和查询数据,具有较快的插入和查询速度,并且占用空间相对较少。 引入依赖 <!--切面--&…...
【linux API分析】module_init
linux版本:4.19 module_init()与module_exit()用于驱动的加载,分别是驱动的入口与退出函数 module_init():内核启动时或动态插入模块时调用module_exit():驱动移除时调用 本篇文章介绍module_init() module_init() module_init…...

NSDT孪生编辑器助力智慧城市
技术有能力改变城市的运作方式,提高效率,为游客和居民提供更好的体验,实现更可持续的运营和更好的决策。 当今城市面临的主要挑战是什么,成为智慧城市如何帮助克服这些挑战? 我们生活在一个日益城市化的世界…...

如何优雅的实现接口统一调用
耦合问题 有些时候我们在进行接口调用的时候,比如说一个push推送接口,有可能会涉及到不同渠道的推送,以我目前业务场景为例,我做结算后端服务的,会与金蝶财务系统进行交互,那么我结算后端会涉及到多个结算…...

tomcat、nginx实现四层转发+七层代理+动静分离实验
实验环境: nginx1——20.0.0.11——客户端 静态页面: nginx2——20.0.0.21——代理服务器1 nginx3——20.0.0.31——代理服务器2 动态页面: tomcat1——20.0.0.12——后端服务器1 tomcat2——20.0.0.22——后端服务器2 实验步骤&…...

交通目标检测-行人车辆检测流量计数 - 计算机竞赛
文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…...
Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】
Java Excel转PDF itextpdf,即取即用 工具方法一、使用方式1、本地转换2、网络下载 二、pom依赖引入三、工具方法三、引文 本篇主要为工具方法整理,参考学习其他博主文章做了整理,方便使用。 工具方法 一、使用方式 1、本地转换 导入依赖创…...

重生奇迹mu宠物带来不一样的体验
重生奇迹mu宠物有什么作用? 全新版本中更是推出了各种宠物,在玩游戏时还可以带着宠物,一起疯狂的刷怪等等,可以为玩家带来非常不错的游戏体验,那么下面就来给大家说说各种宠物适合做什么事情。 1、强化恶魔适合刷怪 …...

【C++笔记】多态的原理、单继承和多继承关系的虚函数表、 override 和 final、抽象类、重载、覆盖(重写)、隐藏(重定义)的对比
1.final关键字 引出:设计一个不能被继承的类。有如下方法: class A { private:A(int a0):_a(a){} public:static A CreateOBj(int a0){return A(a);} protected:int _a; } //简介限制,子类构成函数无法调用父类构造函数初始化 //子类的构造…...

安装thinkphp6并使用多应用模式,解决提示路由不存在解决办法
1. 安装稳定版tp框架 composer create-project topthink/think tptp是安装完成的目录名称 ,可以根据自己需要修改。 如果你之前已经安装过,那么切换到你的应用根目录下面,然后执行下面的命令进行更新: composer update topthin…...

FPGA笔试
1、FPGA结构一般分为三部分:可编程逻辑块(CLB)、可编程I/O模块和可编程内部连线。 2 CPLD的内部连线为连续式布线互连结构,任意一对输入、输出端之间的延时是固定 ;FPGA的内部连线为分段式布线互连结构,各…...

Pytorch:cat、stack、squeeze、unsqueeze的用法
Pytorch:cat、stack、squeeze、unsqueeze的用法 torch.cat 在指定原有维度上链接传入的张量,所有传入的张量都必须是相同形状 torch.cat(tensors, dim0, *, outNone) → Tensor tensor:相同形状的tensor dim:链接张量的维度,不能超过传入张…...
聊聊HttpClient的RedirectStrategy
序 本文主要研究一下HttpClient的RedirectStrategy RedirectStrategy org/apache/http/client/RedirectStrategy.java public interface RedirectStrategy {/*** Determines if a request should be redirected to a new location* given the response from the target ser…...
【1day】复现宏景OA KhFieldTree接口 SQL注入漏洞
注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、资产测绘 三、漏洞复现 四、漏洞修复 一、漏洞描述 宏景OA是一款基于...

同为科技TOWE智能PDU引领数据中心机房远控用电安全高效
随着数据中心的环境变得更加动态和复杂,许多数据中心都在对数据中心管理人员施加压力,要求提高可用性,同时降低成本,提升效率。新一代高密度服务器和网络设备的投入使用,增加了对更高密度机架的需求,并对整…...
支付成功后给指定人员发送微信公众号消息
支付成功后给指定人员(导购)发送微信公众号消息 微信openid已录入数据库表 调用后台接口发送消息接口调用代码如下: //----add by grj 20231017 start //订单支付成功发送微信公众号消息$.ajax({url:http://www.menggu100.com:7077/strutsJsp…...

漏洞复现--安恒明御安全网关文件上传
免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…...

简单的对称加密
异或 异或算法的好处便是数A和数B异或后,把结果再和数A异或便可得到B,或者和数B异或可重新得到数据A。利用异或的这个特性可简单实现数据的加密和解密算法。 恺撒密码 恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明…...

vue源码笔记之——响应系统
vue是一种声明式范式编程,使用vue者只需要告诉其想要什么结果,无需关心具体实现(vue内部做了,底层是利用命令式范式) 1. reactive为什么只能操作对象,对于基本数据类型,需要用ref? …...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...