3

HashSetさまざまなインデックス例外を含むものがたくさんあります。HashSet入力データに応じて、これらのハッシュセットを 1 つの大きなものに結合します。テスト目的で、アナログにも移植HashSetしました。List

  • HashSetandの唯一の目的は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

ご覧のとおり、すべての例外 (インデックス) は を使用して 1 つのリストにマージされます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

HashSetの代わりにSortedSetを使用してみてください。

于 2012-06-03T01:02:00.833 に答える
0

編集で少しパフォーマンスを上げたい場合は、if/else を交換してください。C# は、else 句の可能性が高いと想定しているため、そのツリーを最初に評価します! そこで数ミリ秒削る必要があります。しかし、それ以外にあなたを救う本当の方法がわかりません!

インポートできるソリューションを投稿していただければ、喜んでプレイして何ができるかを確認しますが、楽しみのためにすべてを入力するつもりはありません。;)

于 2012-06-02T19:52:17.833 に答える