用于存储排列的C#容器

时间:2011-05-01 12:48:38

标签: c# containers

我正在寻找一个不寻常的c#容器库供用于 调度搜索算法。搜索算法评估解决方案 通过不同的排列识别并寻找最佳解决方案 找。作为算法的一部分,它需要先记住 '访问'解决方案,以便它可以避免在循环循环中结束。因此,我 需要一个由排列索引的容器。排列是 一个大小为N的数组,在'随机'中保存值0到N-1 顺序。

容器只需要存储一个指示位置的布尔值 被访问过。它需要快速查找,它需要做 有效利用记忆。

我怀疑一棵树可能是最佳的...但只有在存在的情况下 库,因为这个问题也受到我实施它的可用时间的限制。

祝你好运

4 个答案:

答案 0 :(得分:1)

您可以使用哈希集快速查找permations。

创建一个类作为哈希集中的键,以及类的相等比较器,如:

publc class Permutation {

  private int[] _values;

  public Permutation(int[] values) {
    _values = values;
  }

  public class Comparer : IEqualityComparer<Permuation> {

    public int GetHashCode(Permuation x) {
      int code = 0;
      foreach (int value in x._values) {
        code = code * 251 + value;
      }
      return code;
    }

    public bool Equals(Permuation x, Permuation y) {
      if (x._values.Length != y._values.Length) return false;
      for (int i=0; i<x._values.Length; i++) {
        if (x._values[i] != y._values[i]) return false;
      }
      return true;
    }

  }

}

然后你可以创建一个使用类作为键的哈希集,并且它是评估相等性的比较器:

var permutations = new HashSet<Permutation>(new Permutation.Comparer());

现在,您可以创建排列对象并放入集合中,并对其进行测试:

permuations.Add(new Permuation(new int[]{1,2,3}));

Permutation lookingFor = new Permutation(new int[]{1,2,3});
bool exists = permutations.Contains(lookgFor); // returns true

Permutation lookingFor = new Permutation(new int[]{1,3,2});
bool exists = permutations.Contains(lookgFor); // returns false

答案 1 :(得分:1)

总是需要权衡利弊。这是速度还是记忆。排列可以按here所述转换为索引,但成本很高。另一方面,您不需要转换它们。根据你所写的内容,我知道你的算法可以处理排列,因此它“知道”它们。在这种情况下,它可以按原样存储它们(访问)(例如,在列表或散列集中)。在这种情况下,您不会花费额外的时间将排列“压缩”到索引中,但是您需要确保有足够的内存。

另一项值得做的心理练习是调整你的算法需要存储“访问”状态的多少种不同的排列。这样您就可以更真实地决定是否需要节省内存,或者可以选择性能更快的选项。

还有一段时间以前,我搜索了“c#permutations”,并且能够找到一些组合库,无论它们是否提供你想要的或者我不知道的,我建议你看看它们,看看它们是否可以适合你。

答案 2 :(得分:0)

我认为hash table可能就是你要找的东西。查找时间是不变的,向容器添加新元素的时间也是不变的(只要你没有“溢出”它,那么增加容器容量需要线性时间。) / p>

答案 3 :(得分:0)

只需我的两分钱:have a look at this code

给定的链接包含用树实现的置换容器,这意味着快速查找和公平的内存使用。

使用GetPermutations()可能会改进Stack<T>方法,但这只是给读者留下的练习:D