Gin框架
GoWeb官方包net/http提供了基础的路由函数组合和功能函数,无需API
package main
import (...)
func echo(wr http.ResponseWriter, r *http.Request) {
msg, err := ioutil.ReadAll(r.Body)
if err != nil {
wr.Write([]byte("echo error"))
return
}
writeLen, err := wr.Write(msg)
if err != nil || writeLen != len(msg) {
log.Println(err, "write len:", writeLen)
}
}
func main() {
http.HandleFunc("/", echo)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.F ...
并行数据结构-p-tree
并行数据结构并行数据结构的几个概念
non-blocking
一个线程被挂起或中断不会导致其他线程执行被block
lock-free
保证整个系统的执行进度是不断推进的
wait-free
保证每个线程的执行进度是不断推进的
通常需要做到lock-free,不要求wait-free(较难实现,性能较差)
lock-free:
auto expected = x.load();
do {
bool ok = x.compare_exchange_strong(expected, new_value);
} while(!ok)
//compare_exchange_strong 解释。
// if true, 则x和expected相等,使用new_value替换x的值
//if false, 则x和expected不相等,并expected会被修改成x的值
(否则需要spin lock)
仅仅使用串行数据结构+锁远远不能达到要求(还可能导致死锁)
涉及的数据结构
CSDS(并行查找数据结构)
链表,跳表,哈希表
主要实现:查找,插入,删除
查找:遍历
插入删除, ...
CGO
CGO在Go中调用C的代码//include "xxx.h"
import "C"
C.puts(helloworld)
.h文件中声明函数,.c/.cpp文件对应函数的定义
import “C”前面的注释即为要运行的C代码
默认C,如果需要用C++(cpp文件),要声明:
#include <iostream>
export "C"{
#include <xxx.h>
}
Go生成C函数
通过使用extern "C",可以确保函数在C链接下可用,从而允许从C代码中调用它,而不会受到C++名称重整的影响。
//export funct
func funct (){
...
}
...
func main(){
C.funct()
}
使用go重新实现C语言函数。
go函数C.CSstring()将字符串转化为(const)char*
上述函数运行过程:
Go的main函数执行,到CGO自动生成的C语言版本的funct桥接函数,回到GO中的funct函数。
C语言可以调用GO生成的函数,CGO省的”_cgi_export.h”包含了导出后的 ...
Golang基础知识
golangmap实现:哈希查找表,通过链表法解决哈希冲突
随机遍历,顺序无法预测
扩容特点:逐步进行,新,旧bucket
遍历中出现扩容
遍历前已经开始扩容
slice底层结构:本质上是引用类型,底层结构有三个变量:len,cap,底层数组的指针
空切片时,cap=len=0
一般初始化方式a:=[]int{}cap=len=初始化长度
使用make进行初始化:a:=make([]int,4,5):cap=5,len=4,a为[0,0,0,0]
var a []int默认cap=len=0
append操作
cap足够,直接修改len,追加
cap不足时…
cap足够时,一次追加多个和多次追加一个结果相同,cap不足时会出现不一样的结果(cap的结果不同,多次追加一个的情况可能会更大)
切片截取操作:
切片进行截取时,数组容量的末尾和原切片数组末尾对齐,数组地址为截取单元的首地址,且可以超过其len的范围进行截取,当其中一个数组发生扩容时,另一个数组的地址不变
切片扩容时会改变:cap和数字指针
垃圾回收
引用计数,0回收,无法处理 循环引用
标记-清除: 需要S ...
AI algorithms
贝叶斯网络,k-means 和transformer
PART1手写数字识别本部分通过贝叶斯网络实现手写数字的识别
实验内容
fit函数
Pixels中每一行代表一个图像,每一列代表一个像素值。Labels是一个形状为(n_samples,)的向量,其中每个元素都是相应图像的类标签。
该方法通过计算每个类别的先验概率和给定每个类别的每个像素值的条件概率,将模型与数据拟合。它使用类的两个属性:self.labels_prior 和 self.pixels_cond_label。前者是一个形状为(n_classes,)的向量,用于存储每个类别的先验概率。后者是一个形状为(n_pixels, n_values, n_classes)的矩阵,存储了给定每个类别的每个像素值的条件概率。该方法通过计算数据中每个类别和每个像素值的频率并除以适当的分母来更新这些属性。
def fit(self, pixels, labels):
n_samples = len(labels)
for label in labels:
self.labels_prior[label] + ...
智能合约
实验目的
理解以太坊上的智能合约
开发实现简单的智能合约
部署以太坊上的智能合约
实验原理智能合约是一种特殊协议,在区块链内制定合约时使用,当中内含了代码函数 (Function),亦能与其他合约进行交互、做决策、存储资料及发送以太币等功能。智能合约主力提供验证及执行合约内所订立的条件。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。
在以太坊上,智能合约是一个运行在以太坊链上的程序。 它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。
智能合约也是一个以太坊帐户,即合约帐户。 这意味着它们有余额,可以成为交易的对象。 但是,它们无法被人操控,它们是被部署在网络上作为程序运行着。 个人用户可以通过提交交易执行智能合约的某一个函数来与智能合约进行交互。 智能合约能像常规合约一样定义规则,并通过代码自动强制执行。 默认情况下,您无法删除智能合约,与它们的交互是不可逆的.以太坊上的智能合约基本生命周期可以分为开发、编译、部署和运行。
实验内容编写投票合约本实验实现了简单的投票合约示例,即VotingContract,基本结构为:
Option表 ...
代数结构习题课-2
2023spring代数结构习题课讲义
第二次习题课知识整理环的定义(验证$$是否是环)
$$是交换群
$$是含幺半群(封闭性,结合律,乘法单位元)
乘法对加法有左右分配律
交换环:乘法具有交换律
负元:加法逆元,一定存在
可逆元:乘法逆元存在时,称为可逆元
运算:$a\cdot 0=0\cdot a=0,a\cdot(-b)=(-a)\cdot b=-(a\cdot b),(-a)\cdot (-b)=a\cdot b$
特殊的环:
数环,R,C,Q
自同态环: $$是交换群,$E=\{f|f:G\rightarrow G是同态映射\}$,在E上定义运算:
(f+g)(x)=f(x)+g(x)\\
(f\cdot g)(x)=f(x)\cdot g(x)此时$$为环,交换群G上的自同态环。
模n同余类环$<\Z_n,+,\cdot>$
[i]+[j]=[i+j]\\
[i]\cdot[j]=[i\cdot j]
整环和域
零因子,左(右)零因子:$a\in R,\exist b,a\cdot b=0(b\cdot a=0)$
无零因子 当且仅当 ...
Astar&CSP
Astar and CSP Question实验1.1实验目的使用A-star算法,解决$N\times N$二进制迷锁问题。
实验内容启发式函数
在本实验中,选用启发式函数$h(x)=\frac13\sum$(1的个数)。在实际搜索中,可以根据当前状态计算下一步的1的个数,无需重新遍历数组进行计算
admissible:每次操作时,对3个位置进行翻转,因此可能存在的最优解为$\sum (d_{ij}==1)/3$向上取整,$h(x)\leq h*(x)$
consistent:该启发函数是consistent的,因为两个相邻节点之间$c(m,n)\geq${m中1的个数和n中1的个数的差}/3,$h(n)-h(m)=h(n-m)$,因此$h(n)\leq c(n,m)+h(m)$
思路
借助数组data[][]存储当前的图的情况,step存储当前的步数,solution存储当前的解法,其中solution每一行分别存储每一步的x,y坐标和以该点为中心的四种转法;
使用存储受限的启发式搜索,并限制深度,每次递归搜索,使用priority queue存储每次搜索时探索的节点,其中 ...
UTXO区块链
PART1实验目的
了解区块链上的简单数据结构
实现Merkle树的构建
初步理解UTXO的使用和验证
理解比特币上的交易创建
实验内容区块链的基本结构type BlockChain struct{
tip []byte//最新区块的哈希值
db *bolt.DB//数据库连接
}
区块链通过链式结构连接各个区块,形成一个不断增长的分布式账本系统。
区块的基本结构作为区块链的主要组成部分,区块由区块头和区块体构成,区块头存储了版本号,上一个区块的哈希值,当前区块交易的哈希值,时间戳等信息,唯一标识一个区块。
type BlkHeader struct {
Version int64
PrevBlockHash []byte
MerkleRoot []byte
Timestamp int64
Bits int64
Nonce int64
}
实验步骤Merkle树每一个区块的交易节点从底向上构建Merkle树,采用哈希加密(单次sha256)。
新建Merkle节点,分为叶子节点和非叶子节点
fu ...
代数结构习题课-1
2023spring代数结构习题课讲义
代数结构 第一次习题课2023.5.3
第三章 映射内容回顾
映射的基本定义
概念:映射,原像,像,值域,映射相等
给定集合A,B,从A到B的映射有$|B|^{|A|}$个
特殊映射:对于$f:A\rightarrow B$:
$B=A,\forall a,f(a)=a$:恒等映射
$R_f=B$:满射
任给$a_1,a_2\in A,a_1\neq a_2\Rightarrow f(a_1)\neq f(a_2)$:单射
单射+满射:一一映射(双射) 相关性质:$f^{-1}$,$n!$个双射
映射的复合:$g\circ f(a)=g(f(a))$ 从右往左计算
结合律:$(h\circ g)\circ f=h\circ (g\circ f)$
$f^{-1}\circ f=f\circ f^{-1}=I_A$
复合运算保持单射/满射/双射
置换:映射到自身的双射
恒等映射也可以称为恒等置换
求逆置换:交换两行并按照第一行排序
奇置换与偶置换:由逆序的个数奇偶决定
轮换:特殊的置换,$\sigma=(a_1a_2…a_r)$
不 ...
加密算法
实验目的
理解非对称加密算法
理解椭圆曲线算法ECC
实现比特币上的椭圆曲线secp256k1算法
ECC算法流程ECC算法中,陷门函数是定义在有限域上的二元三次曲线y^2^=x^3^+ax+b上的点所组成的阿贝尔群。
公钥:点Q
私钥:大数k
ECC算法是有限域Fp满足公式:Q=kP。
签名过程:
取一个新的随机数k,令$k*G\equiv R\ mod \ N$
计算S:
uG + vP = R = kG \\
uG + veG = kG\\
u + ve = k \\
z/s + re/s = k\\
(z + re)/s = k\\
s = (z + re)/k
返回签名:signature(s,r)
签名的数字为(s,r)
验签过程:
计算u,v
计算uG+vP
判断(uG+vp).x是否和r模N同余,如果是,则签名成功
实验内容ECC签名func (ecc *MyECC) Sign(msg []byte, secKey *big.Int) (*Signature, error) {
k,err :=newRand()
if ...