C++算法1

一维前缀和

1
2
3
4
5
6
7
8
9
//现有数组
a={a[0],a[1],a[2]....a[n]};

s[0]=a[0];
s[1]=a[0]+a[1];
s[2]=a[0]+a[1]+a[2]
.........
//s[]为a[]的前缀和数组

程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
int main(){

int a[10];
int s[10];

//输入数组
for(int i=0;i<10;i++){
cin>>a[i];
}

//求一维前缀和
s[0]=a[0];
for(int j=0;j<10;j++){
s[j]=s[j-1]+a[j];
}

//输出一维前缀和
for(int k=0;k<10;k++){
cout<<s[k]<<" ";
}
return 0;
}

二维前缀和

  • 使用s[i,j]来代表a[i,j]左上方的所有元素的和,那么它可以表示为s[i,j]=s[i,j-1]+s[i-1,j]-s[i-1,j-1]+a[i,j]
    代码展示
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    //二维前缀和
    #include<iostream>
    using namespace std;

    #define N 500
    #define M 500

    int main(){
    int a[N][M];
    int i,j;
    int s[N][M];
    //输入数组
    for(i=1;i<=3;i++){
    for(j=1;j<=4;j++){
    cin>>a[i][j];
    }
    }

    //求二维前缀和
    for(i=1;i<=3;i++){
    for(j=1;j<=4;j++){
    s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
    cout<<s[i][j]<<" ";
    }
    cout<<endl;
    }
    return 0;
    }

求最大公约数及最小公倍数

  1. 辗转相除法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int zhanzhuanchugcd(int a, int b)
    {
    if(a%b==0){
    return b;
    }
    else{
    return zhanzhuangcd(b,a%b);
    }
    }
    //保证a>b
    //判断a%b=0
  2. 辗转相减法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int zhanzhuanjiangcd(int a,int b)
    {
    while(a!=b){
    if(a>b){
    a=a-b;
    }
    else{
    b=b-a;
    }
    }
    return b;
    }
    //判断 a==b
  3. 穷举法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int qiongju(int a,int b)
    {
    int temp =0;
    temp = a>b?b:a;
    for(;;temp--){
    if(a%temp==0&&b%temp==0)
    break;
    }
    return temp;
    }
  4. 最小公倍数 = a*b/gcd(a,b)

PS-把长方形图片改为正方形图片

步骤

  • 要在PS中打开图片;

  • 图像 –》画布大小,把高度和宽度设置成一样的参数,并可以修改背景色,确定;

  • 选择裁剪工具,按住shift键,就可以剪出一个正方形了。

补充
在这个过程中,可能会遇到一个问题,在设置画布的高度和宽度的时候,画布扩展的背景色无法选择,这就会造成画布扩展的那部分是透明的。

图层 –》新建

  1. 第二项是 背景图层,那此时画布扩展颜色是可以选择的。
  2. 第二项是 图层背景,那此时画布扩展颜色是不可以选择的,只需点击一下,此时画布扩展颜色就可以选择了。

面向高考历史科目试题的自动答题系统

面向高考历史科目试题的自动答题系统

基本信息

  • 论文:面向高考历史科目试题的自动答题系统
  • 年份:2022
  • 期刊:中文信息学报
  • 分级:CCF-B

研究背景

  • 研究问题:考试自动答题任务是指利用标准化考试环境对问答系统进行测试。本文针对我国高考历史科目部分,构建能够作答高考历史试题的自动答题系统。

  • 任务描述:历史高考试题包含选择题和简答题两种题型,简答题除了问题之外,还带有一段与问题相关的文字材料。本文针对选择题和简答题,分别构建了答题系统。

  • 数据集:高考历史科目真题数据集GH577
    Taking up the Gaokao Challenge: An Information Retrieval Approach

相关工作

  • 世界历史选择题任务
  1. Overview of the NTCIR-11 QA-Lab Task
  2. Overview of Todai Robot Project and Evaluation Framework of its NLP-based Problem Solving
  3. CMU Multiple-choice Question Answering System at NTCIR-11 QA-Lab

系统模型

该自动答题系统包含三个模块:检索模块,阅读理解模块,集成模块
整体框架如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JevYQp14-1682482167083)(:/38d35334032742038f5bb8f61299364f)]

  • 检索模块
    作用:从知识语料库中检索相关文本知识使用BM25算法计算检索词与文本知识之间的匹配度。

  • 阅读理解模块
    作用:融合题目和阅读文档的信息,评估各候选答案的正确性,计算候选答案的分数。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svRqWFRc-1682482167085)(:/31a9f41ad15847d690e27ada73b17f42)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EYll9Aqc-1682482167086)(:/576e84505a434bd7a66073b1367d836d)]

  • 集成模块
    作用:集成模块的作用是使阅读理解模块对各候选答案的分数与检索模块输出的检索匹配度互相补充,从而得到最终的候选答案概率。

实验结果

作者做了三个方面的实验:

  1. 自动答题系统在真题与测试卷上的实验结果

  2. 自动答题系统在在GH577上的实验结果

  3. 自动答题的消融实验分析

结论

本文构建了高考历史科目自动答题系统,实验结果表明,设计的答题系统是有效的。但是,该答题系统在某些方面,存在不足,例如多模态、多语言类问题,多步推理问题。

个人理解,如有错误,烦请纠正!

原文链接

海明校验码

海明校验码

奇偶检验

  • 奇检验:判断序列中1的个数是否为偶数,是的话在序列前添加1,否的话在序列前添加0
  • 偶检验:判断序列中1的个数是否为奇数,是的话在序列前添加1,否的话在序列前添加0
  • 举例:1111的奇检验为11111,偶检验为01111

海明检验码的检验过程

下面以序列1010为例阐述其过程
首先通过下面的公式求得校验位的个数

$2^k>=m+k+1$

其中,m为序列的长度,k为校验位的个数
对于1010m4,求得k最小值为3,即为放置3个校验位
校验位的放置位置为$2^n, n=0,1,2,3…$
在此放置位置为1, 2, 4,校验位+信息位共7位,则如下表:

1 2 3 4 5 6 7
P1 P2 1 P3 0 1 0

为了让P1, P2, P3m3, m5, m6, m7产生联系,则划分组为如下:

P1: m3 m5 m7
P2: m3 m6 m7
P3: m5 m6 m7
划分依据:将1-7转成二进制编码(001,010,011,100,101,110,111),`P1`的`1`在第一位,`m3, m5, m7`的第一位也都有`1`,故将其放一组,其他组同理

上表转化为:

P1 1 0 0
P2 1 1 0
P3 0 1 0

下面就是确定P1, P2, P3的值:

奇检验 偶检验
100 0100 1100
110 1110 0110
010 0010 1010
取出添加的数字:
奇检验 偶检验
100 0 1
110 1 0
010 0 1

将奇检验的海明校验码与偶检验的海明校验码填入表中

1 2 3 4 5 6 7
奇检验 0 1 1 0 0 1 0
偶检验 1 0 1 1 0 1 0

下面以奇检验的海明校验码为例:
假如发送方发过去的序列为0110011
标记位置:

0 1 1 0 0 1 1
1 2 3 4 5 6 7
P1 P2 m3 P3 m5 m6 m7
按下面的书写:
e1 P1 m3 m5 m7
e2 P2 m3 m6 m7
e3 P3 m5 m6 m7
将数值带入:
e1 0 1 0 1
e2 1 1 1 1
e3 0 0 1 1
然后对每一行进行奇检验:
e1 e2 e3
1 1 1
将 `111` 转为十进制,即为`7`,对比发现,确实是第`7`位出错 偶检验同理 如果无错,则`e1, e2, e3`转化为十进制为`0`

个人理解,如有错误,烦请纠正