小编bro*_*ear的帖子

将方法参数的所有权传递给“尝试使用资源”块

我对Java的“尝试资源”功能有疑问。大多数示例似乎都遵循在try语句中声明和实例化资源的模型,如下所示:

try (BufferedReader in =
        new BufferedReader(new InputStreamReader(socket.getInputStream())); ) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我需要将可关闭资源传递给方法,而我想知道是否有可能或建议将作为方法参数传递的可关闭资源的所有权传递给try块。例如:

void handleConnection(Socket clientSocket) {
    try (Socket socket = clientSocket;
         BufferedReader in =
             new BufferedReader(new InputStreamReader(socket.getInputStream())); ) {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

这样可以正确清理clientSocket实例吗?我希望避免在代码中显式关闭clientSocket实例。

java try-with-resources

5
推荐指数
1
解决办法
648
查看次数

你能在 O(n/p) 时间内进行并行计数排序吗?

是否可以并行进行计数排序并实现 O(n/p) 运行时?

举个例子,我们有一个包含数百万个元素的数组,范围从 1 到 10。合并排序的运行时间不会超过 O(nlogn) 时间。应用于此问题的计数排序将在 O(n) 时间内运行。并行化计数排序可能很有趣。如果我们为每个处理器分配一个包含 n/p 个元素的子数组,并且每个处理器都有自己的大小为 9 的计数数组,那么累积元素计数的初始步骤应该花费 O(n/p) 时间。将所有计数数组合并为单个数组应该花费 O(p) 时间,因为您只迭代 p 个计数数组,每个数组的大小都是恒定的。

我一直无法完全思考计数排序的最后一步,其中元素按顺序排列。如果计数数组的元素是原子的,您可以将原始数组的 n/p 部分分配给各个处理器并实现一些并行化,但计数数组的各个元素会出现争用,这可能会大大减少并行化。如果输入数组都是 10,则所有处理器都将在计数数组的第 9 个元素上进行序列化,从而将算法效率降低到 O(n)。

您可以将 count 数组的子数组分配给 p 个处理器中的每一个,然后返回 O(n/p) 运行时,但前提是元素分布相当均匀。而且,在我们的示例中,您将被限制为 10 个处理器。如果元素分布不均,一个或多个处理器可能会承担更大比例的工作。例如,如果输入数组中的一半元素为 10,则一个处理器将不得不单步执行该数组的一半。最坏的情况是,数组全部为 10,单个处理器必须遍历整个数组,将运行时间降低到 O(n)。

也许您可以在多个处理器之间划分计数数组的各个元素。例如,如果输入数组中有 50 个 10,则计数数组的元素 9 将反映这一点。您可以让 5 个处理器将 10 个 10 写入输出数组中的正确位置。如果 count 数组的每个索引位置的元素少于 p 个,这又会转化为 O(n) 运行时,但它避免了元素值分布不均匀的问题。

是否可以在 O(n/p) 时间内进行计数排序?

sorting algorithm parallel-processing counting-sort

2
推荐指数
1
解决办法
2373
查看次数