English 中文(简体)
我需要一个线程程序的想法
原标题:I need an idea for a program with threads

This might sound funny but I got a homework and I can`t make any sense of it. The statement sounds like this: "Find the 10 largest numbers in an array of 100.000 randomly generated integers. You will use threads to compare 2 numbers. A daemon thread will print at regular intervals the progress and the number of unchecked integers left."

我知道在论坛上就家庭作业寻求帮助是不合适的,但我真的很沮丧。。。。我只是想不出为什么以及如何使用线程来处理数字比较。。。。。尤其是当它是大约100.000个整数时。即使我用一个简单的方法浏览列表。例如,使用max变量并打印出所有值,最多也只需要150毫秒(我试过了)!!

你至少能给我一个开始的想法吗???

很抱歉浪费了你的时间!

--继续--

正如我在回复中所说,如果我只需要找到1个元素(最大的),那么将数组压缩成X个块(线程数)将是一个好主意,但因为我需要找到10个最大的元素,假设一个线程在其正在处理的块中找到其最大值,并丢弃其余的,也许其中一个被丢弃的元素实际上会比其他块中的其余元素大。这就是为什么我认为这不会是一个好结果。

请随意争论我的观点!

问题回答

每个线程可以遍历100000/X个数字(其中X是线程数),并跟踪该线程中的前10个数字。然后,当所有线程都完成后,您可以合并结果。

将10万个数字的列表分成一定大小的批次。然后生成一个线程来对每个批进行检查。然后合并结果。

这其中的好处是,这样的解决方案将很容易扩展到庞大的数字列表中。

对于这个问题,您需要使用线程来解决的原因并不是因为没有线程就无法解决它,而是因为它是可线程化问题的一个很好的例子(即,可以并行化);这是一个很好的教学示例,因为业务逻辑非常简单,所以您可以集中精力处理线程工作。

无论你如何切片,在未排序的数组中找到最大值都意味着线性搜索。您可以简单地在可用线程的数量中划分数据,然后在线程产生的值中找到最大数量。

好吧,你想把整数列表放在线程安全队列中。每个线程通过从顶部弹出来处理数字。

这与您已经编写的算法几乎相同,但关键是线程安全队列,它可以让线程从中提取数据,而不会相互碰撞数据。

当每个线程完成时,主线程应该获取结果,并在线程之间找到最大的数字。


EDIT
If each thread gets the 10 largest numbers in its chunk, then it doesn t matter what is in the rest of the array, since the other threads will find the largest in their own chunk. for example:
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没有比块1大的数字并不重要。





相关问题
Silverlight, Updating the UI during processing

I have a simple silverlight multifile upload application, and i want to provide the user with some feedback, right now its only in a test phase and i dont have the webservice. Somehow i cant get the ...

Is reading from an XmlDocument object thread safe?

I was wondering if i could safely read from an XmlDocument object using SelectNodes() and SelectSingleNode() from multiple threads with no problems. MSDN says that they are not guaranteed to be ...

Terminating a thread gracefully not using TerminateThread()

My application creates a thread and that runs in the background all the time. I can only terminate the thread manually, not from within the thread callback function. At the moment I am using ...

热门标签