3

我有很多HashSet包含不同的索引异常。HashSet我根据输入数据将这些哈希集组合成一个大的。出于测试目的,我还移植HashSetList类似物。

  • HashSetand的唯一目的List是从随机数生成中排除索引。

这就是我在 List 的情况下所做的:

list2 = new List<int>();
for (int d = 0; d < list1.Count; d++)
{
  if (dicCat4[30].ContainsKey(list1[d]))
  {
    list2.AddRange(dicCat4[30][list1[d]]);
  }
}

rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
while (list2.Contains(rand))
{
  rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
}
// action with random

如您所见,所有异常(索引)都使用AddRange(). 使用Contains()方法我们检查随机数是否在列表中。

HashSet 也可以进行同样的操作:

excludehash = new HashSet<int>();

for (int d = 0; d < list1.Count; d++)
{
  if (dicCat4[30].ContainsKey(list1[d]))
  {
    excludehash.UnionWith(dicCat3[30][list1[d]]);
  }
}

rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
while (excludehash.Contains(rand))
{
  rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);
}
// action with random

在这种情况下,AddRange()我不是使用UnionWith()方法来合并HashSet索引异常。

奇怪的是,经过数千次迭代 -方法的整体性能List更好!,但根据许多消息来源HashSet应该执行得更快。性能分析器显示,最大的性能消耗是 HashSet 的UnionWith()方法。

我只是好奇-有什么方法可以使HashSet解决方案更快地执行吗?(我突然想到了一个快速的想法:作为替代方案,我可以Contains(rand)在每个单独的哈希集上使用,因此跳过UnionWith()方法)

PS 哈希集和列表检索自:

static Dictionary<int, Dictionary<int, HashSet<int>>> dicCat3;
static Dictionary<int, Dictionary<int, List<int>>> dicCat4;

编辑:核心迭代解决方案

int inter = list1.Count;
int cco = 0;

while (inter != cco)
{
  cco = 0;

  rand = 2 * RandString.Next(0 / 2, (dicCat[30].Count) / 2);

  for (int d = 0; d < list1.Count; d++)
  {
    if (dicCat4[30].ContainsKey(list1[d]))
    {
      if (!dicCat3[30]][list1[d]].Contains(rand))
      {
        cco++;
      }
      else
      {
        break;
      }
   }
   else
   {
     cco++;
   }
 }
}
4

2 回答 2

1

尝试使用 SortedSet 而不是 HashSet。

于 2012-06-03T01:02:00.833 回答
0

如果您想在编辑中获得一点性能,请交换 if/else。C# 假设​​ else 子句更有可能,因此首先评估该树!你应该在那里剃掉几毫秒。但除此之外,我看不到真正的方法来拯救你任何东西!

如果您发布一个我可以导入的解决方案,那么我会很高兴地玩一玩,看看我能做什么,但我不会为了好玩而把它全部打出来!;)

于 2012-06-02T19:52:17.833 回答