gpt4 book ai didi

java - 两种方法实现相同的算法,一种在 Java 中比其他方法花费更多的运行时间

转载 作者:行者123 更新时间:2023-11-30 10:15:00 25 4
gpt4 key购买 nike

我正在尝试使用 new Date().getTime() 计算两种方法的运行时间。这两种方法遵循相同的算法,其中一种增加了一些步骤,但是步骤较少的方法需要更多时间。

我对此感到困惑。这是两种方法:这是第一种方法,使用更少的步骤并花费更多的时间:

public void encryptFiles(List<BloomFilter> bfList1) {
Matrix matrix2 = new Matrix(400,400);
Matrix matrix3 = new Matrix(400,400);

matrix2.setMat(value1);
matrix3.setMat(value2);

a2 = matrix2.transpose();
b2 = matrix3.transpose();

startTime2 = new Date().getTime();
for (BloomFilter bfList2 : bfList1) {
Random raa = new Random();
int g1 = raa.nextInt();
double m1 = (double) ((double) Math.round(g1 * 10) / 10.0);

List<double[]> res1 = new ArrayList<>();
double[] e1 = new double[400];
double[] k1 = new double[400];

Vector<Double> j = new Vector<Double>(400);
Vector<Double> h = new Vector<Double>(400);

//System.out.println("bloom filter in bloom filter list:" + Arrays.toString(bfList2.getBitSet().data));
String bfName = bfList2.getName();
for (int i = 0; i < s.size(); i++) {
if (s.get(i) == 1) {
j.add( (double) bfList2.getBitSet().getWord(i));
h.add((double) bfList2.getBitSet().getWord(i));
} else {
j.add(0.5 * (bfList2.getBitSet().getWord(i))+m1);
h.add(0.5 * (bfList2.getBitSet().getWord(i))+m1 );
}
}

for (int u = 0; u < 400; u++) {
for (int y = 0; y < 400; y++) {
e1[u] += a2[u][y]*j.get(y);
k1[u] += b2[u][y]*h.get(y);
}
}
res1.add(e1);
res1.add(k1);
hasssh.put(bfName,res1 );
}
encryptedBFListInTime = (new Date().getTime())-startTime2;
encryptedBFListInTime /= 1000.0;
System.out.println("encrypt files only in "+encryptedBFListInTime);
}

下面是第二种方法,步骤多,时间少:

public  BloomFilterIndex encryptTree(BloomFilterIndex tree) {

startTime9 = new Date().getTime();
for(int m = 0; m < tree.root.children.size(); m++){
BloomFilterIndex.BFINode<Integer> n =(BloomFilterIndex.BFINode<Integer>)tree.root.children.get(m);
encrypt(n);
}
end = new Date().getTime() - startTime9;
//end1 = end - startTime9;
end /= 1000.0;
System.out.println("encrypt node in :"+end);
return tree;
}

调用以下方法:

public void encrypt(BloomFilterIndex.BFINode<Integer> root) {

List<double[]> ress = new ArrayList<>();
if (!root.isLeaf()) {
c = new double[root.value.size()];
// c = new double[4];
for (int i = 0; i < root.value.size(); i++) {
// for(int i = 0; i < 4; i++){
c[i] = root.value.getBitSet().getWord(i);
}
ress.add(c);
root.value = null;
root.value2 = ress;

for (BloomFilterIndex.BFINode<Integer> g : root.children) {
encrypt(g);
}

} else {
//String bfName1 = root.value.getName();
double[] y = new double[400];
double[] z = new double[400];
Random r = new Random();
Integer g1 = r.nextInt();
double m5 = (double) ((double) Math.round(g1 * 10) / 10.0);
Vector<Double> m6 = new Vector<Double>(400);
Vector<Double> n1 = new Vector<Double>(400);

for (int i = 0; i < s.size(); i++) {
// for(int i = 0;i < 400; i++) {
if (s.get(i) == 1) {
m6.add((double) root.value.getBitSet().getWord(i));
n1.add((double) root.value.getBitSet().getWord(i));
} else {
m6.add(0.5 * (root.value.getBitSet().getWord(i)) + m5);
n1.add(0.5 * (root.value.getBitSet().getWord(i)) + m5);
}
}

for (int i = 0; i < 400; i++) {
for (int j = 0; j < 400; j++) {
y[i] += a2[i][j] * m6.get(j);
z[i] += b2[i][j] * n1.get(j);
}
}
ress.add(y);
ress.add(z);
root.value = null;
root.value2 = ress;
// hasssh1.put(bfName1, ress);
}
}

请问是哪里出了问题

最佳答案

运行时间取决于代码的关键部分。要确定临界区,请记住它们包含在嵌套最深的 for 或 while 循环中。其他代码行只执行一次!

在第二种方法中,您从 WITHIN for 循环中调用辅助方法!这意味着您正在执行 ALL 辅助方法 tree.root.children.size() 次的 for 循环和嵌套 for 循环,因为正在调用辅助方法这么多次!

在考虑嵌套循环时,相乘!例如,

for (int i= 0; i < 5; i++) {
for (int j= 0; j < 5; j++) {
DOTHING();
}
}

DOTHING 将执行 25 次!为什么?外循环执行了5次!嵌套循环执行了 5 次!5 x 5 = 25 次!

您从 for 循环中调用该辅助方法及其所有嵌套 for 循环就像添加了另一个嵌套循环。这就是 n * n 执行和 n * n * n 或 n^2 vs n^3 之间的区别!希望对您有所帮助!

关于java - 两种方法实现相同的算法,一种在 Java 中比其他方法花费更多的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50673299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com