如何在 Compessed Sparse Row 中通过索引查找元素?

How to find an element by indexes in Compessed Sparse Row?

提问人:SaintSammy 提问时间:9/14/2023 最后编辑:President James K. PolkSaintSammy 更新时间:9/14/2023 访问量:27

问:

我正在尝试用 Java 编写一个使用稀疏矩阵的程序,并且我编写了一个使用 CRS 格式存储它的类。给定类的问题部分是 get_element() 的方法,它必须通过索引返回元素。索引作为用户输入接收。每次输入索引时,我都会得到 0。虽然结果应该不同。也许问题出在构造函数内部。我不知道。

import java.util.Scanner;
import java.util.ArrayList;

public class CRS {
    
    private ArrayList<Integer> A = new ArrayList<Integer>();
    private ArrayList<Integer> LJ = new ArrayList<Integer>();
    private ArrayList<Integer> LI = new ArrayList<Integer>();
    
    public CRS(int[][] matrix) {
        int n = 0;
        for(int i=0;i<10*main.N;i++) {
            for(int j=0;j<10*main.N;j++) {
                if(matrix[i][j]!=0) {
                    A.add(matrix[i][j]);
                    LJ.add(j+1);
                    n++;
                }
            }
            LI.add(n);
        }
        LI.add(main.N+1);
    }
    
    public void print_all() {
        System.out.println("\nCRS");
        System.out.print("A ");
        for(int i=0;i<main.N;i++) {
            System.out.print(A.get(i)+" ");
        }
        System.out.print("\nLJ ");
        for(int i=0;i<main.N;i++) {
            System.out.print(LJ.get(i)+" ");
        }
        System.out.print("\nLI ");
        for(int i=0;i<LI.size();i++) {
            System.out.print(LI.get(i)+" ");
        }
    }
    
    public int get_element() {
        System.out.println("\n\nSearching for an element");
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter i:");
        int i = sc.nextInt();
        System.out.println("Enter j:");
        int j = sc.nextInt();
        int AA = 0;
        int N1=LI.get(i);
        int N2=LI.get(i+1);
        for(int k=N1;k<N2;k++) {
            if(LJ.get(k)==j) {
                AA=A.get(k);
            }
        }
        return AA;
    }
}

这是主类。

import java.io.*;
import java.util.*;

public class main {
    public static int N=2;

    public static void main(String[] args) {
        
        int [][] matrix = new int [10*N] [10*N];
        for(int n=0;n<N;) {
            int max_position=10*N-1;
            int min_value=1,max_value=12;
            int i = (int)(Math.random() * (max_position + 1));
            int j = (int)(Math.random() * (max_position + 1));
            if(matrix[i][j]==0) {
                matrix[i][j] = min_value + (int)(Math.random() * ((max_value - min_value) + 1));
                n++;
            }
        }
        System.out.println("Sparce matrix");
        for(int i=0;i<10*N;i++) {
            for(int j=0;j<10*N;j++) {
                System.out.print(matrix[i][j]+" ");
            }
            System.out.println();
        }
        
        CRS crs = new CRS(matrix);
        crs.print_all();
        System.out.println(crs.get_element());
    }

}

java 数学 矩阵 数组列表

评论


答:

1赞 Diego Borba 9/14/2023 #1

正如我所看到的,您的代码有 2 个问题。

首先,在索引中 for 不正确get_element()LI

public int get_element() {
    System.out.println("\n\nSearching for an element");
    
    Scanner sc = new Scanner(System.in);
    
    System.out.print("Enter i:");
    int i = sc.nextInt();
    
    System.out.print("Enter j:");
    int j = sc.nextInt();
    
    int AA = 0;
    
    // Correct indexing
    int N1 = LI.get(i - 1); 
    int N2 = LI.get(i);
    
    for (int k = N1; k < N2; k++) {
        if (LJ.get(k) == j) {
            AA = A.get(k);
        }
    }
    
    sc.close();
    
    return AA;
}

注意:使用它来防止程序中的内存泄漏非常重要。
注意²:更适合输入情况
scanner.close()System.out.print()System.out.println()

其次,您应该在构造函数中正确设置值:main.NCRS

private List<Integer> A = new ArrayList<Integer>();
private List<Integer> LJ = new ArrayList<Integer>();
private List<Integer> LI = new ArrayList<Integer>();

public CRS(int[][] matrix) {
    int n = 0;
    for (int i = 0; i < 10 * main.N; i++) {
        for (int j = 0; j < 10 * main.N; j++) {
            if (matrix[i][j] != 0) {
                A.add(matrix[i][j]);
                LJ.add(j + 1);
                n++;
            }
        }
        LI.add(n);
    }
    LI.add(main.N * 10 + 1);
}

注意:在实例化数组时,最好使用接口 () 而不是类,请查看此内容List<Integer>

评论

0赞 SaintSammy 9/14/2023
谢谢你的回答,但每次我调用它时,该方法仍然返回零。
0赞 Diego Borba 9/14/2023
我想我不明白你到底想要什么......