9章【同余】

news2025/1/19 3:00:04

蒙特卡罗算法【和一个模型联系起来】
舍伍德算法【】
拉斯维加斯算法【最不靠谱,思路:把该算法和固有算法相结合】

随机数

学习目标:
利用数据序列的随机性和概率 分布等点,设计解决问题的算法或提高 已有算法的效率
随机性 (randomness)
某一事件集合中的各个事件所表现出来的不确定性。可能遵循某个概率分布。
随机序列 (random sequence)/ 随机变量序列:
如果用 X 1, X 2 ……X n代表随机变量,这些随机变量如果按照顺序出现,就形成了随机序列。
(1) 序列中的每个变量都是随机的;
(2) 序列本身就是随机的。
对产生随机数的数学方法要求:
(1) 产生的数列具有随机样本的统计学性质
(2) 产生的数列要有足够的周期
(3) 产生数列要速度快,占用计算机内存少

线性同余法

(1) 同余:
a, b, m 为整数, m 0 ,若 a-b m的整数倍,则称a b关于模m 同余;记为 a≡b(mod m)
(2) 同余式满足 :
反射性( reflection , 即a  ≡ a ( mod n )
对称性( symmetry ,即由 a ≡ b ( mod n ), 可得 b  ≡ a ( mod n )
传递性( transitivity),即由 a ≡ b ( mod n ), b ≡ c ( mod n ), 可得a ≡ c ( mod n )
(3) 剩余类 :对于 正整数 n ,把全体整数按 n 余数分成 n 类,
每一类数的全体称为模 n 的一个剩余类(或称同余类)。
(4) 完全剩余系:
在模 n的每一个剩余类中各取一个元素,则这 n 个数就组成模 n的一个完全剩余系。
在完全剩余系中,每个成员对于模 n 的余数不同
(5) 缩剩余系:
在任意一个模 n 的完全剩余系,仅保留 n互素的那些数(共φ (n)个数,其中,φ(n)为欧拉函数),则这φ (n) 个数组成模 n的一个缩剩余系(或称既约剩余系、简化剩余系,简称缩系)。
(6) 欧拉函数: 正整数 n 欧拉 函数是小于或等于 n的正整数中与 n 互质 的数的数目 , 因此 φ(1)=1

(7)线性同余发生器(Linear Congruence Generator, LCG)

\begin{Bmatrix} a_0=d & \\ an=(ba_{n-1}+c)mod m & n=1,2... \end{}

d是初始值【种子】

统一术语:an-1是乘数,c是增量,m是模数

当d不变时,产生的数列永远不变;结果可预测
其中, b≥0, c ≥0, m 0, d≤m m, c 互质, m为机器所能取得的大数

LCG(线性同余发生器)改善

【例9-1】 用线性同余法生成一个随机序列。

计算模型:

选择系统时间作为种子,令b=1194211693Lc=12345L,m=2147483647(2^31-1),则有

 系统函数:

srand(time(NULL));

rand()

算法设计与描述
输入:种子值
输出:伪随机序列

//伪随机序列

const unsigned long b = 1194211693L;
const unsigned long c = 12345L;
static unsigned long rand_seed;

void mysrand(unsigned long seed)
{
    rand_seed = seed;
}
long myrand()
{
    rand_seed = (rand_seed * b + c) % ((1 << 31) - 1);//左移相当于×2
    return rand_seed;
}

double myrandf()
{
    return (double)rand_seed / ((1 << 31) - 1);
}

int main()
{
    int i;
    mysrand(time(0));//time(0)是种子数 
    srand(time(0));//系统函数 
    for (i = 0; i < 50; i++)
    {
        myrand();
        cout<<"rand_seed:" << rand_seed;//或者是cout<<myrand(); 
        cout <<"\tmyrandf():"<< myrandf();
        cout<<"\trand():"<<(double)rand()/RAND_MAX<<endl; 
    }
    return 0;
}
 

代码:

 #include<iostream>
#include<math.h>
#include<ctime>
#include<cstdlib>
using namespace std;
//伪随机序列

const unsigned long b = 1194211693L;
const unsigned long c = 12345L;
static unsigned long rand_seed;

void mysrand(unsigned long seed)
{
	rand_seed = seed;
}
long myrand()
{
	rand_seed = (rand_seed * b + c) % ((1 << 31) - 1);//左移相当于×2
	return rand_seed;
}

double myrandf()
{
	return (double)rand_seed / ((1 << 31) - 1);
}

int main()
{
	int i;
	mysrand(time(0));//time(0)是种子数 
	srand(time(0));//系统函数 
	for (i = 0; i < 50; i++)
	{
		myrand();
		cout<<"rand_seed:" << rand_seed;//或者是cout<<myrand(); 
		cout <<"\tmyrandf():"<< myrandf();
		cout<<"\trand():"<<(double)rand()/RAND_MAX<<endl; 
	}
	return 0;
}

蒙特卡罗算法(Monte CarloMC)

它将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的解。

时间: 20世纪40年代美国在第二次世界大战

项目:研制原子弹的“曼哈顿计划”

作者:S.M.乌拉姆和J.·诺伊曼

命名:数学家冯·诺伊曼用驰名世界的赌城—摩纳哥的Monte Carlo

起源:1777年,法国数学家布丰(Georges Louis Leclere de Buffon1707—1788)提出用投针实验的方法求圆周率π

统计模拟蒙特卡罗算(MC

1.数值计算

【例9-2】 利用随机函数计算圆周率π:

可能得不到正确结果 1.随机数符合概率(正态分布)2.点数足够(样本量足够多)

精度不高 

(1) 数学模型:

n根飞镖随机投向一正方形的靶子,计算落入此正方形的内切圆中的飞镖数目k

假定飞镖击中方形靶子任一点的概率相等。

设圆的半径为r,圆的面积s_1=πr^2 , 正方形面积s_2=4r^2

由随机序列均匀分布的假设可知落入圆中的飞镖和正方形内的飞镖平均比为:k:n=πr^2:4r^2

由此可知:π=4k/n

取单位圆,取第一象限,则有长方形:0<=x<=1,0<=y<=1;圆形:x2+y2<=1

(2) 算法描述:

Step 1: 设定总点数

Step 2: 取随机数x, y

Step 3: 判断x2+y2<=1,是则圆点数加1

Step 4: 判断所取点数达到总点数,是,计算π值,否,重复执行step 2.

(3) 算法分析:O(n)

代码:

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;


int main()
{
	int n;//随机数个数=所有点数 
	int inside=0;//位于圆中的点数 
	double x,y;
	
	cout<<"输入随机数的个数:";
	cin>>n;
	
	srand((unsigned int)time(NULL)) ; //初始化种子数 
	for(int i=0;i!=n;i++)
	{
		x=rand()*1.0/RAND_MAX;
		y=rand()*1.0/RAND_MAX;
		if(x*x+y*y<=1)
			inside++;
	}
	printf("%6.5lf",4.0*inside/n);
	system("PAUSE>NUL");
	
	return 0;
} 

【例9-3

f(x) [0,1] 上连续函数,且 0 ≤ f(x) ≤ 1。需要计 算的积分为 ,积分值等于图中的面积G

(1) 数学模型

单位正方形内均匀地作投点试验,则随机点落在曲线下面 的概率为:

假设向单位正方形内随机地投入 n 个点 (xi, yi)
如果有 m 点落入 G 内, 则随机点落入 G 内的概率 m/n≈Pr

(2) 算法分析:

n 个点,判断其在 G 中的个数,时间复杂 O(n)

算法设计与描述
输入:投射的点数n
输出:面积G

void getG()
{
    int n;//随机数个数=所有点数 
    double x,y,m=0;
    
    cout<<"输入随机数的个数:";
    cin>>n;
    
    srand((unsigned int)time(NULL)) ; //初始化种子数 
    
    for(int i=0;i!=n;i++)
    {
        x=rand()*1.0/RAND_MAX;
        y=rand()*1.0/RAND_MAX;
        if(y<=f(x))
            m=m+1;
    }
    printf("f(x)面积=%6.5lf",m/n);
    system("PAUSE>NUL");
    

 

PS:

MC算法在一般情况下可以保证对问题的所有实例都以高概率给出正确解,但是通常无法判定一个具体的解是否正确

p正确(p-correct)

设如果一个MC算法对于问题的任一 实例得到正确解释的概率不小于pp是一个实数,且 1/2≤p1,称MC算法是p正确的,且称p - 1/2是该算法 的优势

【一致的(consistent)

如果对于同一实例,蒙特卡罗算法不会给出2不同的正确解答。

【偏真】

MC(x)是解某个判定问题D的蒙特卡罗算法,当MC(x)返回true时解总是正确的,仅当它返回false时有可能产生错误的解,称为偏真,反之为偏假

偏真-说真就是真,说假可能是假。

偏假-说假就是假,说真可能是真。

【例9-4】素数测试:判断给定整数是否为素数。

梅森Mersenne 2^p1(p为素数)

算法1:穷举

模型:
(1) n mod i ==0;
(2) 穷举范围为 2 ~ n^( 1/2)  。//根号n
时间复杂度:
O(n^( 1/2) );
n m 10 进制数, 则为 O(10^( m/2) )
实现:
int prime( int n)
{
        for(i=2; i<= n^(1/2) ; i++)
                if(n mod i == 0)
                        return 0;
        return 1;
}

算法2:取2~n^(1/2)随机数,判断其是否为n的因子

模型:
(1)d=random(2, n^( 1/2) );
(2) n mod d ==0
时间复杂度: O(1)
实现:
int prime( int n)
{
        d=random(2, sqrt(n));
        if(n mod d== 0) return 0;
        return 1;
}
分析: 找到 n 的非平凡因子, n 为合数,算法完全正确,偏假
例: n=61*43, 根号n ≈51, prime 2~51内随机选一整数 d
成功: d=43 ,算法返回 false(概率为2%) ,结果正确。
失败: d≠43 ,算法返回 true( 概率98%),结果错误

算法3

问题分析

(1)Wilson定理:充要条件

对于给定的正整数 n, 判定 n 是一个素数的充要条件 (n-1)!≡ -1(mod n)
//(n-1)!和n互质 
//n的完全剩余系的相乘 和n互质
证明:取集合 A={1, 2, 3, …… n-1}: A 构成 n 完全剩余系
i A,存在 j A ,使得: (i*j)≡1(mod n) ,则对于A中不能两两配对的成员x
考虑 x 2 ≡1(mod n) ->  x^ 2 -1≡0(mod n) ->  (x-1)(x+1) ≡0(mod n)
解得 x≡1(mod n) x≡n-1(mod n)
其余两两配对:故而 (n-1)! ≡1*(n-1) ≡-1(mod n)

 (2) Fermat小定理:——必要条件,非充分

 341 符合 但是合数 2^340 mod 341 =1 ,341=11*31

Fermat小定理是必要条件
  满足 Fermat 小定理而不是素数的合数叫 Carmichael

10亿个自然数中素数50847534个, Carmichael5597

运用Fermat小定理出错的几率为0.00011

【引理 1 】若 a,b,c 为任意 3 个整数 ,m 为正整数,且 (m,c)=1 ,则当 a·c≡b·c(mod m) 时,
a≡b(mod m)
证明: a·c≡b·c(mod m) 可得 ac–bc≡0(mod m) 可得 (a-b)·c≡0(mod m) 。因为 (m,c)=1
m,c 互质, c 可以约去, a– b≡0(mod m) 可得 a≡b(mod m)
【引理 2 】设 m 是一个 整数 m>1 b 是一个 整数 (m,b)=1 。如果
a1,a2,a3,a4,…am 是模 m 的一个完全剩余系,则
b·a1,b·a2,b·a3,b·a4,…b·am 也构成模 m 的一个完全剩余系。
证明 : 若存在 2 个整数 b·ai b·aj 同余即 b·ai≡b·aj(mod m)..(i>=1 && j>=1)
根据引理 1 则有 a[i]≡a[j](mod m) 。根据完全剩余系的 定义 可知这是不可能
的,因此不存在 2 整数 b·a[i] b·a[j] 同余。

问题分析
(1)Wilson 定理: 对于给定的正整数 n, 判定 n 是一个素数的充要条件是 (n-1)!≡ -1(mod n) 。【n-1的阶乘 和n互质】
(2) Fermat 小定理: 如果 n 是一个素数 , (0<a<n), a^( n-1) ≡1(mod n)  //这个数可能很大
(3) 利用 Fermat 小定理构造快速判断素数方法
二次探测定理 : 如果 n 是一个素数 , 0<a<n, 则方程 a*a ≡1(mod n) 的解为 a=1, n-1
a*a % n = 1   
(a-1)*(a+1) % n = 0
因此 a=1或n-1
它是F小定理的一个特例
二次探测定理的应用:若 a≠1 a≠n-1 ,则必为合数。

偏假算法【说假就是假,说真不一定是真】

(3) 利用 Fermat 小定理构造快速判断素数方法

计算模型: 

计算模型

a=Random(2, n-1)  //从2~n-1中随机取一个数
令m=n-1
d=a^2 mod n if m mod 2==0
d=(a*(a^2 mod n)) mod n if m mod 2==1
若d==1且 a<>1 and a<>n-1,则n是合数

(4)算法设计

算法实现:
int power(unsigned int a,unsigned int b,unsigned int n)
{
	unsigned int y=1,m=b,z=a;
	while(m>0)
	{
		while(m%2==0)
		{
			//此时是偶数 
			int x=z;
			z=z*z%n;
			m=m/2;
			if( (z==1)&&(x!=1)&&(x!=(n-1)))//判断是否为合数 
				return 1;
		}
		m--;
		//此时是奇数 
		y=y*z%n;
	}
	if(y==1)
		return 0;
	return 1;
}
int prime(unsigned int n)
{
	int i,a;
	srand(time(NULL));
	for(i=1;i<log(n)/log(10) ;i++)
	{
		a=rand()%n;
		if(power(a,n-1,n))
			return 0;
	}
} 

 
算法分析:

代码:

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<math.h> 
//#include<random>
using namespace std;
//算法1:穷举 
int primeQiongJu(int n )
{
	//从2到根号n 
	for(int i=2;i<=sqrt(n);i++)
	{
		if(n%i==0)return 0;//合数 
	}
	return 1;//素数 
}

//算法2:随机数 ——多试几次,会提高正确率 
int random01(int x,int y)
{
	srand(time(NULL));
	int z=rand()%(y-x)+x;
	
	
	return z;
}
int primeSuiJi(int n)
{
//	int d=random(2,sqrt(n));//编译器不支持

	int d=random01(2,sqrt(n));//从2-根n中随机取一个数 
	if(n%d==0)
		return 0;//非素数 
	return 1;
} 

//03F费尔玛小定理
int power(unsigned int a,unsigned int b,unsigned int n)
{
	//a是随机数 n-1 n 
	//初始化
	unsigned int y=1,m=b,z=a,x ;
	//m是指数 
	while(m>0)
	{
		while(m%2==0)//偶数 
		{
			x=z;
			z=z*z%n;
			m=m/2;
			//判断 x是否为合数
			if( (z==1)&&(x!=1)&&(x!=(n-1)) ) 
				return 1;//合数 
		}
		m--;
		y=y*z%n;// 
		 
	}
	//退出时 m<=0
	if(y==1)
		return 0;//素数 
	else return 1;//合数 
}

int primeF(int n)
{
	int a; 
	//种子数
	srand(time(NULL));
	//为了提高正确率,根据n的位数
	//多运行log10(n)次算法 
	for(int i=1;i<log10(n);i++)
	{
		a=rand()%n;// 0-(n-1)
		if(power(a,n-1,n))
			return 0;//合数 
	} 
	return 1;//素数 
} 


int main()
{
	int n=53;
	if(primeQiongJu(n))
	{
		cout<<"01.穷举:"<<n<<"is prime"<<endl;
	}
	if(primeSuiJi(n))
	{
		cout<<"02.随机数:"<<n<<"is prime"<<endl;
	}
	if(primeF(n))
	{
		cout<<"03.随机数:"<<n<<"is prime"<<endl;
	}
	
	return 0;
} 
  

舍伍德算法

Sherwood 基本思想
A 是一个确定性算法,当它的输入实例为 x时所需的计算时间记为 T A (x)
X n 是算法 A 所有输入规模为 n的实例的全体,
则当问题的输入规模为 n 时,算法A所需的平均时间为

 

【例9-5】设A是含有n个元素的集合,从A中选出第k小的元素,其中1≤k≤n

快速排序分析
最坏情况:
T(1)=θ(1), T(n)=T(n-1)+T(1)+θ(n) ->  O(n^ 2 )
序且每次都取第一个元素,每次都分为 1 元素和 n-1 个元素
最好情况:
T(1)=θ(1) , T(n)=2T(n/2)+θ(n) ->  O(nlogn),每次都恰好二分
平均情况: O(nlogn)
查找第 k 小元素的时间复杂度至少: O(n)

计算模型:

(1) 数列存储于数组 a 中,下标从 0 开始;
(2)pivot=a[left + rand() % (right - left)], j=right, 一趟快排后,
则有以下三个结论。
j-left=k-1 ,则分界数据就是选择问题的答案。
j-left>k-1 ,则选择问题的答案继续在左子集中找,问
题规模变小了。
j-left<k-1 ,则选择问题的答案继续在右子集中找,问
题变为选择第 k-left-1 小的数,问题的规模也变小。
算法设计与描述
输入:数列a[n] 和k 值
输出 :第k小元素

#include<iostream>
using namespace std;

int select(int a[],int left,int right,int k)
{
    int i,j,pivot,t;
    
    if(left>=right)//结束递归 
        return a[left];
    
    i=left;
    j=left+rand()%(right-left);
    swap(a[i],a[j]);
    pivot=a[left];
    j=right+1;
    while(true)
    {
        while(a[++i]<pivot);
        while(a[--j]>pivot);
        if(i>=j)break;
        t=a[i];a[i]=a[j];a[j]=t;
    }
    if(j-left+1==k)return pivot;
    a[left]=a[j];
    a[j]=pivot;
    if(k<(j-left+1))select(a,left,j-1,k);
    else select(a,j+1,right,k-j-1+left);
    
}

int main()
{
    
}

代码:
#include<iostream>
#include<ctime> 
#include<cstdlib>
using namespace std;

int select(int a[],int left,int right,int k)
{
	int i,j,pivot,t;
	
	if(left>=right)//结束递归 
		return a[left];
	
	i=left;
	j=left+rand()%(right-left);
	swap(a[i],a[j]);
	pivot=a[left];
	j=right+1;
	while(true)
	{
		while(a[++i]<pivot);
		while(a[--j]>pivot);
		if(i>=j)break;
		t=a[i];a[i]=a[j];a[j]=t;
	}
	if(j-left+1==k)return pivot;
	a[left]=a[j];
	a[j]=pivot;
	if(k<(j-left+1))select(a,left,j-1,k);
	else select(a,j+1,right,k-j-1+left);
	
}

int main()
{
	int a[]={1,2,3,4,5,6,7,8,9};
	int k=3;
	cout<<select(a,0,8,3);
	 
}

拉斯维加斯算法

随机生成答案并检测 拉斯维加斯算法
算法思想[应用范畴]: 用随机序列代替有规律的枚举,判断枚举随机结果是否正确。
特征: 得到的解都是正确的,但是有时找不到解。求得正确解的概率也依赖于算法所用的时间。
原理: 通常采用 bool 型方法来表示拉斯维加斯算法。当算法
找到一个解时返回 true ,否则 false 。当返回 false 时,说明未得
到解,那么可再次独立调用该算法,在时间允许的情况一直
运算到出解为止。

【例9-6n皇后问题

问题分析:
对于 n 皇后问题的任何一个解而言,每一个皇后 在棋盘上的位置无任可规律,不具有系统性,像是随机放置 的。适合 Las Vegas
模型:
(1) 数据结构: try[1]~try[8] 存放摆放列坐标, (i, try[i]) 表示存放位置;//i是行,try[i]是列
(2) 为第 i 行选取位置: try[i]=Random(1,8);
(3) 检测:当 try[i]≠try[k] and abs(try[i]- try[k])≠abs(i-k) ,位置正确
算法设计:
(1) 选取位置 try[i]=random(1,8)
(2) 检测位置是否正确 check(try, i) ,正确转步骤 (3) ,不正确 且未足 1000 次,转 (1);
(3) i=8 输出正确结果, i ≠8 且大于 1000 次,无解。
时间复杂度: O(n^ 2 )
算法实现:
代码:正确率太低了
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
//n皇后问题
int check(int a[],int n)
{
	int i;
	for(i=1;i<n;i++)
	{
		//位于对角线 或者 位于同一列 
		if(abs(a[i]-a[n])==abs(i-n) || (a[i]==a[n]))
			return 0;//该种选择不成立 
	}
	return 1; 
} 
//
int lv(int ty[])
{
	int i;
	srand(time(NULL));
	for(i=1;i<=8;i++)
	{
		ty[i]=rand()%8+1;//从1到8
		if(!check(ty,i)) 
			return 0;//不成立 
	}
	return 1;
}

void queens()
{
	int ty[9]={0};//存储列坐标
	int success=0;
	int n=0;
	int i;
	while(!success && n<1000000 )
	{
		success=lv(ty);
		if(success)
		{
			cout<<"success:"<<n<<endl;
			for(i=1;i<=8;i++)
				cout<<ty[i]<<"\t";
			cout<<endl;
			success=0;
		}
		n++;
		for(i=1;i<=8;i++)
		{
			ty[i]=0;
		}
//		cout<<endl<<"n="<<n;
	} 
	
}
int main()
{
	queens();
	return 0;
} 
算法改进: 先在棋盘中随机放置若干 行,后继算法用回溯,随机放置皇后 越多,回溯时间越少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

swagger报错Illegal DefaultValue null for parameter type integer

文章目录 报错:作者说这只是一个警告并不是个错误,并且有点烦躁的说已经是提的1000个issues了解决给Integer类型或者long类型的example设置值,不设置也不行(不建议)有时候参数很多,很麻烦.或者不用处理方法一:修改AbstractSerializableParameter类的日志级别为Error方法二:修改…

【数据结构】线性表(二)单链表及其基本操作(创建、插入、删除、修改、遍历打印)

目录 前文、线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表&#xff08;C语言&#xff09; a. 链表节点结构 b. 创建新节点 c. 在链表末尾插入新节点 d. 删除指定节点 e. 修改指定节点的数据 f. …

循环日程安排问题(分治法)

函数接口定义&#xff1a; void Plan(int a[][N],int k); 裁判测试程序样例&#xff1a; #include #include <math.h> #include using namespace std; #define N 100 void Plan(int a[][N],int k); int main() { int i,j,a[N][N],k,size; cin>>k; sizepow(2,k)…

“滑动窗口”算法专项训练

目录 题目链接&#xff1a;长度最小的子数组 题目描述 思路分析&#xff1a;滑动窗口(利用单调性&#xff0c;使用"同向双指针来优化) 细节处理 画图解析 代码 题目链接&#xff1a;最大连续1的个数 III 题目描述 思路分析&#xff1a;滑动窗口(同向双指针) 细节…

面对纷繁复杂的低代码和无代码产品,开发者该如何选择?

凭借着革命性的生产力优势&#xff0c;低代码技术火爆了整个IT圈。面对纷繁复杂的低代码和无代码产品&#xff0c;开发者该如何选择&#xff1f; 在研究低代码平台的年数上&#xff0c;本人已有3年&#xff0c;也算是个低代码资深用户了&#xff0c;很多企业面临低代码选型上的…

TCP/IP(二十)TCP 实战抓包分析(四)TCP 第二次握手 SYN、ACK 丢包

一 实验二&#xff1a;TCP 第二次握手 SYN、ACK 丢包 重点&#xff1a; 通过设置 tcp_synack_retries 和 tcp_syn_retries内核参数,观察丢包的现象 ① 实验环境 iptables -t filter -I INPUT -s 172.25.2.100 -j DROPtcpdump -nni ens3 tcp and host 172.25.2.100 and por…

【算法 | 位运算No.1】leetcode268. 丢失的数字

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

打造一个开箱即用的超级丝滑的漂亮hexo博客网站

打造一个开箱即用的超级丝滑的漂亮hexo博客网站 目录 文章目录 打造一个开箱即用的超级丝滑的漂亮hexo博客网站目录文章持续更新地址鸣谢hexo简介hexo优缺点优点缺点&#x1f44e; 没有后台管理 博客效果主题特性版本迭代1.原版版本迭代2.自己版本迭代 贡献者主题下载&#x1f…

Python中if __name__ == ‘__main__‘

1. 在Python中&#xff0c;凡是以两个下划线开头&#xff0c;两个下划线结尾的变量叫做“魔法变量”。瓦特&#xff1f;魔法变量&#xff1f;对&#xff0c;你没有听错&#xff0c;就是魔法变量。所谓魔法变量就是Python对象内置天生就有的属性变量&#xff0c;你使用这些变量前…

开关电源测试方案介绍:如何进行电源耐压测试?

耐压测试是检验电源模块、电器设备等承受过压能力的测试方法&#xff0c;同时电源模块耐压测试还可以检测出设备的绝缘性能。在电气设备的使用过程中会出现电压突然上升的情况&#xff0c;有时也会因为天气原因出现高压&#xff0c;如果耐压性能弱&#xff0c;设备绝缘能力差&a…

【Java学习之道】SQL语言的基本语法与操作

引言 对于初学者来说&#xff0c;数据库编程可能听起来有些复杂&#xff0c;但实际上&#xff0c;只要掌握了SQL语言的基本语法和操作&#xff0c;你就能够轻松地处理各种数据问题。本章将为你揭示SQL语言的魅力&#xff0c;帮助你快速入门数据库编程。 一、SQL语言简介 SQL…

Three.js柏林噪音 流动球体

代码&#xff1a;https://gitee.com/honbingitee/three-template-next.js/tree/shader/ 参考油管视频&#xff1a;https://www.youtube.com/watch?voKbCaj1J6EI 核心&#xff1a; 创建循环的图形 应用噪声 顶点按照法相偏移 CustomMaterial(): ShaderMaterial {const material…

轻松上手,制作电子期刊就这么简单

嗨&#xff0c;年轻的朋友们&#xff01;你是否想过用你的创意和热情来制作一本属于自己的电子期刊&#xff1f;现在&#xff0c;这个梦想已经触手可及&#xff01;只需要用到这款工具即可轻松上手&#xff0c;就能拥有自己的电子期刊 工具&#xff1a;FLBOOK在线制作电子杂志平…

工具类app变现难?工具类产品广告变现策略实用指南

工具类app面临着买量成本高&#xff0c;收益提升难 的困境&#xff0c;在不同的变现周期可以采用不同的变现策略。#APP广告变现# 1、合理挖掘变现场景&#xff0c;提升eCPM 工具类 App 可基于自身产品属性和用户使用习惯路径&#xff0c;相应地选择开屏广告、信息流、横幅、…

品牌线上布局思路有哪些,品牌策略分析!

电商运营是现代企业宣推和销售产品的重要方式之一。要让品牌产品在电商节点&#xff0c;实现流量获取&#xff0c;就必须制定详细有效的品牌策略。今天为大家带来品牌线上布局思路有哪些&#xff0c;品牌策略分析&#xff01; 不同于线下销售广告&#xff0c;针对电商平台&…

浅谈压力测试的重要目标及意义

随着互联网应用的快速发展&#xff0c;软件系统的稳定性和性能成为了用户和企业关注的焦点。用户期望应用程序能够在高负载下依然保持稳定和高效。为了满足这一需求&#xff0c;压力测试成为了不可或缺的一环。本文将探讨压力测试的重要性以及如何进行压力测试。 一、压力测试的…

[正式学习java③]——字符串在内存中的存储方式、为什么字符串不可变、字符串的拼接原理,键盘录入的小细节。

一、字符串 1.字符串在内存中的存储方式 &#x1f525;在java中&#xff0c;内存中有两个地方可以存储字符串&#xff0c;一个是字符串池&#xff0c;一个是堆内存&#xff0c;串池中的字符串不会重复&#xff0c;而堆中的字符串每次都会开辟一块新的空间&#xff0c;因为维护…

Python武器库开发-基础篇(三)

基础篇(三) 函数 下面是一个打印问候语的简单函数&#xff0c;名为greet_user() &#xff1a; greeter.py def greet_user():"""显示简单的问候语"""print("Hello!")greet_user()这个示例演示了最简单的函数结构。第一行的代码行使…

优雅而高效的JavaScript——防抖和节流

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;优雅而高效的JavaScript——防抖和节流 文章核心 引言事件处理的性能问题防抖&#xff1a;延迟触发事件基本原理实现防抖的代码示例实际应用场景举例 节流&#xff1a;限制事件触发频率基本原理实现…

传输层协议(TCP/UDP协议)

全文目录 端口号端口号范围划分 传输层UDP协议特点基于UDP的应用层协议 TCP协议确认应答机制&#xff08;可靠性&#xff09;延迟应答机制超时重传机制流量控制连接管理机制TIME_WAIT 状态CLOSE_WAIT 状态拥塞控制滑动窗口 TCP、UDP对比TCP的listen第二个参数 端口号 在套接字…