zoukankan      html  css  js  c++  java
  • 10122. Sparse Matrix Multiplication

    https://judgegirl.csie.org/problem/0/10122
    稀疏矩陣為大部份元素皆為零的矩陣,在科學與工程領域中求解線性模型時經常出現大型的稀疏矩陣。現在給予最常見的 Coordinate Format (簡稱 COO 格式),請問兩個矩陣相乘結果為何。給予矩陣 An,m 和 Bm,r,請計算稀疏矩陣相乘。

    因为最近需要重写一下tensorflow里面的稀疏矩阵和稠密矩阵乘法(还没看懂),所以先学习一下稀疏矩阵乘法,稀疏矩阵乘法和一般的矩阵乘法很相似,只需要额外根据矩阵的行号列号找到对应的三元组即可,这块用二分,如果找不到说明那块是0。

    #include<stdio.h>
    
    #define ul unsigned long
    #define N 1000010
    
    int n, m, r;
    int na, nb;
    
    typedef struct node{
        int row, col;
        ul val, idx;
    }node;
    
    node A[N], B[N];
    
    ul rotate_left(ul x, ul n) {
        return  (x << n) | (x >> (32 - n));
    }
    
    ul encrypt(ul m, ul key) {
        return (rotate_left(m, key & 31) + key) ^ key;
    }
    
    int find(ul x, node m[N], int len){
        int l = 0, r = len - 1;
        while(l < r){
            int mid = l + r + 1 >> 1;
            if(m[mid].idx <= x) l = mid;
            else r = mid - 1;
        }
        
        if(m[l].idx != x) return -1;
        return l;
    }
    
    int main(){
        scanf("%d%d%d%d%d", &n, &m, &r, &na, &nb);
        
        for(int i = 0; i < na; i ++){
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            A[i].row = a, A[i].col = b, A[i].val = c, A[i].idx = (ul) a * m + b;
        }
        
        for(int i = 0; i < nb; i ++){
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            B[i].row = a, B[i].col = b, B[i].val = c, B[i].idx = (ul) a * r + b;
        }
        
        ul res = 0;
        
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < r; j ++){
                ul sum = 0;
                for(int k = 0; k < m; k ++){
                    int idx_a = find((ul) m * i + k, A, na), idx_b = find((ul) r * k + j, B, nb);
                    if(~idx_a && ~idx_b) sum += A[idx_a].val * B[idx_b].val;
                }
                if(sum) res += encrypt((i + 1) * (j + 1), sum);
            }
            
        printf("%u", res);
        
        return 0;
    }
    

    复杂度:(O(nmr))并不是最优的,但是本题由于三元组的个数也达到1e6所以也优化不到哪去
    另外就是原题要求用是intel的编译器,网站上貌似关掉了

  • 相关阅读:
    Java8初体验(二)Stream语法详解
    java8的新特性以及用法简介
    HDFS之SequenceFile和MapFile
    深入分析Parquet列式存储格式【转】
    Flume中的HDFS Sink配置参数说明【转】
    采用alluxio提升MR job和Spark job性能的注意点
    spark on alluxio和MR on alluxio测试(改进版)【转】
    python入门-分类和回归各种初级算法
    C++函数调用时的参数传递-3中传递方式
    OpenCV颜色空间——HLS颜色空间
  • 原文地址:https://www.cnblogs.com/tomori/p/14977003.html
Copyright © 2011-2022 走看看