数据结构与算法(C++版本)

首先我们来编写一些矩阵计算的C++实现代码

矩阵相加

#include<iostream>
using namespace std;
const int ROWS = 3;
const int COLS = 3;
void MatrixAdd(int*,int*,int*,int,int);
int main()
{
    int A[ROWS][COLS] = {{1,3,5},{7,9,11},{13,15,17}};
    int B[ROWS][COLS] = {{9,8,7},{6,5,4},{3,2,1}};
    int C[ROWS][COLS] = {0};
    cout << "[矩阵A的各个元素]" << endl;
    for(int i = 0;i < ROWS;i++)
    {
        for(int j = 0;j < COLS;j++)
            cout << A[i][j] << "\t";
        cout << endl;
    }
    cout << "[矩阵B的各个元素]" << endl;
    for(int i = 0;i < ROWS;i++)
    {
        for(int j = 0;j < COLS;j++)
            cout << B[i][j] << "\t";
        cout << endl;
    }
    MatrixAdd(&A[0][0],&B[0][0],&C[0][0],ROWS,COLS);
    cout << "[显示矩阵A和矩阵B相加的结果]" << endl;
    for(int i = 0;i < ROWS;i++)
    {
        for(int j = 0;j < COLS;j++)
            cout << C[i][j] << "\t";
        cout << endl;
    }
    system("pause");
}
void MatrixAdd(int* arrA,int* arrB,int* arrC,int dimX,int dimY)
{
    if(dimX <= 0 || dimY <= 0)
    {
        cout << "矩阵维数必须大于0" << endl;
        return;
    }
    for(int row = 1;row <= dimX;row++)
        for(int col = 1;col <= dimY; col++)
            arrC[(row-1)*dimY+(col-1)] = arrA[(row-1)*dimY + (col-1)] + arrB[(row-1)*dimY + (col-1)];
}

矩阵相乘

#include<iostream>
using namespace std;
void MatrixMultiply(int*,int*,int*,int,int,int);
int main()
{
    int M,N,P;
    int i,j;
    cout << "请输入矩阵A的维数(M,N):" << endl;
    cout << "M= ";
    cin >> M;
    cout << "N= ";
    cin >> N;
    int *A = new int[M*N];
    cout << "[请输入矩阵A的各个元素]" << endl;
    for(i = 0;i < M;i++)
        for(j = 0;j < N;j++)
        {
            cout << "a" << i << j << "=";
            cin >> A[i*N+j];
        }
    cout << "请输入矩阵B的维数(N,P):" << endl;
    cout << "N= ";
    cin >> N;
    cout << "P= ";
    cin >> P;
    int *B = new int[N*P];
    cout << "[请输入矩阵B的各个元素]" << endl;
    for(i = 0;i < N;i++)
        for(j = 0;j < P;j++)
        {
            cout << "b" << i << j << "=";
            cin >> B[i*P+j];
        }
    int *C = new int [M*P];
    MatrixMultiply(A,B,C,M,N,P);
    cout << "[A×B的结果是]" << endl;
    for(i = 0;i < M;i++)
    {
        for(j = 0;j < P;j++)
            cout << C[i*P+j] << "\t";
        cout << endl;
    }
    system("pause");
}
void MatrixMultiply(int* arrA,int* arrB,int* arrC,int M,int N,int P)
{
    if(M <= 0 || N <= 0 || P<= 0)
    {
        cout << "[错误:维数M,N,P必须大于0]" << endl;
        return;
    }
    for(int i = 0;i < M;i++)
        for(int j = 0;j < P;j++)
        {
            int Temp;
            Temp = 0;
            for(int k = 0;k < N;k++)
                Temp = Temp + arrA[i*N+k]*arrB[k*P+j];
            arrC[i*P+j] = Temp;
        }
}

转置矩阵

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int M,N,row,col;
 6     cout << "[输入M×N矩阵的维数]" << endl;
 7     cout << "请输入维数M: ";
 8     cin >> M;
 9     cout << "请输入维数N: ";
10     cin >> N;
11     int *arrA = new int[M*N];//声明动态数组
12     int *arrB = new int[M*N];
13     cout << "[请输入矩阵内容]" << endl;
14     for(row = 1;row <= M; row++)
15     {
16         for(col = 1;col <= N;col++)
17         {
18             cout << "a" << row << col << "=";
19             cin >> arrA[(row-1)*N + (col-1)];
20         }
21     }
22     cout << "[输入矩阵内容为]" << endl;
23     for(row = 1;row <= M; row++)
24     {
25         for(col = 1;col <= N;col++)
26         {
27             cout << arrA[(row-1)*N + (col-1)] << "\t";
28         }
29         cout << endl;
30     }
31     //进行矩阵转置
32     for(row = 1;row <= N;row++)
33         for(col = 1;col <= M;col++)
34             arrB[(col-1)*N + (row-1)] = arrA[(row-1) + (col-1)*N];
35     cout << "[转置矩阵内容为]" << endl;
36     for(row = 1;row <= N;row++)
37     {
38         for(col=1;col<=M;col++)
39         {
40             cout << arrB[(col-1)*N + (row-1)] << "\t";
41         }
42         cout << endl;
43     }
44     system("pause");
45 }

稀疏矩阵

一个矩阵中大部分元素为0即可称为稀疏矩阵(Sparse Matrix)

如若使用传统的数组来储存稀疏矩阵也是可以,但是很多元素是0,这样的话会造成内存空间浪费。

因此可以采用三项式的数据结构,如果一个稀疏矩阵有n个非零项目,那么可以利用一个A(0:n,1:3)的二维数组来表示,其中A(0,1)代表稀疏矩阵的列数,A(0,2)代表稀疏矩阵的行数而A(0,3)则是此稀疏矩阵非零项目的总数。每一个非零项目用(i,j,item-value)的形式来表示,其中i为此非零项目所在列数,j为非零项目所在行数,item-value则为此非零项的值。

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
const int _ROWS = 8;
const int _COLS = 9;
const int _NOTZERO = 8;
int main()
{
    int i,j,tmpRW,tmpCL,tmpNZ;
    int temp = 1;
    int Sparse[_ROWS][_COLS];
    int Compress[_NOTZERO][3];
    srand(time(NULL));
    for(i = 0;i < _ROWS;i++)
        for(j = 0;j < _COLS;j++)
            Sparse[i][j] = 0;
    tmpNZ = _NOTZERO;
    for(i = 1; i<tmpNZ+1;i++)
    {
        tmpRW = rand()%_ROWS;
        tmpCL = rand()%_COLS;
        if(Sparse[tmpRW][tmpCL] != 0)
            tmpNZ++;
        Sparse[tmpRW][tmpCL] = i;
    }
    cout << "[稀疏矩阵的各个元素]" << endl;
    for(i = 0;i < _ROWS;i++)
    {
        for(j = 0;j < _COLS;j++)
            cout << "[" << Sparse[i][j] << "]";
        cout << endl;
    }
    Compress[0][0] = _ROWS;
    Compress[0][1] = _COLS;
    Compress[0][2] = _NOTZERO;
    for(i = 0;i < _ROWS;i++)
        for(j = 0;j < _COLS;j++)
            if(Sparse[i][j] != 0)
            {
                Compress[temp][0] = i;
                Compress[temp][1] = j;
                Compress[temp][2] = Sparse[i][j];
                temp++;
            }
    cout << "[稀疏矩阵压缩后的内容]" << endl;
    for(i = 0;i < _NOTZERO+1;i++)
    {
        for(j = 0;j < 3;j++)
            cout << "[" << Compress[i][j] << "]";
        cout << endl;
    }
    system("pause");
}

时间: 2024-11-05 18:49:09

数据结构与算法(C++版本)的相关文章

数据结构与算法入门-算法介绍(python版本)

//2020.02.29数据结构与算法入门(python版本)第1章 评判算法的优劣指标有哪些?课时1:算法的基本概念 1.算法Algorithm是一个计算过程,是指解决一个问题的方法.2.数据结构是指数据存储的一种结构方式,是静态的.3.程序=数据结构+算法(尼古拉斯凯奇说过的一句著名的话).课时2:时间复杂度介绍 1.估计不同算法运行的快慢方式:时间复杂度2.时间复杂度是指:用来评估算法运行效率的一个式子(单位),与电脑的配置无关,与算法的运行量无关: 3.时间复杂度的表示方法一般使用O(n

数据结构与算法4: 经典问题之迷宫问题(Maze path)

数据结构与算法4: 经典问题之迷宫问题(Maze path) 写在前面 本节实践了教材[1][2]的两种经典迷宫算法.注意体会栈的运用.如果有改进意见请帮助我. 1.迷宫问题直观感受 下面给出迷宫问题的一个直观感受图,引入图只是为了帮助直观理解,这里不涉及OpenGL等其他绘图内容. 下图中棕色代表通道阻塞,白色代表可用通道,红色代表起始位置,绿色代表当前位置,黄色代表出口. (采用C++ 和OpenGL 绘制,目前是2D版本,3D版本有空时再补上) 迷宫1: 迷宫2: 2.迷宫算法 2.1 迷

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

数据结构与算法JavaScript (四) 串(BF)

串是由零个或多个字符组成的有限序列,又叫做字符串 串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的.线性表更关注的是单个元素的操作CURD,串则是关注查找子串的位置,替换等操作. 当然不同的高级语言对串的基本操作都有不同的定义方法,但是总的来说操作的本质都是相似的.比如javascrript查找就是indexOf, 去空白就是trim,转化大小写toLowerCase/toUpperCase等等 这里主要讨论下字符串模式匹配的几种经典的算法:BF.BM

javascript数据结构和算法 第一章(Javascript编程环境和模型) 一

这一章介绍了我们在这本书中使用的描述各种数据结构和算法的Javascript的编程环境和编程架构. Javascript 环境 Javascript 在很长一段时间都是被作为web浏览器内置脚本编程语言来使用. 然而,在过去几年里,javascript编程环境得到了极大的发展,他们可以使javascript在桌面或者服务端运行. 在我们这本书中,我们使用其中的一个javascript环境:javascript shell:是Mozilla公司的javascript环境,被称为SpiderMonk

为什么我认为数据结构与算法对前端开发很重要?

从一个需求谈起 在我之前的项目中,曾经遇到过这样一个需求,编写一个级联选择器,大概是这样: 图中的示例使用的是Ant-Design的Cascader组件. 要实现这一功能,我需要类似这样的数据结构: var data = [{ "value": "浙江", "children": [{ "value": "杭州", "children": [{ "value": &q

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的

Python数据结构与算法

数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,

java数据结构和算法06(红黑树)

这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的时候碰到一个问题困扰了很久可以先让自己的头脑放松一下,哈哈! 不瞎扯咳,开始今天的正题: 前提:看红黑树之前一定要先会搜索二叉树 1.红黑树的概念 红黑树到底是个什么鬼呢?我最开始也在想这个问题,你说前面的搜索二叉树多牛,各种操作效率也不错,用起来很爽啊,为什么突然又冒出来了红黑树啊? 确实,搜索二

重读《学习JavaScript数据结构与算法-第三版》-第2章 ES和TS

定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据结构与算法>第三版于2019年的5月份再次刊印发行,新版内容契合当下,实为JavaScript开发人员的必备之佳作.有幸重读此版,与诸君分享共勉. 内容提要 此章节为第2章-ECMAScript与TypeScript概述,主要介绍了JS和TS的相关概念,以及在JS新版本中的新特性:let.解构.箭头函数