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

go数据结构学习笔记

本博文较为完整的实现了go的链表、栈,队列,树,排序,链表包括顺序链表,双向链表,循环链表,队列是循环队列,排序包含冒牌、选择

1.链表

1.1 顺序链表

type LNode struct {data intnext *LNode
}
type LinkList *LNode// 初始化链表
func InitList() *LNode {l := &LNode{}return l
}// 插入链表
func (l *LNode) ListInsert(index int, value int) {p := lj := 0for p != nil && j < index-1 {p = p.nextj++}if p == nil {fmt.Println(p, j, index-1)fmt.Println("链表插入出点问题")return}s := &LNode{data: value}s.next = p.nextp.next = s
}// 删除
func (l *LNode) ListDelete(value int) {p := l.nextvar q *LNodefor p != nil {if p.data == value {if q == nil {l.next = p.next} else {q.next = p.next}}q = pp = p.next}
}// 查找
func (l *LNode) ListSearch(value int) *LNode {p := l.nextfor p != nil {//fmt.Println(p.data)if p.data == value {return p}p = p.next}return nil
}// 修改
func (l *LNode) ListModify(oldValue int, value int) {search := l.ListSearch(oldValue)if search != nil {search.data = value}
}
func (l *LNode) PrintL() {p := l.next // 从头节点的下一个开始遍历for p != nil {fmt.Printf("%d ", p.data) // 打印数据p = p.next}
}
func main() {l := InitList()l.ListInsert(1, 1)l.ListInsert(1, 2)l.ListInsert(1, 3)l.ListInsert(1, 4)l.ListInsert(1, 5)l.ListInsert(1, 6)l.PrintL()l.ListDelete(4)fmt.Println()l.PrintL()p := l.ListSearch(2)if p != nil {fmt.Println("\np value is :", p.data)}l.ListModify(2, 55)l.PrintL()
}

在这里插入图片描述

1.2 循环链表


type CirNode struct {data intnext *CirNode
}var CirList *CirNode
var CirRear *CirNodefunc InitCirList() *CirNode {node := &CirNode{data: 0, next: nil}node.next = nodereturn node
}func CreateCList(l *CirNode, data []int, n int) {r := lvar s *CirNodefor i := 0; i < n; i++ {s = &CirNode{}s.data = data[i]fmt.Println(data[i])s.next = r.nextr.next = sr = s}
}// 打印
func (l *CirNode) PrintList() {p := l.nextfor p != l {fmt.Printf("%d ", p.data)p = p.next}fmt.Println()
}// 查找,修改,删除
func (first *CirNode) DeleteNode(index int) {p := first.nextpre := firstcnt := 1for p != first && cnt < index {pre = pp = p.nextcnt++}pre.next = p.next
}func (first *CirNode) SarchValue(value int) {p := first.nextfor p != first {if p.data == value {break}p = p.next}if p == first {fmt.Println("未找到")}
}// 修改
func (first *CirNode) ModifyValue(value int, ele int) {p := first.nextfor p != first {if p.data == value {p.data = elebreak}p = p.next}}
func main() {lst := InitCirList()data := []int{1, 2, 3, 4}CreateCList(lst, data, 4)lst.PrintList()lst.DeleteNode(2)lst.PrintList()lst.SarchValue(1)lst.SarchValue(2)lst.PrintList()lst.ModifyValue(1, 94)lst.PrintList()
}

在这里插入图片描述

1.3 双向链表


type DuLNode struct {data  intprior *DuLNodenext  *DuLNode
}// 增加,删除,查找,修改
func (dL *DuLNode) Add(i int, val int) {if dL.next == nil || i <= 0 {fmt.Println("插入位置错误")}p := dL.nextcnt := 1for p != dL && cnt < i {p = p.nextcnt++}s := &DuLNode{}s.data = vals.prior = p.priors.prior.next = ss.next = pp.prior = s}func (dL *DuLNode) Print() {p := dL.nextfor p != dL {fmt.Printf("%d ", p.data)p = p.next}
}
func (dL *DuLNode) SearchKey(val int) {p := dL.nextfor p != dL {if p.data == val {break}}if p == dL {fmt.Println("没找到")}
}
func (dL *DuLNode) ModifyKey(val int, ele int) {p := dL.nextfor p != dL {if p.data == val {break}}}
func main() {dL := &DuLNode{}dL.next = dLdL.prior = dLdL.Add(1, 1)dL.Add(1, 2)dL.Add(1, 3)dL.Add(1, 4)dL.Add(1, 5)dL.Add(1, 6)dL.Add(1, 7)dL.Add(1, 8)dL.Print()
}

在这里插入图片描述

2.栈

2.1 顺序栈

type SNode struct {data    []intTop     intMaxSize int
}var Stack *SNode
var PtrToStack *SNodefunc NewSNode(MaxSize int) *SNode {return &SNode{data: make([]int, MaxSize), Top: -1, MaxSize: MaxSize}
}// 判断堆栈是否空
func (s *SNode) IsEmpty() bool {return s.Top == -1
}// 判断堆栈是否为满
func (s *SNode) IsFull() bool {return s.Top == s.MaxSize-1
}// 压入堆栈
func (s *SNode) Push(v int) {if s.IsFull() {fmt.Println("栈满")return} else {s.Top++s.data[s.Top] = v}}// 出战
func (s *SNode) Pop() int {if s.IsEmpty() {fmt.Println("栈空")return -1} else {tmp := s.data[s.Top]s.Top--return tmp}
}
func main() {s := NewSNode(5)s.Push(1)s.Push(2)s.Push(3)s.Push(4)fmt.Println(s.Pop())fmt.Println(s.Pop())fmt.Println(s.Pop())fmt.Println(s.IsEmpty())fmt.Println(s.IsFull())
}

在这里插入图片描述

2.2 链式栈

type SNode struct {data intNext *SNode
}var Stack *SNode
var PtrToSNode *SNode// 创建一个链式栈
func CreateSNode() *SNode {s := &SNode{data: -1}s.Next = nilreturn s
}// 栈空
func (s *SNode) IsEmpty() bool {return s.Next == nil
}// 入栈
func (s *SNode) Push(val int) {p := &SNode{data: val, Next: s.Next}s.Next = p
}
func (s *SNode) Pop() int {if s.IsEmpty() {fmt.Println("出栈失败")return -1}p := s.Nextvalue := p.datas.Next = p.Nextreturn value}func main() {s := CreateSNode()s.Push(1)s.Push(2)s.Push(3)s.Push(4)s.Push(5)fmt.Println(s.Pop())fmt.Println(s.Pop())fmt.Println(s.IsEmpty())
}

在这里插入图片描述

3.队列

在这里插入代码片

3.1 顺序队列

type Queue struct {data    []intrear    intfront   intMaxSize int
}// 生成一个队列
func CreateQueue(size int) *Queue {q := &Queue{data: make([]int, size), rear: 0, front: 0, MaxSize: size}return q
}// 判断队列为空
func (q *Queue) IsEmpty() bool {return q.front == q.rear
}// 判断队列是否满
func (q *Queue) IsFull() bool {return (q.rear+1)%q.MaxSize == q.front
}// 入队
func (q *Queue) Enqueue(value int) {if q.IsFull() {fmt.Println("Queue full")return}q.rear = (q.rear + 1) % q.MaxSizeq.data[q.rear] = value
}// 出对
func (q *Queue) Dequeue() int {if q.IsEmpty() {fmt.Println("Queue empty")return -1}q.front = (q.front + 1) % q.MaxSizereturn q.data[q.front]
}func main() {q := CreateQueue(5)q.Enqueue(1)q.Enqueue(2)q.Enqueue(3)fmt.Println(q.Dequeue())fmt.Println(q.Dequeue())fmt.Println(q.IsEmpty())fmt.Println(q.IsFull())}

在这里插入图片描述

3.2 链式队列

type LNode struct {data intnext *LNode
}
type QNode struct {rear    *LNodefront   *LNodemaxSize int
}func initQueue(maxSize int) *QNode {var q = &QNode{rear:    nil,front:   nil,maxSize: maxSize,}return q
}// 入队
func (q *QNode) Enqueue(data int) {s := &LNode{data: data, next: nil}if q.IsEmpty() {q.rear = sq.front = sreturn}q.rear.next = sq.rear = s}// 队空
func (q *QNode) IsEmpty() bool {return q.rear == nil
}// 出队
func (q *QNode) DeQueue() int {if q.IsEmpty() {fmt.Println("Queue is empty")return -1}s := q.frontif q.front == q.rear {q.rear = nilq.front = nil} else {q.front = q.front.next}return s.data
}
func main() {s := initQueue(5)s.Enqueue(1)s.Enqueue(2)s.Enqueue(3)fmt.Println(s.DeQueue())fmt.Println(s.DeQueue())fmt.Println(s.IsEmpty())
}

在这里插入图片描述

4.树

4.1 遍历造树

package mainimport ("fmt"
)type Node struct {Data   byteLChild *NodeRChild *Node
}func postOrder(root *Node) {if root == nil {return}postOrder(root.LChild)postOrder(root.RChild)fmt.Printf("%c", root.Data)}
func Search(num byte, in []byte, lens int) int {for i := 0; i < lens; i++ {if in[i] == num {return i}}return -1
}func msn(pre []byte, in []byte, len int) *Node {if len <= 0 {return nil}index := Search(pre[0], in, len)root := &Node{Data: pre[0], LChild: nil, RChild: nil}root.LChild = msn(pre[1:], in, index)root.RChild = msn(pre[index+1:], in[index+1:], len-index-1)return root
}func main() {pre := []byte{'a', 'b', 'd', 'f', 'e', 'c', 'g', 'h', 'i'}in := []byte{'d', 'b', 'e', 'f', 'a', 'g', 'h', 'c', 'i'}root := msn(pre, in, len(in))postOrder(root)
}

4.2 树打印

package mainimport "fmt"// 遍历树
// 生成一课树
// 确定一颗二叉树
type TNode struct {data        intLeft, Right *TNode
}func InorderTraversal(bt *TNode) {if bt != nil {InorderTraversal(bt.Left)fmt.Printf("%d ", bt.data)InorderTraversal(bt.Right)}
}
func PreorderTraversal(bt *TNode) {if bt != nil {fmt.Printf("%d ", bt.data)PreorderTraversal(bt.Left)PreorderTraversal(bt.Right)}}
func PostorderTraversal(bt *TNode) {if bt != nil {PostorderTraversal(bt.Left)PostorderTraversal(bt.Right)fmt.Printf("%d ", bt.data)}
}
func GetHeight(bt *TNode) int {if bt != nil {HL := GetHeight(bt.Left)HR := GetHeight(bt.Right)var h intif HL > HR {h = HL} else {h = HR}return h + 1}return 0
}type Queue struct {data    []*TNoderear    intfront   intMaxSize int
}// 生成一个队列
func CreateQueue(size int) *Queue {q := &Queue{data: make([]*TNode, size), rear: 0, front: 0, MaxSize: size}return q
}// 判断队列为空
func (q *Queue) IsEmpty() bool {return q.front == q.rear
}// 判断队列是否满
func (q *Queue) IsFull() bool {return (q.rear+1)%q.MaxSize == q.front
}// 入队
func (q *Queue) Enqueue(value *TNode) {if q.IsFull() {fmt.Println("Queue full")return}q.rear = (q.rear + 1) % q.MaxSizeq.data[q.rear] = value
}// 出对
func (q *Queue) Dequeue() *TNode {if q.IsEmpty() {fmt.Println("Queue empty")return nil}q.front = (q.front + 1) % q.MaxSizereturn q.data[q.front]
}
func LevelOrder(root *TNode) {q := CreateQueue(6)q.Enqueue(root)for !q.IsEmpty() {dequeue := q.Dequeue()fmt.Printf("%d ", dequeue.data)if dequeue.Left != nil {q.Enqueue(dequeue.Left)}if dequeue.Right != nil {q.Enqueue(dequeue.Right)}}
}type SNode struct {data    []*TNodeTop     intMaxSize int
}var Stack *SNode
var PtrToStack *SNodefunc NewSNode(MaxSize int) *SNode {return &SNode{data: make([]*TNode, MaxSize), Top: -1, MaxSize: MaxSize}
}// 判断堆栈是否空
func (s *SNode) IsEmpty() bool {return s.Top == -1
}// 判断堆栈是否为满
func (s *SNode) IsFull() bool {return s.Top == s.MaxSize-1
}// 压入堆栈
func (s *SNode) Push(v *TNode) {if s.IsFull() {fmt.Println("栈满")return} else {s.Top++s.data[s.Top] = v}}// 出战
func (s *SNode) Pop() *TNode {if s.IsEmpty() {fmt.Println("栈空")return nil} else {tmp := s.data[s.Top]s.Top--return tmp}
}func InOrderTraversalV2(BT *TNode) {T := BTs := NewSNode(6)for T != nil || !s.IsEmpty() {for T != nil {s.Push(T)T = T.Left}if !s.IsEmpty() {T = s.Pop()fmt.Printf("%d ", T.data)T = T.Right}}
}func PreOrderTraverSalV2(BT *TNode) {T := BTs := NewSNode(6)for T != nil || !s.IsEmpty() {for T != nil {fmt.Printf("%d ", T.data)s.Push(T)T = T.Left}if !s.IsEmpty() {T = s.Pop()T = T.Right}}
}
func PrintLevel(bt *TNode) {if bt != nil {if bt.Left == nil && bt.Right == nil {fmt.Printf("%d ", bt.data)}PrintLevel(bt.Left)PrintLevel(bt.Right)}
}
func main() {fmt.Println("hello world")BtRoot := TNode{data: 1, Left: nil, Right: nil}Bt1 := TNode{data: 2, Left: nil, Right: nil}Bt2 := TNode{data: 3, Left: nil, Right: nil}Bt3 := TNode{data: 4, Left: nil, Right: nil}Bt4 := TNode{data: 5, Left: nil, Right: nil}BtRoot.Left = &Bt1BtRoot.Right = &Bt2Bt2.Left = &Bt3Bt2.Right = &Bt4PreorderTraversal(&BtRoot)fmt.Println("")InorderTraversal(&BtRoot)fmt.Println("")////PostorderTraversal(&BtRoot)//fmt.Println("")//fmt.Println(GetHeight(&BtRoot))//fmt.Println("-----------")//LevelOrder(&BtRoot)fmt.Println("")PreOrderTraverSalV2(&BtRoot)fmt.Println("")InOrderTraversalV2(&BtRoot)fmt.Println("")PrintLevel(&BtRoot)
}

在这里插入图片描述

5.排序

5.1 冒泡/ 选择/插入/堆排序

func BubbleSort(arr []int) []int {for i := 0; i < len(arr)-1; i++ {for j := 0; j < len(arr)-i-1; j++ {if arr[j] > arr[j+1] {arr[j], arr[j+1] = arr[j+1], arr[j]}}}return arr
}
func InsertSort(arr []int) []int {i := 0for p := 1; p < len(arr); p++ {temp := arr[p]for i = p; i > 0 && arr[i-1] > temp; i-- {arr[i] = arr[i-1]}arr[i] = temp}return arr
}func SelectSort(arr []int) []int {for i := 0; i < len(arr); i++ {minValue := ifor j := i + 1; j < len(arr); j++ {if arr[minValue] > arr[j] {minValue = j}}arr[i], arr[minValue] = arr[minValue], arr[i]}return arr
}func PercDown(arr []int, p int, n int) {var child intvar parent intx := arr[p]for parent = p; parent*2+1 < n; parent = child {child = parent*2 + 1if child != n-1 && arr[child] < arr[child+1] {child++}if x >= arr[child] {break} else {arr[parent] = arr[child]}}arr[parent] = x
}
func HeapSort(arr []int, n int) {i := -1for i = n / 2; i >= 0; i-- {PercDown(arr, i, n)}for i = n - 1; i >= 0; i-- {arr[0], arr[i] = arr[i], arr[0]PercDown(arr, 0, i)}
}func main() {s := []int{1, 8, 3, 2}fmt.Println(s)//s = BubbleSort(s)//fmt.Println(s)//s = InsertSort(s)//fmt.Println(s)//s = SelectSort(s)//fmt.Println(s)//HeapSort(s, len(s))fmt.Println(s)

5.2 快速/归并排序

package mainimport "fmt"func Merge(arr []int, tmpA []int, L int, R int, RightEnd int) {LeftEnd := R - 1Tmp := LNumElements := RightEnd - L + 1for L <= LeftEnd && R <= RightEnd {if arr[L] <= arr[R] {tmpA[Tmp] = arr[L]Tmp++L++} else {tmpA[Tmp] = arr[R]Tmp++R++}}for L <= LeftEnd {tmpA[Tmp] = arr[L]L++Tmp++}for R <= RightEnd {tmpA[Tmp] = arr[R]R++Tmp++}for i := 0; i < NumElements; i++ {arr[RightEnd] = tmpA[RightEnd]RightEnd--}
}func MSort(arr []int, tmpA []int, L int, RightEnd int) {var Center intif L < RightEnd {Center = (L + RightEnd) / 2MSort(arr, tmpA, L, Center)MSort(arr, tmpA, Center+1, RightEnd)Merge(arr, tmpA, L, Center+1, RightEnd)}
}
func MergeSort(arr []int, n int) {tmpA := make([]int, n)MSort(arr, tmpA, 0, n-1)
}
func main() {a := []int{1, 8, 2, 4, 6, 5}fmt.Println(a)MergeSort(a, len(a))fmt.Println(a)
}//Merge非地柜版本
func Merge(A []int, tmpA []int, L int, R int, RightEnd int) {LeftEnd := R - 1Tmp := LNumElements := RightEnd - L + 1for L <= LeftEnd && R <= RightEnd {if A[L] <= A[R] {tmpA[Tmp] = A[L]Tmp++L++} else {tmpA[Tmp] = A[R]Tmp++R++}}for L <= LeftEnd {tmpA[Tmp] = A[L]Tmp++L++}for R <= RightEnd {tmpA[Tmp] = A[R]Tmp++R++}for i := 0; i < NumElements; i++ {A[RightEnd] = tmpA[RightEnd]RightEnd--}
}
func MergePass(A []int, tmpA []int, N int, length int) {var i intvar j intfor i = 0; i <= N-2*length; i += 2 * length {Merge(A, tmpA, i, i+length, i+length*2-1)}if i+length < N {Merge(A, tmpA, i, i+length, N-1)} else {for j = i; j < N; j++ {tmpA[j] = A[j]}}
}func MergeSort(A []int, N int) {length := 1tmpA := make([]int, N)for length < N {MergePass(A, tmpA, N, length)length *= 2MergePass(tmpA, A, N, length)length *= 2}
}
func main() {a := []int{1, 8, 3, 2}fmt.Println(a)MergeSort(a, len(a))fmt.Println(a)
}func InsertionSort(A []int, N int) {for P := 1; P < N; P++ {tmp := A[P]i := Pfor ; i > 0 && A[i-1] > tmp; i-- {A[i] = A[i-1]}A[i] = tmp}
}func Median(A []int, Left int, Right int) int {Center := (Left + Right) / 2if A[Left] > A[Center] {A[Left], A[Center] = A[Center], A[Left]}if A[Left] > A[Right] {A[Right], A[Left] = A[Right], A[Left]}if A[Center] > A[Right] {A[Center], A[Right] = A[Center], A[Center]}A[Center], A[Right-1] = A[Right-1], A[Center]return A[Right-1]
}// 快速排序
func QSort(A []int, left int, right int) {CutOff := 10if right-left > CutOff {Privot := Median(A, left, right)Low := leftHigh := right - 1for {for Low++; A[Low] < Privot; Low++ {}for High--; A[High] > Privot; High-- {}if Low < High {A[Low], A[High] = A[High], A[Low]} else {break}}A[Low], A[right-1] = A[right-1], A[Low]QSort(A, left, Low-1)QSort(A, Low+1, right)} else {InsertionSort(A[left:], right-left+1)}
}
func QuickSort(data []int, N int) {QSort(data, 0, N-1)
}
func main() {arr := []int{1, 8, 3, 2}fmt.Println(arr)QuickSort(arr, len(arr))fmt.Println(arr)
}

在这里插入图片描述

相关文章:

go数据结构学习笔记

本博文较为完整的实现了go的链表、栈&#xff0c;队列&#xff0c;树&#xff0c;排序&#xff0c;链表包括顺序链表&#xff0c;双向链表&#xff0c;循环链表&#xff0c;队列是循环队列&#xff0c;排序包含冒牌、选择 1.链表 1.1 顺序链表 type LNode struct {data intn…...

【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)

【后端开发】系统设计101——Devops&#xff0c;Git与CICD&#xff0c;云服务与云原生&#xff0c;Linux&#xff0c;安全性&#xff0c;案例研究&#xff08;30张图详解&#xff09; 文章目录 1、DevopsDevOps与SRE与平台工程的区别是什么&#xff1f;什么是k8s&#xff08;Ku…...

Google地图瓦片爬虫——进阶版

紧接上一篇——Google地图瓦片爬虫 clash节点自动切换 为了防止一个IP地址访问频率过快问题&#xff0c;自动切换clash的节点 def change_node(is_stop):while True:_r requests.get("http://127.0.0.1:11053/proxies", headersclash_headers, verifyFalse)# 这里…...

免费windows pdf编辑工具

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …...

解锁C#数据校验:从基础到实战的进阶之路

一、引言&#xff1a;数据校验为何如此重要&#xff1f; 在软件开发的广袤领域中&#xff0c;数据校验宛如一座坚固的堡垒&#xff0c;守护着系统的稳定与安全。它是确保数据质量的关键防线&#xff0c;能有效避免错误数据的流入&#xff0c;进而提升系统的整体性能和可靠性。…...

Redis的通用命令

⭐️前言⭐️ 本文主要介绍Redis的通用命令 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 &#x1f349;博客中涉及源码及博主日常练习代码均已上传GitHub &#x1f4cd;内容导…...

设计模式六大原则和单例模式

设计模式 目的 实现可重用解决方案&#xff0c;构筑易维护、可扩展的软件系统。 六大原则 单一职责&#xff1a; 类的职责单一&#xff0c;一个方法做一件事。 开闭原则&#xff1a; 拓展开放&#xff0c;修改关闭。 里氏替换&#xff1a; 父类能出现的地方&#xff0c;子…...

Redis性能优化

1.是否使用复杂度过高的命令 首先&#xff0c;第一步&#xff0c;你需要去查看一下 Redis 的慢日志&#xff08;slowlog&#xff09;。 Redis 提供了慢日志命令的统计功能&#xff0c;它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前&#xff0c;你需要设置慢…...

SAM 大模型杂谈

目录 1. 前言 2. 发展历程 3. SAM 大模型的技术架构 3.1 模型结构 3.2 训练方法 3.3 数据处理 4. SAM 大模型的应用领域 4.1 自然语言处理 4.2 计算机视觉 4.3 多模态学习 4.4 其他领域 5. SAM 大模型的优势与挑战 5.1 优势 5.2 挑战 6. SAM 大模型的未来发展方…...

openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…...

B站自研的第二代视频连麦系统(上)

导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面&#xff0c;介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解&#xff0c;帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中&#xff…...

【远程控制】安装虚拟显示器

todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是&#xff1a;支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…...

基于HAI部署DeepSeekR1的招标文书智能辅助生产开发与应用

一、前言 1.1行业背景 在日常商业活动中&#xff0c;招投标流程往往是企业竞标和项目落地的关键一环。其中&#xff0c;招标文书的编写工作对于投标企业极具挑战&#xff1a;既要保证逻辑清晰、条理分明&#xff0c;又必须遵循招标机构的各类格式规范&#xff0c;甚至还有特定…...

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…...

模拟实战-用CompletableFuture优化远程RPC调用

实战场景 这是广州某500-900人互联网厂的面试原题 手写并发优化解决思路 我们要调用对方的RPC接口&#xff0c;我们的RPC接口每调用一次对方都会阻塞50ms 但是我们的业务要批量调用RPC&#xff0c;例如我们要批量调用1k次&#xff0c;我们不可能在for循环里面写1k次远程调用…...

深入解析:Jsoup 库的多功能应用场景

Jsoup 是一个强大的 Java 库&#xff0c;主要用于解析和操作 HTML 文档。它不仅广泛应用于网络爬虫和数据抓取&#xff0c;还在网页内容分析、数据清洗与处理、自动化测试等多个领域有着广泛的应用。本文将详细介绍 Jsoup 库的多种用途&#xff0c;并提供具体的代码示例。 一、…...

Polardb三节点集群部署安装--附虚拟机

1. 架构 PolarDB-X 采用 Shared-nothing 与存储计算分离架构进行设计&#xff0c;系统由4个核心组件组成。 计算节点&#xff08;CN, Compute Node&#xff09; 计算节点是系统的入口&#xff0c;采用无状态设计&#xff0c;包括 SQL 解析器、优化器、执行器等模块。负责数据…...

Redis - 全局ID生成器 RedisIdWorker

文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中&#xff0c;生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...

【Vitest】单元测试

文章目录 测试&#xff1a;Vitest一、安装二、断言三、回调测试四、对象方法五、模拟第三库 测试&#xff1a;Vitest 一、安装 npm install vitest创建文件&#xff1a;example.test.ts 运行测试&#xff1a; npx vitest example二、断言 import { expect, test } from vi…...

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明基于脱机备份方式的单实例转主备流程图详细步骤说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建…...

策略模式实战:Spring中动态选择商品处理策略的实现

概念 可以在运行时期动态的选择需要的具体策略类&#xff0c;处理具体的问题 组成元素 策略接口 public interface GoodsStrategy {void handleGoods(); } 具体策略类 Service(Constants.BEAN_GOODS) public class BeanGoodsStrategy implements GoodsStrategy {Override…...

MS2691 全频段、多模导航、射频低噪声放大器芯片,应用于导航仪 双频测量仪

MS2691 全频段、多模导航、射频低噪声放大器芯片&#xff0c;应用于导航仪 双频测量仪 产品简述 MS2691 是一款具有 1164MHz  1615MHz 全频段、低功耗的低噪声放大器芯片。该芯片通过对外围电路的简单配置&#xff0c;使得频带具有宽带或窄带特性。支持不同频段的各种导…...

Imprompter: Tricking LLM Agents into Improper Tool Use

原文&#xff1a;Imprompter: Tricking LLM Agents into Improper Tool Use 代码&#xff1a;Reapor-Yurnero/imprompter: Codebase of https://arxiv.org/abs/2410.14923 实机演示&#xff1a;Imprompter 摘要&#xff1a; 新兴发展的Agent可以将LLM与外部资源工具相结合&a…...

WordZero:让Markdown与Word文档自由转换的Golang利器

在日常工作中&#xff0c;我们经常需要在Markdown和Word文档之间进行转换。Markdown方便编写和版本控制&#xff0c;而Word文档更适合正式的商务环境。作为一名Golang开发者&#xff0c;我开发了WordZero这个库&#xff0c;专门解决这个痛点。 项目背景 GitHub仓库&#xff1…...

C#中datagridview单元格value为{}大括号

使用数据库查询结果绑定datagridview数据源后&#xff0c;在对单元格的值进行处理的过程中出现报错&#xff0c;包括直接多cell.value.ToString()也报错&#xff0c;调试发现该单元格Value为“{}”&#xff0c;与null或""对比判断都没有结果&#xff0c;可使用Conver…...

FineReport模板认证找不到模板

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1.现象及排查过程2. 解决办法 1.现象及排查过程 FR模板认证下面找不到模板 由于是集群部署的FR&#xff0c;所以后台查看了sftp服务器&#xff0c;测试连接&#xff0c;连接成功。 但是…...

【Fiddler抓取手机数据包】

Fiddler抓取手机数据包的配置方法 确保电脑和手机在同一局域网 电脑和手机需连接同一Wi-Fi网络。可通过电脑命令行输入ipconfig查看电脑的本地IP地址&#xff08;IPv4地址&#xff09;&#xff0c;手机需能ping通该IP。 配置Fiddler允许远程连接 打开Fiddler&#xff0c;进入…...

Pycharm中添加不了新建的Conda环境(此篇专门给Daidai写的)

安装好了Conda之后&#xff0c;在系统终端也创建好Conda环境&#xff0c;一切显示正常&#xff0c;但在Pycharm中添加不了新建的Conda环境&#xff0c;显示“Conda executable is not found” 解决“Conda executable is not found” conda环境新建如下 D:/Programs/anacond…...

K8S认证|CKS题库+答案| 3. 默认网络策略

目录 3. 默认网络策略 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、官网找模板 3&#xff09;、按照题目要求创建networkpolicy 4&#xff09;、应用networkpolicy 5&#xff09;、检查策略 3. 默认网络策略…...

第1章_数据分析认知_知识点笔记

来自&#xff1a;数据分析自学课程-戴戴戴师兄 逐字稿&#xff1a;【课程4.0】第1章_分析认知_知识点笔记 【课程4.0】第1章 分析认知 知识点总结 数据分析的核心价值不是工具&#xff0c;而是用数据驱动业务增长。 一、数据分析的本质认知 数据分析是什么&#xff1f; 不是酷…...