首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++】B2091 向量点积计算

【C++】B2091 向量点积计算

作者头像
CSDN-Z
发布2025-01-03 09:34:40
发布2025-01-03 09:34:40
3820
举报
文章被收录于专栏:AIGCAIGC

💯前言

  • 在线性代中,点积是一种基础而重要的向量操作,应用广泛,从学科计算到传统运算阶段都十分常见。本文对一道向量点积的题目进行全面分析,并对三种不同实现方案进行比较和解析,帮助读者更好地理解和掌握向量点积的计算。 以下文章包括:题目说明与分析;两种不同解法代码(老师给出的方案和自己的解法);以及各方案的优缺点比较和进一步优化建议。 C++ 参考手册

💯题目描述

在线性代数中,计算点积是一种基础的操作。给出两个向量,向量

a

和向量

b

,它们的点积计算公式如下:

a \cdot b = a_1b_1 + a_2b_2 + \cdots + a_nb_n

题目说明

  • 输入格式
    • 第一行,一个整数
    n

    ,表示向量的维数(元素个数);

    • 第二行,含有
    n

    个整数,表示向量

    a

    的元素值;

    • 第三行,含有
    n

    个整数,表示向量

    b

    的元素值;

  • 输出格式
    • 输出一个整数,即两个向量点积的结果。

输入输出示例

输入:

代码语言:javascript
复制
3
1 2 3
4 5 6

输出:

代码语言:javascript
复制
36

分析

根据示例,点积计算流程如下:

  1. 向量计算公式应用
\text{点积} = 1 \cdot 4 + 2 \cdot 5 + 3 \cdot 6 = 4 + 10 + 18 = 36
  1. 最终输出结果为 36。

以上是题目的核心内容和基础分析,接下来将分别分析两种解法,并进行比较和进一步优化。


我的做法

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	int arr1[n];
	int arr2[n];
	for(int i = 0; i < n; i++)
	{
		cin >> arr1[i];
	}
	for(int i = 0; i < n; i++)
	{
		cin >> arr2[i];
	}
	int result = 0;
	for(int i = 0; i < n; i++)
	{
		result += arr1[i] * arr2[i]; 
	}
	cout << result;
	
	return 0;	
} 

💯解法一:完整输入存储后计算点积的方案

代码展示

代码语言:javascript
复制
#include <iostream>
using namespace std;

const int N = 1010;
int arr1[N];
int arr2[N];

int main()
{
    int n = 0;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> arr1[i];
    }

    for (int i = 0; i < n; i++) {
        cin >> arr2[i];
    }

    int ret = 0;
    for (int i = 0; i < n; i++) {
        ret += arr1[i] * arr2[i];
    }

    cout << ret << endl;
    return 0;
}

分析与解释

基础思路
  1. 首先读取向量的维度
n

  1. 利用两个整型数组,分别存储向量
a

b

的值;

  1. 将两个向量逐元素相乘,并累加存储在结果变量 ret 中;
  2. 最后输出计算结果。
代码分解
  1. 全局定义数组和存储设置
代码语言:javascript
复制
const int N = 1010;
int arr1[N];
int arr2[N];
  • 全局整型数组的大小设置为 1010,能足以处理题目中需要的最大数据规模(
n \leq 1000

)。

  • 实现了完整输入存储,方便后续计算点积。
  1. 向量值输入
代码语言:javascript
复制
for (int i = 0; i < n; i++) {
    cin >> arr1[i];
}

for (int i = 0; i < n; i++) {
    cin >> arr2[i];
}
  • 通过两个 for 循环,分别读取向量
a

b

的值并存入数组。

  • 这种做法结构清晰,是常见的输入处理方式。
  1. 点积计算和输出
代码语言:javascript
复制
int ret = 0;
for (int i = 0; i < n; i++) {
    ret += arr1[i] * arr2[i];
}
cout << ret << endl;
  • 通过一个循环,将两个数组对应元素相乘,并累加存入变量 ret
  • 最后将结果输出。
涉及的概念
  • 数组:数组用于存储相同类型的值,通过连续内存地址存放。
  • 循环处理:使用 for 循环可以依次访问数组中的元素。
  • 空间复杂度:由于定义了两个数组,因此空间复杂度为
O(n)

优点与不足

  • 优点
    • 解法完整地使用了数组存储,代码清晰,结构简单易懂;
    • 标准化程度高,适用于大部分相似题目。
  • 不足
    • 空间复杂度较高,需要额外的数组来存储输入;
    • 若仅需要计算点积,而无需保留输入数据,存储数组显得多余。

💯解法二:优化存储的即时计算方案

代码展示

代码语言:javascript
复制
#include <iostream>
using namespace std;

const int N = 1010;
int arr1[N];

int main()
{
    int n = 0;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> arr1[i];
    }

    int ret = 0;
    for (int i = 0; i < n; i++) {
        int b;
        cin >> b;
        ret += arr1[i] * b;
    }

    cout << ret << endl;
    return 0;
}

在这里插入图片描述

分析与解释

基础思路
  1. 首先读取向量的维度
n

  1. 仅用一个数组存储向量
a

的值;

  1. 在读取向量
b

的值时,即时计算点积并累加;

  1. 最后输出计算结果。
代码分解
  1. 定义一个数组
代码语言:javascript
复制
const int N = 1010;
int arr1[N];
  • 仅定义一个数组,用于存储向量
a

的值。

  1. 向量值输入与即时计算
代码语言:javascript
复制
for (int i = 0; i < n; i++) {
    cin >> arr1[i];
}

int ret = 0;
for (int i = 0; i < n; i++) {
    int b;
    cin >> b;
    ret += arr1[i] * b;
}
  • 第一个 for 循环读取向量
a

的值;

  • 第二个 for 循环在读取向量
b

的值时,直接计算点积并累加。

  1. 输出结果
代码语言:javascript
复制
cout << ret << endl;
  • 最后将结果输出。
涉及的概念
  • 即时计算:无需额外存储向量
b

的值,直接在输入时进行运算。

  • 空间复杂度:只需要存储一个数组,空间复杂度降为
O(n)

优点与不足

  • 优点
    • 存储优化,节省了一个数组的空间;
    • 计算即时完成,无需额外遍历数组,提升效率。
  • 不足
    • 如果需要保存输入数据(如后续操作),此方法不适用。

💯两种方案的比较

比较点

解法一

解法二

存储方式

两个数组,完整存储输入

一个数组,即时计算点积

空间复杂度

O ( n ) O(n) O(n)

O ( n ) O(n) O(n)

时间复杂度

O ( n ) O(n) O(n)

O ( n ) O(n) O(n)

代码结构

清晰,适合需要完整数据的场景

紧凑,适合仅需计算结果的场景

适用场景

输入数据需多次操作或复用

输入数据仅用于计算点积

O(n)
O(n)

时间复杂度

O(n)
O(n)

代码结构清晰,适合需要完整数据的场景紧凑,适合仅需计算结果的场景适用场景输入数据需多次操作或复用输入数据仅用于计算点积


💯总结与优化建议

通过对两种方案的分析可以看出:

  1. 解法一 适用于需要完整保存输入数据的场景,代码逻辑清晰,易于理解和扩展;
  2. 解法二 适用于仅需计算点积的场景,存储优化,计算高效。

进一步优化

如果对代码的可读性和现代化有更高的要求,可以使用 C++ 的标准库容器(如 std::vector)和算法函数(如 std::inner_product)来简化代码,实现更加简洁的向量点积计算:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n; i++) cin >> b[i];

    int result = inner_product(a.begin(), a.end(), b.begin(), 0);
    cout << result << endl;
    return 0;
}
  • 使用 std::vector 动态分配内存,避免了固定大小数组的限制;
  • 使用 std::inner_product 函数直接计算点积,代码更加简洁。

通过上述分析与代码优化,相信读者能够更清晰地理解向量点积计算的实现方式,并在实际编程中选择合适的方法来解决类似问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 💯前言
  • 💯题目描述
    • 题目说明
    • 输入输出示例
    • 分析
  • 我的做法
  • 💯解法一:完整输入存储后计算点积的方案
    • 代码展示
    • 分析与解释
      • 基础思路
      • 代码分解
      • 涉及的概念
    • 优点与不足
  • 💯解法二:优化存储的即时计算方案
    • 代码展示
    • 分析与解释
      • 基础思路
      • 代码分解
      • 涉及的概念
    • 优点与不足
  • 💯两种方案的比较
  • 💯总结与优化建议
    • 进一步优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档