gpt4 book ai didi

java - 如何编写一个函数来并行查找大于 N 的值

转载 作者:行者123 更新时间:2023-12-03 12:44:30 25 4
gpt4 key购买 nike

所以我有一个函数,可以在一个大的函数中找到一个大于 N 的数
未排序的数字数组如下所示。

import java.util.*;

public class program {

// Linear-search function to find the index of an element
public static int findIndex(int arr[], int t)
{
// if array is Null
if (arr == null) {
return -1;
}

// find length of array
int len = arr.length;
int i = 0;

// traverse in the array
while (i < len) {

// if the i-th element is t
// then return the index
if (arr[i] > t) {
return i;
}
else {
i = i + 1;
}
}
return -1;
}

// Driver Code
public static void main(String[] args)
{
int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };

int i = findIndex(my_array, 7);
// find the index of 5
System.out.println("Index position of 5 is: "
+ my_array[i]);
}
}
但我必须找到一种方法来并行实现这一点。我不确定如何开始或做什么,因为我在并行编程领域还很陌生。
任何帮助将不胜感激。

最佳答案

最直接的方法是使用 Parallel Stream正如@Govinda Sakhare 很好地说明的那样。
但是,如果您想将此示例用作学习如何使用线程的一种方式,那么请按照以下步骤并行化您的代码:

  • 创建线程;
  • 将工作分配给线程,即每个线程将尝试找到一个比作为参数传递的值更大的值,但仅限于数组的一部分;
  • 找到该值的第一个线程将通知其他线程,以便每个线程都退出。

  • 要创建线程,我们可以执行以下操作:
    Thread[] threads = new Thread[total_threads];
    for(int t = 0; t < threads.length; t++) {
    threads[t] = new Thread(/** the parallel work **/);
    threads[t].start();
    }
    要将工作分配给线程,我们需要在线程之间拆分数组。最简单的方法实际上是拆分迭代而不是数组本身。线程接收整个数组,但只处理其中的一些位置,例如:
    private final static int NO_FOUND = -1;

    // Linear-search function to find the index of an element
    public static int findIndex(int[] arr, int t, int threadId, int total_threads){
    for (int i = threadId; i < arr.length; i += total_threads)
    if ( arr[i] > t)
    return i;
    return NO_FOUND;
    }
    我们为每个线程分配一个 ID范围从 0 to N-1 , 与 N是线程的总数。
    为了通知线程,我们可以在线程之间使用共享的原子整数,用于更新找到的值的索引。所以最终的代码如下所示:
    public class program {
    private final static int NO_FOUND = -1;

    // Linear-search function to find the index of an element
    public static int findIndex(int[] arr, int t, int threadId, int total_threads, AtomicInteger shared_index){
    for (int i = threadId; i < arr.length && shared_index.get() == -1; i += total_threads)
    if ( arr[i] > t)
    return i;
    return NO_FOUND;
    }

    public static void main(String[] args) throws InterruptedException {
    final int N = 8;
    int[] my_array = { 5, 4, 6, 1, 3, 2, 7, 8, 9 };
    int total_threads = 4;

    AtomicInteger shared_index = new AtomicInteger(-1);

    Thread[] threads = new Thread[total_threads];
    for(int t = 0; t < threads.length; t++) {
    final int thread_id = t;
    threads[t] = new Thread(() ->parallel_work(N, my_array, total_threads, shared_index, thread_id));
    threads[t].start();
    }

    for (Thread thread : threads)
    thread.join();

    System.out.println("Index of value bigger than " + N + " : " + shared_index.get());
    }

    private static void parallel_work(int n, int[] my_array, int total_threads, AtomicInteger shared_index, int thread_id) {
    int index_found = findIndex(my_array, n, thread_id, total_threads, shared_index);
    shared_index.compareAndExchange(NO_FOUND, index_found);
    }
    }
    输出:
    Index of value bigger than 8 : 8

    关于java - 如何编写一个函数来并行查找大于 N 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65858672/

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