gpt4 book ai didi

java - 如何降低时间复杂度

转载 作者:行者123 更新时间:2023-12-01 19:28:31 27 4
gpt4 key购买 nike

如何减少完成所有 for 循环任务的时间?由于某种原因,我必须使用 sleep(8) 毫秒。所以,在 CORE i7 CPU 和 8GB RAM PC 上完成所有循环需要 2 个多小时。我是这个领域的新手。

        ExecutorService executorService = Executors.newCachedThreadPool();
//Task One
executorService.execute(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 8; i++) {
for (int j = 1; j <= 10; j++) {
for (int k = 1; k <= 1200; k++) {
for (int l = 1; l <= 10; l++) {
try {
Thread.sleep(8);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Task # A:" + i + " AF: " + j + " C:" + k + " CF:" + l);
}
}
}
}
}
});


我正在尝试另一种方法。这是减少时间的正确方法吗?或者建议我更好的东西。

public class Ask1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
//Total customer 1200
//1-400 for
System.out.println("customer range 1 to 400");
executorService.execute(new TaskThread(2,10,400));
//401 - 800
System.out.println("customer range 401 to 800");
executorService.execute(new TaskThread(2,10,400));
//801-1200
System.out.println("customer range 801 to 1200");
executorService.execute(new TaskThread(2,10,400));

executorService.shutdown();
}
}

class AskThread implements Runnable {

int agent;
int finger;
int customer;

public AskThread(int agent, int finger,int customer){
this.agent = agent;
this.finger = finger;
this.customer = customer;
}

@Override
public void run() {
for (int i = 1; i <= agent; i++) { //changeable
for (int j = 1; j <= finger; j++) { //fixed
for (int k = 1; k <= customer; k++) { //changeable
for (int l = 1; l <= finger; l++) { //fixed
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Task One # Agent:" + i + " Agent Finger: " + j + " Customer:" + k + " Customer Finger:" + l);
}
}
}
}
}
}

最佳答案

让我们稍微扩展一下我的评论。正如我所说,您提供的示例太抽象,无法提供一些如何提高性能的具体建议。

据我所知,您希望在多个线程之间平均分配工作。在大多数情况下,创建 x 个线程时不能仅将所有“维度”除以 x。

想象更具体的任务:你有一个二维矩阵,代表一个棋盘。您想要迭代矩阵中的所有元素并执行一些操作。你最终会得到一个像这样的循环:

for (int i = 0; i < dim1; i++){
for (int j = 0; j < dim2; j++){
\\do something here
}
}

在此示例中,我们必须迭代 dim1 * dim2 元素。

假设我们想将工作分配给 4 个线程。如果将 dim1dim2 同时除以 4,则最终得到 4 x 4 矩阵,即 16 个部分。当你想象一个物理棋盘时,它是最明显的。

如果你有 4 个线程,你必须将工作分成 4 个(通常是相等的)部分。在这种情况下,您可以将 dim1dim2 同时除以 2,总共分为 4 个部分,也可以仅将一个维度除以 4。

编辑。也许同样的情况也适用于你的问题。如果您有 x 个代理,每个代理有 20 个手指,以及 y 个客户,每个客户有 20 个手指,您可能想要将每个代理进行比较。

对于 4 个线程,您不能只拿 1/4 的客服人员、他们的 1/4 手指来与部分客户进行比较 - 并且只拿他们的 1/4 手指。你所能做的就是拿 1/4 的代理,他们的全部 20 个手指,并与所有客户的所有手指进行比较。

关于java - 如何降低时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60597637/

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