这可能听起来很有趣,但我做了一个功课,我无法理解它。 声明听起来像这样: “找到100个随机生成的整数数组中的10个最大数字。您将使用线程来比较2个数字。守护程序线程将定期打印进度和未检查整数的数量。”
我知道s not appropriate to ask for help on the forum regarding a homework but I am really REALLY frustrated .... I just can
弄清楚为什么以及如何使用线程来处理数字比较......特别是当它大约有100,000个整数时。即使我通过简单的列表使用max变量并打印出所有值,它只需要大约150毫秒,最多(我试过)!
你能不能给我一个开始的想法?
抱歉浪费你的时间!
- 续 -
正如我在回复中所说的那样,如果我必须找到只有1个元素(最大的)但是因为我需要找到10个最大的元素,将数组制成X块(线程数)是个好主意元素,假设一个线程在它正在处理的块中找到它的最大值,并丢弃其余的,可能其中一个丢弃的实际上比其他块中的其余元素大。这就是为什么我认为这不会有好结果。
随意争辩我的观点!
答案 0 :(得分:2)
每个线程可以迭代100,000个/ X数字(其中X是线程数)并跟踪该线程中的前10个数字。然后,当所有线程完成后,您可以合并结果。
答案 1 :(得分:2)
将100k数字列表分成几个批量的批次。然后生成一个线程来检查每个批次。然后合并结果。
奖金的一部分是,这样的解决方案很容易扩展到庞大的数字列表。
答案 2 :(得分:1)
你需要使用线程解决这个问题的原因并不是因为你没有线程就无法解决它,但这是一个可线程化问题的好例子(即可以并行化);这是一个很好的教学示例,因为业务逻辑非常简单,因此您可以专注于线程化工作。
答案 3 :(得分:1)
无论你如何切片,在未排序的数组中找到最大值意味着线性搜索。您可以简单地在可用线程数量之间对数据进行分区,然后在线程提供的值中找到最大数量。
答案 4 :(得分:0)
好吧,你想把整数列表放在一个线程安全队列中。每个线程通过弹出顶部来处理数字。
这是你已编写的几乎相同的算法,但它的关键是线程安全队列,它允许线程从中拉出数据而不会破坏彼此的数据。
当每个线程完成时,主线程应该获取结果并找到线程之间的最大数字。
<小时/> 编辑
Array : numbers between 1 and 99
Chunk 1 : 99 98 97 ... 50
Chunk 2 : 49 48 47 ... 1
Thread one result: 99 98 97 96 95 94 93 92 91 90
Thread two result: 49 48 47 46 45 44 43 42 41 40
Merged result: 99 98 97 96 95 94 93 92 91 90 49 48 47 46 45 44 43 42 41 40
Top 10 from merge: 99 98 97 96 95 94 93 92 91 90
看到块2没有大于块数的数字并不重要。