【问题标题】:c# fastest way to get a subset of integer listc#获取整数列表子集的最快方法
【发布时间】:2013-05-09 16:49:36
【问题描述】:

我得到 5 个列表,我需要所有列表的子集。

  • I) 200.000 个整数值
  • II) 30.000 个整数值
  • III) 10.000 个整数值
  • IV) 200 个整数值

在数学方面 A n B n C n D. 我需要 1.000 个并发用户。

  • 用 c# 执行此操作的最快方法是什么?
  • 我可以用一个 2 mhz CPU 执行多少个并发操作? 20 亿次循环速度

【问题讨论】:

  • 使用一个 CPU,只能执行一个 并发操作。
  • @Nolonar 超线程呢?另请注意,CPU 在实际并行化管道中的工作方面非常聪明。实际上很难确定并发程度,具体取决于您使用的定义。它只是将庄园中的任务并行化,这样只能在外部观察到顺序。
  • 请澄清:2MHz 还是 2GHz?此外,在多核 CPU 中,您可以设置并发(请参阅任务并行库:msdn.microsoft.com/en-us/library/dd460717.aspx
  • @Servy 如果我没记错的话,超线程只是将第二个线程推送到管道。两个线程稍微延迟运行,但不是并发
  • @Nolonar 同样,这在某种程度上取决于您对并发的定义。 CPU 可以从内存中获取一个操作的参数,同时同时将两个值加在一起作为另一个操作。并发永远无法从外部观察到,但它确实存在。使用超线程,您甚至可以在外部观察到并发性。我不会断言我是该主题的专家,我只是说“并发”有一个模糊的定义需要澄清。

标签: c# list math mathematical-optimization


【解决方案1】:

处理查找多个集合的交集的最快方法是与语言无关:创建一个HashSet<int>,使用最短列表中的数据对其进行初始化,然后在其余列表上依次调用IntersectWith。您需要从最短的列表开始,因为操作的复杂度是O(n+m),其中nHashSet<int> 中的项目数,m 是另一个列表中的项目数。由于IntersectWith会被调用四次,而初始HashSet<int>的设置复杂度为O(n),所以整体复杂度为

O( n + n+m1 + n+m2 + n+m3 + n+m4)
// ^    ^      ^      ^      ^
// |    |      |      |      |
// |   Intersecting with lists 2..5
// |
// Setting up the initial HashSet<int>

由于总数为O(5*n+m1+m2+m3+m4),因此最好的方法是选择最短的列表作为初始设置。

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多