提问人:SaintSammy 提问时间:9/14/2023 最后编辑:President James K. PolkSaintSammy 更新时间:9/14/2023 访问量:27
如何在 Compessed Sparse Row 中通过索引查找元素?
How to find an element by indexes in Compessed Sparse Row?
问:
我正在尝试用 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());
}
}
答:
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.N
CRS
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
我想我不明白你到底想要什么......
评论