《算法竞赛·快冲300题》每日一题:“矩阵”

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

质数拼图游戏” ,链接: http://oj.ecustacm.cn/problem.php?id=1814

题目描述

【题目描述】 给定两个nn的矩阵A和B,记C=AB(此处为矩阵乘法),存在m次询问。
   每次询问C中一个子矩阵中所有数字之和。
   每次询问给定a,b,c,d四个数字,表示所求子矩阵为第a行第b列到第c行第d列的子矩阵。
【输入格式】 输入第一行为n和m(1≤n≤2000,m≤50000)。
   接下来n行,每行n个数字表示矩阵A。
   再接下来n行,每行n个数字表示矩阵B。矩阵中每个数字不超过100。
   接下来m行,每行4个数字a,b,c,d表示询问的子矩阵,(1≤a,b,c,d≤n)。
   本题输入数据量大,建议使用快速读入。
【输出格式】 对于每组询问,输出一行,包含一个数字表示答案。
【输入样例】

3 2
1 9 8
3 2 0
1 8 3
9 8 4
0 5 15
1 9 6
1 1 3 3
2 3 1 2

【输出样例】

661
388

题解

   如果只要求询问一个给定矩阵的子矩阵数字之和,是一个很直白的前缀和应用。
为快速得到一个矩阵的任意子矩阵的和,可以用“二维前缀和”。定义二维数组s[][], s [ i ] [ j ] s[i][j] s[i][j]表示子矩阵 [ 1 , 1 ] [ i , j ] [1, 1] ~ [i, j] [1,1] [i,j]的和。预计算出s[][]后,可以快速计算出任意的子矩阵和。如下图所示,阴影子矩阵 [ i 1 , j 1 ] [ i 2 , j 2 ] [i_1, j_1] ~ [i_2, j_2] [i1,j1] [i2,j2]的和等于:
     s [ i 2 ] [ j 2 ] − s [ i 2 ] [ j 1 − 1 ] − s [ i 1 − 1 ] [ j 2 ] + s [ i 1 − 1 ] [ j 1 − 1 ] s[i_2][j_2] - s[i_2][j_1-1] - s[i_1-1][j_2] + s[i_1-1][j_1-1] s[i2][j2]s[i2][j11]s[i11][j2]+s[i11][j11]
  其中 s [ i 1 − 1 ] [ j 1 − 1 ] s[i_1-1][ j_1-1] s[i11][j11]被减了2次,需要加回来1次。
  用上述公式查询一次子矩阵和,计算量仅为O(1)。
在这里插入图片描述
  预计算一个矩阵A的所有s[][],计算量为 n 2 n^2 n2。代码这样写:

for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin >> A[i][j], s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+A[i][j];//预计算s[][]

  本题如果用上述方法,需要先求矩阵乘法C=A*B。但是矩阵乘法的计算量是 n 3 n^3 n3,而n≤2000,肯定超时,所以必须避免直接计算矩阵乘法。
  下面分析矩阵乘法C=A*B的计算过程,看能不能利用前缀和,从而减少计算量。下图画出了矩阵乘法的细节,求C中子矩阵(a, b) ~ (c, d)的和。
在这里插入图片描述
(1)计算C的第b列的区间和,即 C [ a ] [ b ] + C [ a + 1 ] [ b ] + . . . + C [ c ] [ b ] C[a][b] + C[a+1][b] + ... + C[c][b] C[a][b]+C[a+1][b]+...+C[c][b]
  先看C中第b列标’*’的 C [ a ] [ b ] C[a][b] C[a][b]的计算过程,它等于A第a行乘以B第b列:
     C [ a ] [ b ] = A [ a ] [ 1 ] × B [ 1 ] [ b ] + A [ a ] [ 2 ] × B [ 2 ] [ b ] + . . . + A [ a ] [ n ] × B [ n ] [ b ] C[a][b] = A[a][1]×B[1][b] + A[a][2]×B[2][b] + ... + A[a][n]×B[n][b] C[a][b]=A[a][1]×B[1][b]+A[a][2]×B[2][b]+...+A[a][n]×B[n][b]
  同理,C中第b列的其他坐标的计算过程是:
     C [ a + 1 ] [ b ] = A [ a + 1 ] [ 1 ] × B [ 1 ] [ b ] + A [ a + 1 ] [ 2 ] × B [ 2 ] [ b ] + . . . + A [ a + 1 ] [ n ] × B [ n ] [ b ] C[a+1][b] = A[a+1][1]×B[1][b] + A[a+1][2]×B[2][b] + ...+ A[a+1][n]×B[n][b] C[a+1][b]=A[a+1][1]×B[1][b]+A[a+1][2]×B[2][b]+...+A[a+1][n]×B[n][b]
    …
     C [ c ] [ b ] = A [ c ] [ 1 ] × B [ 1 ] [ b ] + A [ c ] [ 2 ] × B [ 2 ] [ b ] + . . . + A [ c ] [ n ] × B [ n ] [ b ] C[c][b] = A[c][1]×B[1][b] + A[c][2]×B[2][b] + ... +A[c][n]×B[n][b] C[c][b]=A[c][1]×B[1][b]+A[c][2]×B[2][b]+...+A[c][n]×B[n][b] (式3-1)
  把(式3-1)上下相加得C的子矩阵第b列的区间和:
     C [ a ] [ b ] + C [ a + 1 ] [ b ] + . . . + C [ c ] [ b ] C[a][b] + C[a+1][b] + ... + C[c][b] C[a][b]+C[a+1][b]+...+C[c][b]
     = ( A [ a ] [ 1 ] + A [ a + 1 ] [ 1 ] + . . . + A [ c ] [ 1 ] ) × B [ 1 ] [ b ] + = (A[a][1]+A[a+1][1] + ... + A[c][1])×B[1][b] + =(A[a][1]+A[a+1][1]+...+A[c][1])×B[1][b]+
     ( A [ a ] [ 2 ] + A [ a + 1 ] [ 2 ] + . . . + A [ c ] [ 2 ] ) × B [ 2 ] [ b ] + (A[a][2]+A[a+1][2] + ... + A[c][2])×B[2][b] + (A[a][2]+A[a+1][2]+...+A[c][2])×B[2][b]+
     …
     ( A [ a ] [ n ] + A [ a + 1 ] [ n ] + . . . + A [ c ] [ n ] ) × B [ n ] [ b ] (A[a][n]+A[a+1][n] + ... + A[c][n])×B[n][b] (A[a][n]+A[a+1][n]+...+A[c][n])×B[n][b] (式3-2)
  式中的 A[a][1]+A[a+1][1]+…+A[c][1]正好是A的第1列的区间和,A[a][2]+A[a+1][2]+…+A[c][2]是第2列的区间和,…,等等。
  记s1[][j]为A的第j列的前缀和,有:
     A [ a ] [ 1 ] + A [ a + 1 ] [ 1 ] + . . . + A [ c ] [ 1 ] = s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] A[a][1]+A[a+1][1]+...+A[c][1] = s1[c][1] - s1[a-1][1] A[a][1]+A[a+1][1]+...+A[c][1]=s1[c][1]s1[a1][1]
     A [ a ] [ 2 ] + A [ a + 1 ] [ 2 ] + . . . + A [ c ] [ 2 ] = s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] A[a][2]+A[a+1][2]+...+A[c][2] = s1[c][2] - s1[a-1][2] A[a][2]+A[a+1][2]+...+A[c][2]=s1[c][2]s1[a1][2]
    …
     A [ a ] [ n ] + A [ a + 1 ] [ n ] + . . . + A [ c ] [ n ] = s 1 [ c ] [ n ] − s 1 [ a − 1 ] [ n ] A[a][n]+A[a+1][n] + ... + A[c][n]=s1[c][n] - s1[a-1][n] A[a][n]+A[a+1][n]+...+A[c][n]=s1[c][n]s1[a1][n]
  则C的子矩阵第b列的区间和(式3-2)简化为:
     C [ a c ] [ b ] C[a~c][b] C[a c][b]
     = ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × B [ 1 ] [ b ] + ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × B [ 2 ] [ b ] + . . . + s 1 [ c ] [ n ] − s 1 [ a − 1 ] [ n ] × B [ n ] [ b ] = (s1[c][1] - s1[a-1][1])×B[1][b] + (s1[c][2] - s1[a-1][2])×B[2][b] + ...+s1[c][n] - s1[a-1][n]×B[n][b] =(s1[c][1]s1[a1][1])×B[1][b]+(s1[c][2]s1[a1][2])×B[2][b]+...+s1[c][n]s1[a1][n]×B[n][b]
(2)计算C的子矩阵的和,即把C的第b列、b+1列、…、d列相加。根据(1)的讨论,有:
     C [ a c ] [ b ] + C [ a c ] [ b + 1 ] + . . . + C [ a c ] [ d ] C[a~c][b] + C[a~c][b+1] + ... + C[a~c][d] C[a c][b]+C[a c][b+1]+...+C[a c][d]
     = ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × B [ 1 ] [ b ] + ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × B [ 2 ] [ b ] + . . . = (s1[c][1] - s1[a-1][1])×B[1][b] + (s1[c][2] - s1[a-1][2])×B[2][b] + ... =(s1[c][1]s1[a1][1])×B[1][b]+(s1[c][2]s1[a1][2])×B[2][b]+...
     ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × B [ 1 ] [ b + 1 ] + ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × B [ 2 ] [ b + 1 ] + . . . (s1[c][1] - s1[a-1][1])×B[1][b+1] + (s1[c][2] - s1[a-1][2])×B[2][b+1] + ... (s1[c][1]s1[a1][1])×B[1][b+1]+(s1[c][2]s1[a1][2])×B[2][b+1]+...
     ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × B [ 1 ] [ b + 2 ] + ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × B [ 2 ] [ b + 2 ] + . . . (s1[c][1] - s1[a-1][1])×B[1][b+2] + (s1[c][2] - s1[a-1][2])×B[2][b+2] + ... (s1[c][1]s1[a1][1])×B[1][b+2]+(s1[c][2]s1[a1][2])×B[2][b+2]+...
    …
     ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × B [ 1 ] [ d ] + ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × B [ 2 ] [ d ] + . . . (s1[c][1] - s1[a-1][1])×B[1][d] + (s1[c][2] - s1[a-1][2])×B[2][d] + ... (s1[c][1]s1[a1][1])×B[1][d]+(s1[c][2]s1[a1][2])×B[2][d]+... (式3-3)
  把(式3-3)上下相加,得:
     C [ a c ] [ b ] + C [ a c ] [ b + 1 ] + . . . + C [ a c ] [ d ] C[a~c][b] + C[a~c][b+1] + ... + C[a~c][d] C[a c][b]+C[a c][b+1]+...+C[a c][d]
     = ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × ( B [ 1 ] [ b ] + B [ 1 ] [ b + 1 ] + . . . + B [ 1 ] [ d ] ) + = (s1[c][1] - s1[a-1][1]) × (B[1][b]+B[1][b+1] + ...+ B[1][d]) + =(s1[c][1]s1[a1][1])×(B[1][b]+B[1][b+1]+...+B[1][d])+
     ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × ( B [ 2 ] [ b ] + B [ 2 ] [ b + 1 ] + . . . + B [ 2 ] [ d ] ) + (s1[c][2] - s1[a-1][2]) × (B[2][b]+B[2][b+1] + ... + B[2][d]) + (s1[c][2]s1[a1][2])×(B[2][b]+B[2][b+1]+...+B[2][d])+
    …
     ( s 1 [ c ] [ n ] − s 1 [ a − 1 ] [ n ] ) × ( B [ n ] [ b ] + B [ n ] [ b + 1 ] + . . . + B [ n ] [ d ] ) (s1[c][n] - s1[a-1][n]) × (B[n][b]+B[n][b+1] + ... + B[n][d]) (s1[c][n]s1[a1][n])×(B[n][b]+B[n][b+1]+...+B[n][d]) (式3-4)
  记s2[i][]为B的第i行的前缀和,有:
     B [ 1 ] [ b ] + B [ 1 ] [ b + 1 ] + . . . + B [ 1 ] [ d ] = s 2 [ 1 ] [ d ] − s 2 [ 1 ] [ b − 1 ] B[1][b]+B[1][b+1] + ...+ B[1][d] = s2[1][d] - s2[1][b-1] B[1][b]+B[1][b+1]+...+B[1][d]=s2[1][d]s2[1][b1]
     B [ 2 ] [ b ] + B [ 2 ] [ b + 1 ] + . . . + B [ 2 ] [ d ] = s 2 [ 2 ] [ d ] − s 2 [ 2 ] [ b − 1 ] B[2][b]+B[2][b+1] + ...+ B[2][d] = s2[2][d] - s2[2][b-1] B[2][b]+B[2][b+1]+...+B[2][d]=s2[2][d]s2[2][b1]
    …
     B [ n ] [ b ] + B [ n ] [ b + 1 ] + . . . + B [ n ] [ d ] = s 2 [ n ] [ d ] − s 2 [ n ] [ b − 1 ] B[n][b]+B[n][b+1] + ... + B[n][d]=s2[n][d] - s2[n][b-1] B[n][b]+B[n][b+1]+...+B[n][d]=s2[n][d]s2[n][b1]
  则(式3-4)改写为:
     C [ a c ] [ b ] + C [ a c ] [ b + 1 ] + . . . + C [ a c ] [ d ] C[a~c][b] + C[a~c][b+1] + ... + C[a~c][d] C[a c][b]+C[a c][b+1]+...+C[a c][d]
     = ( s 1 [ c ] [ 1 ] − s 1 [ a − 1 ] [ 1 ] ) × ( s 2 [ 1 ] [ d ] − s 2 [ 1 ] [ b − 1 ] ) + = (s1[c][1] - s1[a-1][1]) × ( s2[1][d] - s2[1][b-1]) + =(s1[c][1]s1[a1][1])×(s2[1][d]s2[1][b1])+
     ( s 1 [ c ] [ 2 ] − s 1 [ a − 1 ] [ 2 ] ) × ( s 2 [ 2 ] [ d ] − s 2 [ 2 ] [ b − 1 ] ) + (s1[c][2] - s1[a-1][2]) × ( s2[2][d] - s2[2][b-1]) + (s1[c][2]s1[a1][2])×(s2[2][d]s2[2][b1])+
    …
     ( s 1 [ c ] [ n ] − s 1 [ a − 1 ] [ n ] ) × ( s 2 [ n ] [ d ] − s 2 [ n ] [ b − 1 ] ) (s1[c][n] - s1[a-1][n]) × ( s2[n][d] - s2[n][b-1]) (s1[c][n]s1[a1][n])×(s2[n][d]s2[n][b1])
  这是最后的式子,每一行是两个区间和的乘法,共n行,有n次乘法计算。
  总计算量是多少?(1)预计算s1[][]和s2[][],是 O ( n 2 ) O(n^2) O(n2)的;(2)查询m次子矩阵和,每次有n次乘法计算,是 O ( m n ) O(mn) O(mn)的;(3)总计算量等于 O ( n 2 ) + O ( m n ) O(n^2) + O(mn) O(n2)+O(mn),刚好通过测试。

【重点】 前缀和,矩阵计算 。

C++代码

   题目中提到“本题输入数据量大,建议使用快速读入”。
   C++的标准输入输出函数是cin/cout、scanf/printf,在默认情况下,cin/cout比scanf/printf慢得多。在需要大量输入输出的场合,一般用scanf、printf就可以。如果还要提高速度,输入用getchar(),输出用putchar(),它们更快。
   自己写一个快读函数read(),用到getchar()。getchar()的功能是读1 byte的数据,按char类型读入。下面代码中的read()是整数输入的快读模板,用getchar()读入每个字符,然后转成数字。例如输入“245”,用getchar()分3次读入‘2’、‘4’、‘5’,然后组合成数字“345”。注意可能有负数,所以需要判断‘-’号。
   自己写一个快写函数write(),用到putchar()。putchar()的功能是输出一个字符,当需要输出一个数时,把它的每一位转成字符,然后用putchar()输出。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2010;
int n,m,a,b,c,d;
int A[N][N],B[N][N],s1[N][N],s2[N][N];
inline int read(int &x) {         //快读int型整数。如果需要读long long,把int改成long longx = 0;int w = 1;//w:判断正负号char ch = 0;while (ch < '0' || ch > '9') { //读字符if (ch == '-') w = -1;     //这是一个负整数数ch = getchar();            //读一个字符}while (ch >= '0' && ch <= '9') { //读数字x = x * 10 + (ch - '0');ch = getchar();}return x = x * w;
}
void write(ll x) {                //快写long long型整数if (x < 0) {                  // 判断正负。如果是负数,输出负号putchar('-');      
x = -x;                   //记得把负数变正,方便下面输出数字         }if (x > 9) write(x / 10);     // 递归,将除最后一位外的其他部分放到递归中输出putchar(x % 10 + '0');        // 已经输出(递归)完 x 末位前的所有数字,输出末位
}
ll query(int a,int b,int c,int d){     //C=A*B,计算C的子矩阵和ll ans = 0;for(int k=1;k<=n;k++){ll ans1 = s1[c][k] - s1[a-1][k];ll ans2 = s2[k][d] - s2[k][b-1];ans += ans1*ans2;}return ans;
}
int main(){read(n),read(m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)read(A[i][j]), s1[i][j] = s1[i-1][j]+A[i][j];   //输入A。s1[][j]是第j列的前缀和//read(A[i][j])等于scanf("%d",&A[i][j])或cin>>A[i][j]for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)read(B[i][j]), s2[i][j] = s2[i][j-1]+B[i][j];   //输入B。s2[i][]是第i行的前缀和while(m--){read(a),read(b),read(c),read(d);  //等于scanf("%d%d%d%d",&a,&b,&c,&d);if(a > c) swap(a, c);             //可能存在a>c、b>d的情况if(b > d) swap(b, d);ll ans = query(a,b,c,d);write(ans); putchar('\n');       //等于printf("%lld\n",query(a,b,c,d));}return 0;
}

Java代码

import java.util.*;  
import java.io.*; 
class Main {static FastReader scanner = new FastReader();static int N = 2010;static int n, m, a, b, c, d;static int[][] A = new int[N][N], B = new int[N][N], s1 = new int[N][N], s2 = new int[N][N];public static void main(String[] args) throws IOException {n = scanner.nextInt();m = scanner.nextInt(); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {A[i][j] = scanner.nextInt();;s1[i][j] = s1[i - 1][j] + A[i][j];} for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {B[i][j] = scanner.nextInt();;s2[i][j] = s2[i][j - 1] + B[i][j];} while (m-- > 0) {a = scanner.nextInt();b = scanner.nextInt();c = scanner.nextInt();d = scanner.nextInt();if (a > c) { int temp = a;  a = c;  c = temp;  }if (b > d) { int temp = b;  b = d;  d = temp;  }long ans = query(a, b, c, d);System.out.println(ans);} } static long query(int a, int b, int c, int d) {long ans = 0;for (int k = 1; k <= n; k++) {long ans1 = s1[c][k] - s1[a - 1][k];long ans2 = s2[k][d] - s2[k][b - 1];ans += ans1 * ans2;}return ans;} static class FastReader {BufferedReader br;StringTokenizer st;  public FastReader() {br = new BufferedReader(new InputStreamReader(System.in));}  String next() {while (st == null || !st.hasMoreElements()) {try {st = new StringTokenizer(br.readLine());} catch (IOException e) { e.printStackTrace(); }}return st.nextToken();}  int nextInt() {     return Integer.parseInt(next());    }  long nextLong() {   return Long.parseLong(next());      }  double nextDouble() { return Double.parseDouble(next());     }  String nextLine() {String str = "";try { str = br.readLine();  } catch (IOException e) {  e.printStackTrace();   }return str;}}
}

Python代码

  

#pypy
import sys
input = sys.stdin.readline
def query(a, b, c, d):ans = 0for k in range(1, n+1):ans1 = s1[c][k] - s1[a-1][k]ans2 = s2[k][d] - s2[k][b-1]ans += ans1 * ans2return ans
n, m = list(map(int, input().split()))
N = n+1
s1 = [[0] * N for _ in range(N)]
s2 = [[0] * N for _ in range(N)]
A = [0] * N
B = [0] * N 
for i in range(1, n+1):A[i] = [0] + list(map(int, input().split()))for j in range(1, n+1):  s1[i][j] = s1[i-1][j] + A[i][j]   
for i in range(1, n+1):B[i] = [0] + list(map(int, input().split()))for j in range(1, n+1):  s2[i][j] = s2[i][j-1] + B[i][j]     
for _ in range(m):a, b, c, d = list(map(int, input().split()))if a > c:   a, c = c, aif b > d:   b, d = d, bsys.stdout.write(str(query(a, b, c, d)) + '\n')

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

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

相关文章

YOLOv5如何训练自己的数据集

文章目录 前言1、数据标注说明2、定义自己模型文件3、训练模型4、参考文献 前言 本文主要介绍如何利用YOLOv5训练自己的数据集 1、数据标注说明 以生活垃圾数据集为例子 生活垃圾数据集&#xff08;YOLO版&#xff09;点击这里直接下载本文生活垃圾数据集 生活垃圾数据集组成&…

005:vue2使用vue-type-writer实现打字机效果

Vue Type Writer是一个Vue.js 2打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。 文章目录 1. 效果2. 安装使用 1. 效果 2. 安装使用 npm 安装 npm install vue-type-writer --save完整代码 <template><div class"app-container home"><…

面向使用者的git与gerrit相关笔记

git与gerrit相关笔记 前言一、gerrit是什么&#xff1f;二、一些配置1.先配置全局email 和name2.gerrit配置ssh key3.可能遇到的问题 三、提交代码和合并冲突常用Git命令三件套严格的要求 总结 前言 本文是介绍什么是gerrit和工作中git与gerrit相关的命令来避免一些提交代码的…

JavaScript中的代理对象(proxy)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建代理对象⭐ 使用代理对象⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友…

负载均衡 —— SpringCloud Netflix Ribbon

Ribbon 简介 Ribbon 是 Netfix 客户端的负载均衡器&#xff0c;可对 HTTP 和 TCP 客户端的行为进行控制。为 Ribbon 配置服务提供者地址后&#xff0c;Ribbon 就可以基于某种负载均衡算法自动帮助服务消费者去请求。Ribbon 默认提供了很多负载均衡算法&#xff0c;例如轮询、随…

leetcode:2446. 判断两个事件是否存在冲突(python3解法)

难度&#xff1a;简单 给你两个字符串数组 event1 和 event2 &#xff0c;表示发生在同一天的两个闭区间时间段事件&#xff0c;其中&#xff1a; event1 [startTime1, endTime1] 且event2 [startTime2, endTime2] 事件的时间为有效的 24 小时制且按 HH:MM 格式给出。 当两个…

使用 PyTorch 的计算机视觉简介 (5/6)

一、说明 本文主要介绍CNN中在pytorch的实现&#xff0c;其中VGG16网络&#xff0c;数据集来源&#xff0c;以及训练过程&#xff0c;模型生成和存储&#xff0c;模型调入等。 二、预训练模型和迁移学习 训练 CNN 可能需要大量时间&#xff0c;并且该任务需要大量数据。但是&am…

python随手小练3

题目&#xff1a; 写出一个判断闰年的python代码&#xff1a; 闰年的条件&#xff1a; 如果N能够被4整除&#xff0c;并且不能被100整除&#xff0c;则是闰年 或者&#xff1a;N能被400整除&#xff0c;也是闰年 即&#xff1a;4年一润并且百年不润&#xff0c;每400年再润一…

Verilog 不同编码风格对综合电路的影响

文章目录 示例 #1示例 #2示例 #3 Verilog是一种硬件描述语言&#xff08;HDL&#xff09;&#xff0c;用于设计数字电路和系统。统一、良好的代码编写风格&#xff0c;可以提高代码的可维护性和可读性。 同样的功能&#xff0c;不同的Verilog 编码风格也会对综合过程产生重大影…

安全远程访问工具

什么是安全远程访问 安全远程访问是指一种 IT 安全策略&#xff0c;允许对企业网络、任务关键型系统或任何机密数据进行授权、受控访问。它使 IT 团队能够根据员工和第三方的角色和工作职责为其提供不同级别的访问权限&#xff0c;安全的远程访问方法可保护系统和应用程序&…

软件设计模式系列之十三——享元模式

1 模式的定义 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它旨在减少内存占用或计算开销&#xff0c;通过共享大量细粒度对象来提高系统的性能。这种模式适用于存在大量相似对象实例&#xff0c;但它们的状态可以外部化&#xff08;e…

Android滑动片段

本文所有的代码均存于 https://github.com/MADMAX110/BitsandPizzas 回到BitsandPizzas应用&#xff0c;之前已经创建过创建订单和发出反馈等功能。 修改披萨应用&#xff0c;让它使用标签页导航。在工具条下显示一组标签页&#xff0c;每个选项对应一个不同的标签页。用户单击…

ThreeJS-3D教学一基础场景创建

Three.js 是一个开源的 JS 3D 图形库&#xff0c;用于创建和展示高性能、交互式的 3D 图形场景。它建立在 WebGL 技术之上&#xff0c;并提供了丰富的功能和工具&#xff0c;使开发者可以轻松地构建令人惊叹的 3D 可视化效果。 Three.js 提供了一套完整的工具和 API&#xff0…

知识图谱:信息抽取简易流程

目录 一、标注训练数据 二、训练数据模型 三、实现NER 一、标注训练数据 使用工具:Brat ## BRAT安装 0、安装条件 (1)运行于Linux系统 (2)brat(v1.3p1)仅支持python2版本运行使用,否则会报错 File "standalone.py", line 257except SystemExit, sts:^Syn…

c++中关于Thread Affinity(线程亲和性)示例源码

win10下&#xff0c;可以在任务管理器里面设置某个进程的线程亲和性,如下图: 然后选择相关的cpu&#xff0c;如下图&#xff1a; 这么做可以使得相关的线程在某些密集型计算任务中只会运行在某些指定的cpu上&#xff0c;以便提高性能。 以下是windwos上c程序中应用Thread Affi…

Python 运行代码

一、Python运行代码 可以使用三种方式运行Python&#xff0c;如下&#xff1a; 1、交互式 通过命令行窗口进入 Python 并开始在交互式解释器中开始编写 Python 代码 2、命令行脚本 可以把代码放到文件中&#xff0c;通过python 文件名.py命令执行代码&#xff0c;如下&#xff…

使用 LangChain 和 Elasticsearch 对私人数据进行人工智能搜索

关于本博文的所有代码可以在地址下载&#xff1a;GitHub - liu-xiao-guo/python-vector-private 我将在本博文中其中深入研究人工智能和向量嵌入的深水区。 ChatGPT 令人大开眼界&#xff0c;但有一个主要问题。 这是一个封闭的托管系统。 在一个被大型网络公司改变的世界里生…

【轨道机器人】成功驱动伺服电机(学生电源、DCH调试软件、DH系列伺服驱动器)

1、硬件平台 工控机 学生电源 DH系列伺服驱动器 电机 调试平台&#xff1a;DCH 2、如何利用dch驱动电机 点击可驱动电机 下面的步骤是比较关键的几步&#xff1a; 3、遇到的问题 不能成功驱动电机&#xff0c;还和厂家那边打电话&#xff0c;询问 发现是这…

【C++】bitset位图的简单模拟实现及常见面试题

文章目录 前言一、 bitset模拟实现二、 常见面试题1.给你一百亿个整数&#xff0c;找到只出现一次的数字2. 给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 前言 快速查找某个数据是否在一个集合中排序 去重…

Hdoop伪分布式集群搭建

文章目录 Hadoop安装部署前言1.环境2.步骤3.效果图 具体步骤&#xff08;一&#xff09;前期准备&#xff08;1&#xff09;ping外网&#xff08;2&#xff09;配置主机名&#xff08;3&#xff09;配置时钟同步&#xff08;4&#xff09;关闭防火墙 &#xff08;二&#xff09…